microchipマイクロサービス

Overleaf Server CE および Overleaf Pro インスタンスをデプロイおよび管理する推奨方法は、Toolkit の使用です。

Toolkit は、必要なマイクロサービスのオーケストレーションを抽象化するカスタムスクリプトを使用して Overleaf インスタンスの作成を簡素化します。バンドルされた初期化スクリプトを実行し、永続ストレージのパスなどいくつかの設定オプションを指定するだけで、Toolkit は Overleaf Server CE または Pro インスタンスを構成するマイクロサービスのプロビジョニングと接続を処理します。

これにより、オンプレミスインスタンスを特徴づけるユーザーエクスペリエンスのカスタマイズや特定機能の実装に専念できます。Toolkit は裏で複雑さをすべて処理し、Overleaf インスタンスの簡略化されたデプロイを可能にします。

circle-info

歴史的な理由から、メインの Overleaf コンテナは sharelatexと呼ばれており、次に基づいています: sharelatex/sharelatex Docker イメージ。これは技術が ShareLaTeX のコードベースに基づいており、そのコードベースが Overleaf に統合されたためです。詳しくは このブログ記事arrow-up-rightarrow-up-right を参照してください。将来的には、Overleaf の命名規則に合わせて名前が変更される予定です。

アーキテクチャ

Overleaf コンテナ内部では、ソフトウェアは一連のマイクロサービスとして動作し、次によって管理されます: runit。コンテナ内部の興味深いファイルのいくつかは次のとおりです:

  • /etc/service/:マイクロサービスの初期化ファイル。

  • /var/log/overleaf/:各マイクロサービスのログ。

  • /overleaf/services/:さまざまなマイクロサービスのコード。

  • /var/lib/overleaf/:永続データのマウントポイント(ホスト上の OVERLEAF_DATA_PATH で示されたディレクトリに対応)。

MongoDB と Redis のコンテナ

Overleaf は MongoDB と Redis の 2 つの外部データベースに依存します。デフォルトでは、Toolkit はこれら各データベース用のコンテナを、Overleaf コンテナに加えてプロビジョニングし、合計で 3 つの Docker コンテナを作成します。

circle-info

既存の MongoDB または Redis インスタンスに接続したい場合は、適切な設定を overleaf.rc 設定ファイルに記載することで接続できます。

エディタとコンパイルプロセス

このセクションは、ドキュメントの扱いとコンパイルプロセスの概要を提供します。

circle-info

このページは、Overleaf Pro のみで利用可能な Sandboxed Compiles を用いたコンパイルプロセスを説明します。Server CE ではコンパイルプロセスは単純なサブプロセスを使用します — ここで コンテナ内でシェルを起動します を参照している項目は単一の項目に置き換えてください サブプロセスでコンパイルを実行する.

構成要素 / アクター:

  • ユーザー — アプリケーションのユーザー

  • エディタ — ブラウザ上で動作するクライアントアプリケーション

  • clsi — PDF をコンパイルするために使用されるマイクロサービス

  • document-updater — ドキュメントの更新を処理するために使用されるマイクロサービス

  • filestore — バイナリファイルを扱うマイクロサービス

  • real-time — WebSocket を扱うために使用されるマイクロサービス

  • web — API リクエストを処理する(あまり小さくない)マイクロサービス

Redis キャッシング

  • ユーザー:エディタページを読み込む

  • エディタ:WebSocket を開く

  • エディタ:WebSocket を介してドキュメントを開くリクエストを送信する

    • real-time -> document-updater:ドキュメントが MongoDB から Redis にロードされる

  • エディタ:WebSocket を介してドキュメント更新を送信する

    • real-time -> document-updater:ドキュメントが Redis で更新される

  • エディタ:より多くのコンパイル要求を送信する

    • 最後のフラッシュから 5 分が経過した後(ドキュメント毎):

      • document-updater:ドキュメントを Redis から MongoDB にフラッシュする

  • エディタ:さらに更新を送信する

    • 100 回の更新ごと(ドキュメント毎):

      • document-updater:ドキュメント履歴を Redis から MongoDB にフラッシュする

  • ユーザー:エディタを離れる / ブラウザタブを閉じる

    • 5 分後

      • real-time:他の共同編集者がいるかをチェックし、いなければ:

        • real-time -> document-updater:ドキュメントを Redis から MongoDB にフラッシュする

MongoDB から Redis への読み込み

  • document-updater -> web -> docstore:MongoDB から読み込む

Redis から MongoDB へのフラッシュ

  • document-updater -> web -> docstore:MongoDB に書き込む

