本番配置の結果を反映(配置用ユーザーでの clone、動作確認結果、新着 100 件の調査)
This commit is contained in:
+51
-17
@@ -26,9 +26,7 @@ tags:
|
||||
| PostgreSQL 公開ポート | `15434` |
|
||||
| PostgreSQL ユーザー / DB | `tver` / `tver` |
|
||||
| アプリ配置先 | `/opt/stacks/tver` |
|
||||
|
||||
> [!warning] 起動前の未確認事項
|
||||
> - [要確認] Container Manager と DSM で、TCP `15434` が他のコンテナやサービスに使われていないこと。
|
||||
| Gitea配置用ユーザー | `tver-deploy`(リポジトリ読み取りのみ) |
|
||||
|
||||
## 1. NASを準備する
|
||||
|
||||
@@ -75,7 +73,7 @@ tags:
|
||||
### 1.3 Container ManagerでPostgreSQLを起動する
|
||||
|
||||
1. Container Managerの「プロジェクト」で、`/volume1/docker/tver-db/compose.yaml`を使う`tver-db`プロジェクトを作成する。
|
||||
2. 起動前に、他のプロジェクトとポート一覧を確認し、`15434`が空いていることを確認する。[要確認]
|
||||
2. 起動前に、他のプロジェクトとポート一覧を確認し、`15434`が空いていることを確認する。
|
||||
3. プロジェクトをビルド・起動する。
|
||||
4. `tver-postgres`が`healthy`になることを確認する。
|
||||
5. コンテナログに`database system is ready to accept connections`があることを確認する。
|
||||
@@ -86,6 +84,8 @@ tags:
|
||||
|
||||
TCP `15434`について、送信元`192.168.10.155`だけを許可するルールを追加する。他の送信元を許可する広いルールより前に配置し、LAN内の別ホストからDBへ接続できない構成にする。
|
||||
|
||||
DSMファイアウォールを設定した状態で、dockageからNASのTCP `15434`へ到達できることを確認済みである。[実機] 2026-10-04 確認
|
||||
|
||||
## 2. dockageを準備する
|
||||
|
||||
### 2.1 NFSクライアントとマウント先を用意する
|
||||
@@ -127,42 +127,70 @@ docker rmi busybox:stable
|
||||
|
||||
`/mnt/nas-tver/tver`は作成済みで、上記のDockerコンテナによる操作は実機確認済みである。[実機] 2026-10-04 確認。別環境へ作り直す場合も、書き込み確認が成功するまでworkerを起動しない。
|
||||
|
||||
### 2.3 リポジトリと環境変数を用意する
|
||||
### 2.3 Giteaに配置用ユーザーを用意する
|
||||
|
||||
公開リポジトリを標準のスタックディレクトリへcloneする。
|
||||
Giteaは`REQUIRE_SIGNIN_VIEW = true`かつ`DISABLE_SSH = true`で動作している。匿名HTTPSの`info/refs`は`401`となり、SSHも使えないため、配置専用の読み取り資格情報を使う。[実機] 2026-10-04 確認
|
||||
|
||||
1. Giteaの管理画面で、配置専用ユーザー`tver-deploy`を作成する。
|
||||
2. `kazu634/tver`リポジトリの「設定」→「共同作業者」で`tver-deploy`を追加し、権限を「読み取り」にする。
|
||||
3. `tver-deploy`でGiteaへログインし、ユーザー設定の「アプリケーション」からrepository読み取り権限だけを持つトークンを作成する。
|
||||
4. トークンは作成時に安全な場所へ控え、この文書、シェル履歴、Git管理下のファイルへ実値を書かない。
|
||||
|
||||
### 2.4 dockageにclone用トークンを保存する
|
||||
|
||||
Dockerホストの管理ユーザー`kazu634`で次を実行する。トークンは非表示で読み取り、権限`600`の専用credentialファイルへ保存する。credential helperはGiteaのHTTPS URLにだけ設定する。
|
||||
|
||||
```bash
|
||||
cd /opt/stacks
|
||||
git clone https://gitea.kazu634.com/kazu634/tver.git tver
|
||||
install -d -m 700 ~/.config/git
|
||||
read -rs -p 'Gitea token: ' TOKEN; echo
|
||||
umask 077
|
||||
printf 'https://tver-deploy:%s@gitea.kazu634.com\n' "$TOKEN" > ~/.config/git/credentials-tver
|
||||
unset TOKEN
|
||||
git config --global credential.https://gitea.kazu634.com.helper 'store --file ~/.config/git/credentials-tver'
|
||||
git clone https://tver-deploy@gitea.kazu634.com/kazu634/tver.git /opt/stacks/tver
|
||||
cd /opt/stacks/tver
|
||||
```
|
||||
|
||||
`.env.example`をGit管理外の`.env`へコピーし、実環境の値を設定する。
|
||||
この手順で認証付きcloneに成功した。[実機] 2026-10-04 確認。トークンを失効・更新した場合は、同じ手順で`credentials-tver`を作り直す。
|
||||
|
||||
### 2.5 アプリの環境変数を用意する
|
||||
|
||||
`.env.example`をGit管理外の`.env`へコピーし、`DATABASE_URL`へパスワード用の伏字を入れる。ファイルを`600`にしてから、パスワードを非表示で読み取り、伏字だけを置換する。
|
||||
|
||||
```bash
|
||||
cd /opt/stacks/tver
|
||||
umask 077
|
||||
cp .env.example .env
|
||||
sed -i 's|^DATABASE_URL=.*|DATABASE_URL=postgres://tver:__SET_PASSWORD__@192.168.10.201:15434/tver?sslmode=disable|' .env
|
||||
chmod 600 .env
|
||||
read -rs -p 'PostgreSQL password: ' DB_PASSWORD; echo
|
||||
sed -i "s|__SET_PASSWORD__|${DB_PASSWORD}|" .env
|
||||
unset DB_PASSWORD
|
||||
if grep -q '__SET_PASSWORD__' .env; then echo 'DATABASE_URLのパスワードが未設定です' >&2; exit 1; fi
|
||||
```
|
||||
|
||||
`.env`には次の形式で設定する。`<PostgreSQLのパスワード>`はNAS側の`.env`と同じ実値へ置き換える。
|
||||
完成した`.env`は次の項目を持つ。`DATABASE_URL`の実値は表示したり、文書へ転記したりしない。
|
||||
|
||||
```dotenv
|
||||
DATABASE_URL=postgres://tver:<PostgreSQLのパスワード>@192.168.10.201:15434/tver?sslmode=disable
|
||||
DATABASE_URL=<設定済み・表示しない>
|
||||
VIDEO_HOST_DIR=/mnt/nas-tver/tver
|
||||
VIDEO_DIR=/videos
|
||||
WORKER_CONCURRENCY=1
|
||||
```
|
||||
|
||||
> [!warning] パスワードの文字種
|
||||
> 上のURLへ埋め込む値に予約文字がある場合はURLエンコードが必要になる。NAS準備時に16進文字列で生成すれば、この追加処理を避けられる。
|
||||
> この手順で使うPostgreSQLパスワードには、URLや`sed`の区切りに影響する`@`・`:`・`/`・`?`・`#`・`%`・`|`を含めない。NAS準備時に16進文字列で生成すれば、この制約を満たせる。
|
||||
|
||||
### 2.4 Dockgeで起動する
|
||||
### 2.6 起動する
|
||||
|
||||
1. Dockgeでスタックディレクトリ `/opt/stacks/tver` の`compose.yaml`を`tver`スタックとして開く。
|
||||
2. webとworkerの両方が`build`対象であり、`.env`が読み込まれることを確認する。
|
||||
3. 「Deploy」でビルドと起動を行う。
|
||||
4. Dockge上でweb・workerがともにrunningになり、再起動を繰り返していないことを確認する。
|
||||
`/opt/stacks/tver`でwebとworkerをビルドして起動する。
|
||||
|
||||
```bash
|
||||
cd /opt/stacks/tver
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
この方法で起動すると、Dockgeの画面にも`tver`スタックとして表示された。[実機] 2026-10-04 確認。Dockge上でweb・workerがともにrunningになり、再起動を繰り返していないことを確認する。
|
||||
|
||||
コマンドでも状態とログを確認できる。
|
||||
|
||||
@@ -186,6 +214,12 @@ docker compose logs --tail=100 web worker
|
||||
5. NASの`/volume1/video/tver`に規則どおりのMP4が作成されたことを確認する。
|
||||
6. `tver-postgres`のログとweb・workerのログに、接続失敗やマイグレーション失敗がないことを確認する。
|
||||
|
||||
> [!success] 本番の動作確認結果
|
||||
> `/healthz`はHTTP `200`、新着バラエティは98件を表示した。4分の本編`ep5hcgopp2`を登録すると20秒以内に完了し、NASの`video/tver/<番組名>/`へ92,340,468バイトの1080p H.264/AAC MP4が保存された。所有者はUID `1024`・GID `100`、`.incoming`は空だった。`/library`の表示・再生とHTTP Range `206`も確認した。[実機] 2026-10-04 確認
|
||||
|
||||
> [!note] Synologyの`@eaDir`
|
||||
> NASが番組フォルダ内に所有者UID `0`の`@eaDir`を作る。アプリのライブラリ一覧はファイルシステムの走査ではなくDBから作るため、表示や再生には影響しない。[実機] 2026-10-04 確認
|
||||
|
||||
## 4. 更新する
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user