はじめに
TROCCOのSelf-Hosted Runnerは、TROCCOのデータ転送をユーザー管理の処理環境で実行できる機能です。SaaSとしてのTROCCOの使いやすさを保ちつつ、実データを閉域内に留めることでセキュアなデータ転送を実現することができます。
Docker(Linux環境)があれば利用できるので、クラウドのContainer as a Serviceを使うことも多くあるでしょうが、要件によってはサーバ、VMでの利用も想定されます。今回は、シンプルな構成としてdocker-composeの構成例をご紹介します。
こんな方におすすめ
- docker-composeを利用したTROCCO Self-Hosted Runnerの運用を検討したい方
- Windows PCのDocker Desktop(WSL2)が利用可能な環境で検証していますが、Linux環境のDockerが使える環境であれば同じように利用できると思われます
- Docker Engineおよびdocker-composeが利用可能であることが前提です
docker-composeとは
docker-composeとは、複数のコンテナで構成されるアプリケーションを YAML ファイル(docker-compose.yaml) に定義し、まとめて起動・停止・管理できるツールです。
Self-Hosted Runnerはdocker runで個別のコンテナを立てることでも利用できますが、docker-composeを利用することでコンテナの停止時に自動で再起動したり、リソースの違うRunnerをまとめて立てたり、Runnerのログをファイルに書き出ししたりなどすることができます。
docker-compose.yamlファイルが存在するディレクトリをカレントディレクトリとして、
-
docker-compose up -dでコンテナを起動 -
docker-compose down -vでコンテナを停止
できます。
docker-composeの構成例
それほど量は多くないので、まずコードをまとめて掲載します。ディレクトリ構成は以下の通りです。
.
├── .env
├── docker-compose.yaml
└── fluent.conf
.env
docker-compose.yamlファイルで利用する変数を記載します。
TROCCO_IMAGE_URL=<TROCCO_SELF_HOSTED_RUNNER_IMAGE_URL>
TROCCO_REGISTRATION_TOKEN_NORMAL=<YOUR_REGISTRAION_TOKEN>
TROCCO_REGISTRATION_TOKEN_ENHANCED=<YOUR_REGISTRAION_TOKEN>
docker-compose.yaml
インバウンド通信を受け付けない、メモリが異なるRunnerを複数と、Runnerのログをファイルに書き出しするためのfluentdのコンテナを設定します。
services:
fluentd:
image: fluent/fluentd:latest
volumes:
- ./fluent.conf:/fluentd/etc/fluent.conf
- ./log:/fluentd/log
ports:
- "24224:24224"
logging:
driver: "local"
options:
max-size: "50m"
max-file: "10"
networks:
- outbound_only
trocco-self-hosted-runner-normal:
image: ${TROCCO_IMAGE_URL}:latest
mem_limit: 2G
cpus: 2
restart: always
environment:
- TROCCO_REGISTRATION_TOKEN=${TROCCO_REGISTRATION_TOKEN_NORMAL}
- TROCCO_PREVIEW_SEND=true
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "trocco-self-hosted-runner-normal.log"
fluentd-async: "true"
networks:
- outbound_only
depends_on:
- fluentd
trocco-self-hosted-runner-enhanced:
image: ${TROCCO_IMAGE_URL}:latest
mem_limit: 4G
cpus: 2
restart: always
environment:
- TROCCO_REGISTRATION_TOKEN=${TROCCO_REGISTRATION_TOKEN_ENHANCED}
- TROCCO_PREVIEW_SEND=true
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "trocco-self-hosted-runner-enhanced.log"
fluentd-async: "true"
networks:
- outbound_only
depends_on:
- fluentd
networks:
outbound_only:
driver: bridge
fluent.conf
fluentdの設定を記載します。
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match trocco-self-hosted-runner-normal.**>
@type file
path /fluentd/log/self-hosted-runner-normal/
time_slice_format %Y%m%d
append true
<buffer time>
@type file
path /fluentd/log_buffer/self-hosted-runner-normal
timekey_use_utc true # UTCを使用
timekey 1d # 1日単位でファイルを分割
flush_mode interval # インターバルモードを明示的に指定
flush_interval 1s # 1秒ごとにバッファからログを書き込み
</buffer>
</match>
<match trocco-self-hosted-runner-enhanced.**>
@type file
path /fluentd/log/self-hosted-runner-enhanced/
time_slice_format %Y%m%d
append true
<buffer time>
@type file
path /fluentd/log_buffer/self-hosted-runner-enhanced
timekey_use_utc true # UTCを使用
timekey 1d # 1日単位でファイルを分割
flush_mode interval # インターバルモードを明示的に指定
flush_interval 1s # 1秒ごとにバッファからログを書き込み
</buffer>
</match>
ポイントの解説
上記のコードに関して、ポイントは以下の通りです。
Runnerの設定
以下のシンプルなコードでRunnerの設定を定義できます。メモリやCPUは実行するワークロードに応じて調整してください。
また、転送の内容によっては強めのリソースが必要になるかもしれませんが、その場合はSelf-Hosted Runner Clusterを分けて、それに対応したRegistration TokenをRunnerに登録することで、転送設定ごとのRunnerの使い分けができます。
trocco-self-hosted-runner-normal:
image: ${TROCCO_IMAGE_URL}
mem_limit: 2G
cpus: 2
restart: always
environment:
- TROCCO_REGISTRATION_TOKEN=${TROCCO_REGISTRATION_TOKEN_NORMAL}
- TROCCO_PREVIEW_SEND=true
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "trocco-self-hosted-runner-normal.log"
fluentd-async: "true"
networks:
- outbound_only
depends_on:
- fluentd
ログの連携
コンテナの稼働の確認や、何かエラーが起きたときのデバッグをするために、ログを適切に取り扱うことは重要です。今回は、簡単に設定できるものとしてコンテナでfluentdを動かして、Runnerのログをそちらに向けて、fluentdからファイルとしてログをエクスポートするようにしています。
fluentd:
image: fluent/fluentd:latest
volumes:
- ./fluent.conf:/fluentd/etc/fluent.conf
- ./log:/fluentd/log
ports:
- "24224:24224"
logging:
driver: "local"
options:
max-size: "50m"
max-file: "10"
networks:
- outbound_only
今の設定のままで、以下のような形でログがローカルで取扱えるようになります。
.
├── log
│ ├── self-hosted-runner-enhanced
│ │ └── .20251008.log
│ └── self-hosted-runner-normal
│ └── .20251008.log
├── .env
├── .gitignore
├── docker-compose.yaml
└── fluent.conf
なお、この形はあくまでサンプルになるので、実運用の際には要件に合わせてログの設計をしてください。
ローカルで保持する場合は、
- 保持したファイルをどのように保管/利用するのか
- ファイルの保存期間をどうするか(今の設定だと無限に膨らんでいきます)
などといったことが検討観点になります。また、さっと作れたのでfluentdを利用していますが、fluent-bitの方が軽量で望ましいとのことです。
また、そもそもローカルで保持するのかというのも論点です。クラウドへの連携もできるので、運用を考えるとそちらの方を取ることも有力な選択肢になるでしょう。
ちなみに、TROCCOのジョブという意味ではSaaSのTROCCOにもログは連携されていきますので、最低限そちらで確認する形でも大丈夫です。ただし、その場合はコンテナ側に問題があるときのログが確認できないことにはご留意ください。
今回やっていないこと
上記とは別の観点として、
- docker-composeのプロセス自体の死活監視
- 稼働環境としてのサーバ/VMの監視
- サーバ/VMでのネットワークの監視
といったことも、場合によっては必要になってきます。コンテナ自体の管理と、コンテナの外部環境の管理の両側面から、要件に合わせて必要な対応をしてください。
おわりに
構成自体はシンプルなものですが、Runnerの仕組み自体がインバウンド通信を受けずにRunner主導で動くもののため、十分に稼働するものになります。コンテナ自体の起動/稼働数の変更/停止などを柔軟にやろうとするとクラウドサービスが望ましいかもしれませんが、構成の一つとしてご活用ください。