コンパイル — 「フル」同期モード

  • エディタ:sync-mode を「full」に設定してコンパイル要求を送信する

  • web -> document-updater:ドキュメントが Redis から MongoDB にフラッシュされる可能性がある

  • web -> docstore:すべてのドキュメントが MongoDB からダウンロードされる

  • web -> clsi:コンパイル要求が次に送信される clsi、含まれるもの:

    • sync-mode

    • ファイルツリーのハッシュ -> 「プロジェクト状態」

    • 内容を含むすべてのドキュメント -> 7MB のリクエストボディ制限の対象

    • 個別ダウンロード用のバイナリファイル URL

  • clsi:sync-mode と「プロジェクト状態」でオンディスクの状態を確認する

    • これはフル同期なので、以前のオンディスク状態は無視できる

  • clsi:コンパイルディレクトリをクリーンアップする

  • clsi:すべてのドキュメントを書き込む(コンパイルディレクトリに)

  • clsi:すべてのバイナリファイルを書き込む(コンパイルディレクトリに)

    • clsi プロジェクトごとのローカルキャッシュからファイルをコピーする

    • キャッシュミス時:

      • clsi -> filestore:ファイルをダウンロードする

  • clsi:「プロジェクト状態」を書き込む

  • clsi:望ましい構成で Docker コンテナが存在することを保証する

    • コンテナ作成オプション、texlive バージョンを含む

    • ハッシュオプション

    • コンテナ名: project-<project-id>-<user-id>-<hash>

  • clsi:コンテナを起動し stdout/stderr をメモリにストリーム -> 上限 2MB

  • clsi:停止したコンテナを残す -> 24 時間後にクリーンアップされる

  • clsi:stdout/stderr をディスクに書き込む

  • clsi:出力ファイルを一意の出力ディレクトリにコピーする

    • build-id は 8 バイトのランダム値とミリ秒精度のタイムスタンプで構成される

    • 最後の 3 つ(匿名) / 最後の 1 つ(ログインユーザー)以外のビルドフォルダをすべて削除する

  • clsi:コンパイルが失敗 / タイムアウトした

    • コンパイルキャッシュを削除する — 部分的なファイルや破損したキャッシュがある可能性があるため

  • エディタ:output.log と output.pdf をダウンロードする

コンパイル — 「インクリメンタル」同期モード

  • エディタ:sync-mode を「incremental」に設定してコンパイル要求を送信する

  • web -> document-updater:Redis からドキュメントを取得する

    • 「プロジェクト状態」ハッシュも Redis に保存される

    • web ファイルツリーのハッシュをに送信する document-updater 以下はOverleaf向けに特別に最適化された一連のTeX Liveイメージで、 document-updater 不一致の場合、インクリメンタルコンパイルをフルコンパイルに切り替えることができる

      • エディタが「full」コンパイルを要求したときのコンパイルプロセスを参照してください

  • web -> clsi:コンパイル要求が次に送信される clsi、含まれるもの:

    • sync-mode

    • ファイルツリーのハッシュ -> 「プロジェクト状態」

    • Redis からのすべてのドキュメントとその内容 -> 7MB のリクエストボディ制限の対象

    • バイナリファイルは無し

  • clsi:sync-mode と「プロジェクト状態」でオンディスクの状態を確認する

    • これはインクリメンタル同期なので、「プロジェクト状態」は一致する必要がある

    • 不一致の場合:409 で応答し、web に「full」同期で再試行させる

      • エディタが「full」コンパイルを要求したときのコンパイルプロセスを参照してください

  • clsi:更新されたドキュメントを書き込む(コンパイルディレクトリに)

  • clsi:望ましい構成で Docker コンテナが存在することを保証する

    • コンテナ作成オプション、texlive バージョンを含む

    • ハッシュオプション

    • コンテナ名: project-<project-id>-<user-id>-<hash>

  • clsi:コンテナを起動し stdout/stderr をメモリにストリーム -> 上限 2MB

  • clsi:停止したコンテナを残す -> 24 時間後にクリーンアップされる

  • clsi:stdout/stderr をディスクに書き込む

  • clsi:出力ファイルを一意の出力ディレクトリにコピーする

    • build-id は 8 バイトのランダム値とミリ秒精度のタイムスタンプで構成される

    • 最後の 3 つ(匿名) / 最後の 1 つ(ログインユーザー)以外のビルドフォルダをすべて削除する

  • clsi:コンパイルが失敗 / タイムアウトした

    • コンパイルキャッシュを削除する — 部分的なファイルや破損したキャッシュがある可能性があるため

  • エディタ:output.log と output.pdf をダウンロードする

コンパイル — モード間の切り替え

  • エディタ:コンパイル失敗を観測した場合、次のコンパイルは「フル」コンパイルになる

  • エディタ:コンパイル成功を観測した場合、次のコンパイルは「インクリメンタル」コンパイルになる

最終更新