サービス
どのツールを使うべきか迷う場合は、rdc vs renet を参照してください。
このページでは、コンテナ化されたサービスのデプロイと管理方法について説明します:Rediaccfile、サービスネットワーキング、開始/停止、一括操作、自動開始。
Rediaccfile
Rediaccfileは、サービスの準備、開始、停止の方法を定義するBashスクリプトです。ファイル名はRediaccfileまたはrediaccfile(大文字小文字を区別しない)で、リポジトリのマウントされたファイルシステム内に配置する必要があります。
Rediaccfileは2つの場所で検出されます:
- リポジトリマウントパスのルート
- マウントパスの第1レベルサブディレクトリ(再帰的ではありません)
隠しディレクトリ(.で始まる名前)はスキップされます。
ライフサイクル関数
Rediaccfileは最大3つの関数を含みます:
| 関数 | 実行タイミング | 目的 | エラー動作 |
|---|---|---|---|
prep() | up()の前 | 依存関係のインストール、イメージのプル、マイグレーションの実行 | 即時失敗 — いずれかのprep()が失敗すると、プロセス全体が即座に停止 |
up() | すべてのprep()完了後 | サービスの開始(例:docker compose up -d) | ルートの失敗はクリティカル(すべて停止)。サブディレクトリの失敗は非クリティカル(ログに記録し、次に進む) |
down() | 停止時 | サービスの停止(例:docker compose down) | ベストエフォート — 失敗はログに記録されますが、すべてのRediaccfileが常に試行 |
3つの関数はすべてオプションです。関数が定義されていない場合、サイレントにスキップされます。
実行順序
- 開始(
up): ルートRediaccfileが最初、次にサブディレクトリがアルファベット順(AからZ)。 - 停止(
down): サブディレクトリが逆アルファベット順(ZからA)、最後にルート。
環境変数
Rediaccfile関数の実行時、以下の環境変数が利用可能です:
| 変数 | 説明 | 例 |
|---|---|---|
REPOSITORY_PATH | リポジトリのマウントパス | /mnt/rediacc/repos/abc123 |
REPOSITORY_NAME | リポジトリGUID | a1b2c3d4-e5f6-... |
REPOSITORY_NETWORK_ID | ネットワークID(整数) | 2816 |
DOCKER_HOST | このリポジトリの隔離デーモン用Dockerソケット | unix:///var/run/rediacc/docker-2816.sock |
{SERVICE}_IP | .rediacc.jsonで定義された各サービスのループバックIP | POSTGRES_IP=127.0.11.2 |
{SERVICE}_IP変数は.rediacc.jsonから自動生成されます。命名規則では、サービス名を大文字に変換し、ハイフンをアンダースコアに置き換え、_IPを付加します。例えば、listmonk-appはLISTMONK_APP_IPになります。
警告:Rediaccfile内で
sudo dockerを使用しないでください。sudoコマンドは環境変数をリセットするため、DOCKER_HOSTが失われ、Dockerコマンドがリポジトリの隔離デーモンではなくシステムデーモンを対象にします。これによりコンテナの隔離が壊れ、ポート競合が発生する可能性があります。Rediaccは-Eなしのsudo dockerを検出すると実行をブロックします。Rediaccfile内では
renet composeを使用してください。DOCKER_HOSTを自動的に処理し、ルート検出用のネットワーキングラベルを注入し、サービスネットワーキングを設定します。リバースプロキシ経由でサービスを公開する方法の詳細については、ネットワーキングを参照してください。Dockerを直接呼び出す場合は、sudoなしでdockerを使用してください。Rediaccfile関数は既に十分な権限で実行されます。sudoを使用する必要がある場合は、環境変数を保持するためにsudo -E dockerを使用してください。
例
#!/bin/bash
prep() {
echo "Pulling latest images..."
renet compose -- pull
}
up() {
echo "Starting services..."
renet compose -- up -d
}
down() {
echo "Stopping services..."
renet compose -- down
}
DOCKER_HOSTが自動的に設定されるためdocker composeも動作しますが、リバースプロキシのルート検出に必要なrediacc.*ラベルを追加で注入するためrenet composeが推奨されます。詳細についてはネットワーキングを参照してください。
マルチサービスレイアウト
複数の独立したサービスグループを持つプロジェクトでは、サブディレクトリを使用します:
/mnt/rediacc/repos/my-app/
├── Rediaccfile # ルート:共有セットアップ
├── docker-compose.yml
├── database/
│ ├── Rediaccfile # データベースサービス
│ └── docker-compose.yml
├── backend/
│ ├── Rediaccfile # APIサーバー
│ └── docker-compose.yml
└── monitoring/
├── Rediaccfile # Prometheus、Grafanaなど
└── docker-compose.yml
upの実行順序:ルート、次にbackend、database、monitoring(A-Z)。
downの実行順序:monitoring、database、backend、最後にルート(Z-A)。
サービスネットワーキング(.rediacc.json)
各リポジトリは127.x.x.xループバック範囲内の/26サブネット(64個のIP)を取得します。サービスは一意のループバックIPにバインドされるため、競合なく同じポートで実行できます。
.rediacc.jsonファイル
サービス名をスロット番号にマッピングします。各スロットは、リポジトリのサブネット内の一意のIPアドレスに対応します。
{
"services": {
"api": {"slot": 0},
"postgres": {"slot": 1},
"redis": {"slot": 2}
}
}
Docker Composeからの自動生成
.rediacc.jsonを手動で作成する必要はありません。rdc repo upを実行すると、Rediaccは自動的に以下を行います:
- Rediaccfileを含むすべてのディレクトリでcomposeファイル(
docker-compose.yml、docker-compose.yaml、compose.yml、またはcompose.yaml)をスキャン services:セクションからサービス名を抽出- 新しいサービスに次の利用可能なスロットを割り当て
- 結果を
{repository}/.rediacc.jsonに保存
IP計算
サービスのIPは、リポジトリのネットワークIDとサービスのスロットから計算されます。ネットワークIDは127.x.y.zループバックアドレスの第2、第3、第4オクテットに分割されます。各サービスにはネットワークIDにslot + 2のオフセットが加算されます(オフセット0と1はネットワークアドレスとゲートウェイ用に予約)。
例:ネットワークID 2816(0x0B00)の場合、ベースアドレスは127.0.11.0:
| サービス | スロット | IPアドレス |
|---|---|---|
| api | 0 | 127.0.11.2 |
| postgres | 1 | 127.0.11.3 |
| redis | 2 | 127.0.11.4 |
各リポジトリは最大61個のサービス(スロット0から60)をサポートします。
Docker ComposeでのサービスIPの使用
各リポジトリは隔離されたDockerデーモンを実行するため、サービスはnetwork_mode: hostを使用し、割り当てられたループバックIPにバインドします:
services:
postgres:
image: postgres:16
network_mode: host
environment:
PGDATA: /var/lib/postgresql/data
POSTGRES_PASSWORD: secret
command: -c listen_addresses=${POSTGRES_IP} -c port=5432
api:
image: my-api:latest
network_mode: host
environment:
DATABASE_URL: postgresql://postgres:secret@${POSTGRES_IP}:5432/mydb
LISTEN_ADDR: ${API_IP}:8080
サービスの開始
リポジトリをマウントし、すべてのサービスを開始します:
rdc repo up my-app -m server-1 --mount
| オプション | 説明 |
|---|---|
--mount | まだマウントされていない場合、先にリポジトリをマウント |
--prep-only | prep()関数のみを実行し、up()をスキップ |
実行シーケンスは以下の通りです:
- LUKS暗号化リポジトリをマウント(
--mountの場合) - 隔離Dockerデーモンを起動
- composeファイルから
.rediacc.jsonを自動生成 - すべてのRediaccfileで
prep()を実行(A-Z順、即時失敗) - すべてのRediaccfileで
up()を実行(A-Z順)
サービスの停止
rdc repo down my-app -m server-1
| オプション | 説明 |
|---|---|
--unmount | 停止後に暗号化リポジトリをアンマウント |
実行シーケンスは以下の通りです:
- すべてのRediaccfileで
down()を実行(Z-A逆順、ベストエフォート) - 隔離Dockerデーモンを停止(
--unmountの場合) - LUKS暗号化ボリュームをアンマウントおよびクローズ(
--unmountの場合)
一括操作
マシン上のすべてのリポジトリを一度に開始または停止します:
rdc repo up-all -m server-1
| オプション | 説明 |
|---|---|
--include-forks | フォークされたリポジトリを含める |
--mount-only | マウントのみ行い、コンテナは起動しない |
--dry-run | 実行される操作を表示 |
--parallel | 操作を並列実行 |
--concurrency <n> | 最大同時操作数(デフォルト:3) |
起動時の自動開始
デフォルトでは、サーバー再起動後にリポジトリを手動でマウントして開始する必要があります。自動開始を設定すると、サーバー起動時にリポジトリを自動的にマウントし、Dockerを起動し、Rediaccfileのup()を実行するように構成できます。
仕組み
リポジトリの自動開始を有効にすると:
- 256バイトのランダムなLUKSキーファイルが生成され、リポジトリのLUKSスロット1に追加されます(スロット0はユーザーパスフレーズのまま)
- キーファイルは
{datastore}/.credentials/keys/{guid}.keyに0600パーミッション(root専用)で保存されます - systemdサービス(
rediacc-autostart)が起動時にすべての有効なリポジトリをマウントしてサービスを開始します
システムのシャットダウン時、サービスはすべてのサービスを正常に停止し(Rediaccfileのdown())、Dockerデーモンを停止し、LUKSボリュームをクローズします。
セキュリティに関する注意: 自動開始を有効にすると、サーバーのディスクにLUKSキーファイルが保存されます。サーバーへのrootアクセスを持つ者は、パスフレーズなしでリポジトリをマウントできます。脅威モデルに基づいて評価してください。
有効化
rdc repo autostart enable my-app -m server-1
リポジトリのパスフレーズの入力を求められます。
すべてを有効化
rdc repo autostart enable-all -m server-1
無効化
rdc repo autostart disable my-app -m server-1
これによりキーファイルが削除され、LUKSスロット1が無効化されます。
ステータスの一覧表示
rdc repo autostart list -m server-1
完全な例
この例では、PostgreSQL、Redis、APIサーバーを含むWebアプリケーションをデプロイします。
1. セットアップ
curl -fsSL https://get.rediacc.com | sh
rdc context create-local production --ssh-key ~/.ssh/id_ed25519
rdc context add-machine prod-1 --ip 203.0.113.50 --user deploy
rdc context setup-machine prod-1
rdc repo create webapp -m prod-1 --size 10G
2. マウントと準備
rdc repo mount webapp -m prod-1
3. アプリケーションファイルの作成
リポジトリ内に以下のファイルを作成します:
docker-compose.yml:
services:
postgres:
image: postgres:16
network_mode: host
restart: unless-stopped
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: webapp
POSTGRES_USER: app
POSTGRES_PASSWORD: changeme
command: -c listen_addresses=${POSTGRES_IP} -c port=5432
redis:
image: redis:7-alpine
network_mode: host
restart: unless-stopped
command: redis-server --bind ${REDIS_IP} --port 6379
api:
image: myregistry/api:latest
network_mode: host
restart: unless-stopped
environment:
DATABASE_URL: postgresql://app:changeme@${POSTGRES_IP}:5432/webapp
REDIS_URL: redis://${REDIS_IP}:6379
LISTEN_ADDR: ${API_IP}:8080
Rediaccfile:
#!/bin/bash
prep() {
mkdir -p data/postgres
renet compose -- pull
}
up() {
renet compose -- up -d
echo "Waiting for PostgreSQL..."
for i in $(seq 1 30); do
if docker compose exec postgres pg_isready -q 2>/dev/null; then
echo "PostgreSQL is ready."
return 0
fi
sleep 1
done
echo "Warning: PostgreSQL did not become ready within 30 seconds."
}
down() {
renet compose -- down
}
4. 開始
rdc repo up webapp -m prod-1
5. 自動開始の有効化
rdc repo autostart enable webapp -m prod-1