メインコンテンツにスキップ ナビゲーションにスキップ フッターにスキップ

サービス

Rediaccfile、サービスネットワーキング、自動開始を使用してコンテナ化されたサービスをデプロイ・管理。

サービス

どのツールを使うべきか迷う場合は、rdc vs renet を参照してください。

このページでは、コンテナ化されたサービスのデプロイと管理方法について説明します:Rediaccfile、サービスネットワーキング、開始/停止、一括操作、自動開始。

Rediaccfile

Rediaccfileは、サービスの準備、開始、停止の方法を定義するBashスクリプトです。ファイル名はRediaccfileまたはrediaccfile(大文字小文字を区別しない)で、リポジトリのマウントされたファイルシステム内に配置する必要があります。

Rediaccfileは2つの場所で検出されます:

  1. リポジトリマウントパスのルート
  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リポジトリGUIDa1b2c3d4-e5f6-...
REPOSITORY_NETWORK_IDネットワークID(整数)2816
DOCKER_HOSTこのリポジトリの隔離デーモン用Dockerソケットunix:///var/run/rediacc/docker-2816.sock
{SERVICE}_IP.rediacc.jsonで定義された各サービスのループバックIPPOSTGRES_IP=127.0.11.2

{SERVICE}_IP変数は.rediacc.jsonから自動生成されます。命名規則では、サービス名を大文字に変換し、ハイフンをアンダースコアに置き換え、_IPを付加します。例えば、listmonk-appLISTMONK_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の実行順序:ルート、次にbackenddatabasemonitoring(A-Z)。 downの実行順序:monitoringdatabasebackend、最後にルート(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は自動的に以下を行います:

  1. Rediaccfileを含むすべてのディレクトリでcomposeファイル(docker-compose.ymldocker-compose.yamlcompose.yml、またはcompose.yaml)をスキャン
  2. services:セクションからサービス名を抽出
  3. 新しいサービスに次の利用可能なスロットを割り当て
  4. 結果を{repository}/.rediacc.jsonに保存

IP計算

サービスのIPは、リポジトリのネットワークIDとサービスのスロットから計算されます。ネットワークIDは127.x.y.zループバックアドレスの第2、第3、第4オクテットに分割されます。各サービスにはネットワークIDにslot + 2のオフセットが加算されます(オフセット0と1はネットワークアドレスとゲートウェイ用に予約)。

:ネットワークID 28160x0B00)の場合、ベースアドレスは127.0.11.0

サービススロットIPアドレス
api0127.0.11.2
postgres1127.0.11.3
redis2127.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-onlyprep()関数のみを実行し、up()をスキップ

実行シーケンスは以下の通りです:

  1. LUKS暗号化リポジトリをマウント(--mountの場合)
  2. 隔離Dockerデーモンを起動
  3. composeファイルから.rediacc.jsonを自動生成
  4. すべてのRediaccfileでprep()を実行(A-Z順、即時失敗)
  5. すべてのRediaccfileでup()を実行(A-Z順)

サービスの停止

rdc repo down my-app -m server-1
オプション説明
--unmount停止後に暗号化リポジトリをアンマウント

実行シーケンスは以下の通りです:

  1. すべてのRediaccfileでdown()を実行(Z-A逆順、ベストエフォート)
  2. 隔離Dockerデーモンを停止(--unmountの場合)
  3. LUKS暗号化ボリュームをアンマウントおよびクローズ(--unmountの場合)

一括操作

マシン上のすべてのリポジトリを一度に開始または停止します:

rdc repo up-all -m server-1
オプション説明
--include-forksフォークされたリポジトリを含める
--mount-onlyマウントのみ行い、コンテナは起動しない
--dry-run実行される操作を表示
--parallel操作を並列実行
--concurrency <n>最大同時操作数(デフォルト:3)

起動時の自動開始

デフォルトでは、サーバー再起動後にリポジトリを手動でマウントして開始する必要があります。自動開始を設定すると、サーバー起動時にリポジトリを自動的にマウントし、Dockerを起動し、Rediaccfileのup()を実行するように構成できます。

仕組み

リポジトリの自動開始を有効にすると:

  1. 256バイトのランダムなLUKSキーファイルが生成され、リポジトリのLUKSスロット1に追加されます(スロット0はユーザーパスフレーズのまま)
  2. キーファイルは{datastore}/.credentials/keys/{guid}.key0600パーミッション(root専用)で保存されます
  3. 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