Prepare for VPS migration: Create server specific docker-compose.yml and rename dev config

This commit is contained in:
Akira
2026-02-18 15:13:53 +09:00
parent 297299c3f8
commit 639ac23efa
3 changed files with 246 additions and 243 deletions

View File

@@ -1,233 +1,68 @@
# Windmill サーバー設定手順
# Windmill サーバー設定手順 (VPS移行版)
現在の状態:
- ディレクトリ: `/home/windmill/windmill`
- Giteaから正常にpull完了
本番環境VPSへのデプロイ手順です。
既にTraefikが稼働している環境`traefik-net` ネットワークが存在する環境)を前提としています。
## 前提条件
- サーバー上でTraefikが稼働しており、`traefik-net` ネットワークが存在すること。
- ドメイン `windmill.keinafarm.net` がサーバーのIPに向けられていること。
## ステップ1: リポジトリの準備
サーバー上の任意の場所(例: `/home/windmill/windmill`)にリポジトリをクローンします。
**重要**: WindmillのGit同期機能を使用するため、このディレクトリパスは重要です。
## ステップ1: docker-compose.yml の置き換え
```bash
cd /home/windmill/windmill
# 現在のファイルをバックアップ
cp docker-compose.yml docker-compose.yml.local.backup
# 新しいdocker-compose.ymlを作成
# (ダウンロードしたファイルの内容をコピー)
nano docker-compose.yml
mkdir -p /home/windmill
cd /home/windmill
git clone https://gitea.keinafarm.net/akira/windmill.git windmill
cd windmill
```
または、ローカルで修正してgit pushする方法
## ステップ2: 環境変数の設定
`.env` ファイルを作成し、本番用の設定を行います。
```bash
# ローカルで
cd /home/akira/develop/windmill
cp /path/to/downloaded/docker-compose.yml .
git add docker-compose.yml
git commit -m "Update docker-compose.yml for server deployment"
git push gitea main
# サーバーで
cd /home/windmill/windmill
git pull origin main
```
## ステップ2: .env ファイルの確認
```bash
cd /home/windmill/windmill
# .envファイルを編集
cp .env .env.production
nano .env
```
以下の内容を確認・修正:
以下の内容を確認・修正してください
- `DATABASE_URL`: `postgres://postgres:あなたの強力なパスワード@db/windmill?sslmode=disable`
- `POSTGRES_PASSWORD`: 上記と同じパスワード
- `WM_IMAGE`: `ghcr.io/windmill-labs/windmill:main`
## ステップ3: 起動
`docker-compose.yml` は本番用に構成されていますTraefik連携済み
```bash
WM_IMAGE=ghcr.io/windmill-labs/windmill:main
DATABASE_URL=postgresql://postgres:YOUR_STRONG_PASSWORD@db:5432/windmill
LOG_MAX_SIZE=20m
LOG_MAX_FILE=10
docker-compose up -d
```
⚠️ **重要**: `YOUR_STRONG_PASSWORD` を強力なパスワードに変更してください
## ステップ4: Git同期用ワークフローの確認
Windmill内でGit同期スクリプトを設定する場合、コンテナ内の `/workspace` はホスト側の `./` (つまり `/home/windmill/windmill`)にマウントされています。
これにより、Windmill内でのGit操作コミット・プッシュがホスト側のリポジトリに対して行われます。
初期同期スクリプト(`sync_to_git.sh`)を使用する場合は、実行権限を与えてください:
## ステップ3: Traefikネットワークの確認
```bash
# traefik-netネットワークが存在するか確認
docker network ls | grep traefik-net
# もし存在しない場合は作成
docker network create traefik-net
```
## ステップ4: Caddyファイルの削除不要
```bash
cd /home/windmill/windmill
# Caddyfileは不要Traefikを使用
rm Caddyfile # または mv Caddyfile Caddyfile.bak
```
## ステップ5: sync_to_git.sh の更新
```bash
cd /home/windmill/windmill
# 既存のsync_to_git.shを新しいバージョンに置き換え
nano sync_to_git.sh
# (ダウンロードした内容をコピー)
chmod +x sync_to_git.sh
```
## ステップ6: Git認証情報の設定
プッシュ時に認証が必要な場合、以下のいずれかを設定:
### 方法A: Git Credential Helper推奨
```bash
cd /home/windmill/windmill
# 認証情報を保存
git config credential.helper store
# 一度手動でpushパスワード/トークンを入力)
git push origin main
# Username: akira
# Password: <Gitea access token>
# 以降は認証情報が保存されている
```
### 方法B: SSH鍵より安全
```bash
# SSH鍵を生成
ssh-keygen -t ed25519 -C "windmill@keinafarm.net"
# 公開鍵をGiteaに登録
cat ~/.ssh/id_ed25519.pub
# Gitea → Settings → SSH/GPG Keys → Add Key
# リモートURLをSSHに変更
cd /home/windmill/windmill
git remote set-url origin git@gitea.keinafarm.net:akira/windmil.git
```
## ステップ7: Windmillの起動
```bash
cd /home/windmill/windmill
# コンテナを起動
docker-compose up -d
# ログを確認
docker-compose logs -f windmill_server
# 状態確認
docker-compose ps
```
## ステップ8: 動作確認
```bash
# APIバージョンチェック
curl -k https://windmill.keinafarm.net/api/version
# ブラウザでアクセス
# https://windmill.keinafarm.net
```
## ステップ9: Windmill初期設定
1. ブラウザで `https://windmill.keinafarm.net` にアクセス
2. 初回セットアップウィザードに従う
3. 管理者アカウントを作成
4. Workspaceを作成例: `admins`
## ステップ10: Git同期スクリプトの設定Windmill内
1. Windmill UI → Scripts → New Script
2. 以下の内容でBashスクリプトを作成
```bash
#!/bin/bash
set -x
export WM_BASE_URL="http://windmill_server:8000"
export WM_WORKSPACE="admins" # あなたのworkspace名に変更
export PATH=$HOME/.npm-global/bin:$PATH
echo "=== START SYNC ==="
if ! command -v wmill &> /dev/null; then
npm install -g windmill-cli
fi
cd /workspace
wmill sync pull --token "$WM_TOKEN" --base-url "$WM_BASE_URL" --workspace "$WM_WORKSPACE" --skip-variables --skip-secrets --skip-resources --yes --verbose || exit 1
git config --global --add safe.directory /workspace
git config --global user.email "bot@example.com"
git config --global user.name "Bot"
git add .
git commit -m "Auto-sync $(date)" || echo "No changes"
git push origin main
echo "=== END SYNC ==="
```
3. Schedule → New Schedule
- Cron: `*/15 * * * *` (15分ごと)
- Script: 上記で作成したスクリプト
4. Variables → New Variable
- `WM_TOKEN`: Windmill APIトークンSettings → Tokensで作成
## トラブルシューティング
### Traefikでアクセスできない
```bash
# Traefikのログ確認
docker logs traefik
### 開発環境(ローカル)での起動
ローカルで起動する場合は、リネームされた `docker-compose-dev.yml` を使用します:
# windmill_serverがtraefik-netに接続されているか
docker network inspect traefik-net | grep windmill
```bash
docker-compose -f docker-compose-dev.yml up -d
```
### データベース接続エラー
### ログ確認
```bash
# DBの状態確認
docker-compose ps db
docker-compose logs db
# 再起動
docker-compose restart db
```
### Gitプッシュが失敗する
```bash
# 認証情報の確認
cd /home/windmill/windmill
git remote -v
git config --list | grep credential
# 手動でテスト
git push origin main
```
## 重要なコマンド
```bash
# 再起動
docker-compose restart
# ログ確認
docker-compose logs -f
# 停止
docker-compose down
# 完全削除(データも削除)
docker-compose down -v
```
## セキュリティチェック
- [ ] `.env` のパスワードを変更
- [ ] Windmill管理者に強力なパスワード設定
- [ ] Git認証をSSH鍵またはcredential helperで設定
- [ ] Traefik Basic認証の追加検討必要に応じて
```

182
docker-compose-dev.yml Normal file
View File

@@ -0,0 +1,182 @@
version: "3.9"
x-logging: &default-logging
driver: "json-file"
options:
max-size: "${LOG_MAX_SIZE:-20m}"
max-file: "${LOG_MAX_FILE:-10}"
compress: "true"
networks:
traefik-net:
external: true # Traefik管理下のネットワーク
windmill-internal:
driver: bridge # Windmill内部通信用
services:
db:
deploy:
replicas: 1
image: postgres:16
shm_size: 1g
restart: unless-stopped
volumes:
- db_data:/var/lib/postgresql/data
expose:
- 5432
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: windmill
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
interval: 10s
timeout: 5s
retries: 5
logging: *default-logging
networks:
- windmill-internal
windmill_server:
image: ${WM_IMAGE}
container_name: windmill_server
pull_policy: always
deploy:
replicas: 1
restart: unless-stopped
expose:
- 8000
- 2525
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=server
depends_on:
db:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
- /home/windmill/windmill:/workspace
labels:
# Traefik設定
- "traefik.enable=true"
# HTTPSルーター
- "traefik.http.routers.windmill.rule=Host(`windmill.keinafarm.net`)"
- "traefik.http.routers.windmill.entrypoints=websecure"
- "traefik.http.routers.windmill.tls=true"
- "traefik.http.routers.windmill.tls.certresolver=letsencrypt"
- "traefik.http.services.windmill.loadbalancer.server.port=8000"
# HTTPからHTTPSへのリダイレクト
- "traefik.http.routers.windmill-http.rule=Host(`windmill.keinafarm.net`)"
- "traefik.http.routers.windmill-http.entrypoints=web"
- "traefik.http.routers.windmill-http.middlewares=windmill-https-redirect"
- "traefik.http.middlewares.windmill-https-redirect.redirectscheme.scheme=https"
networks:
- traefik-net
- windmill-internal
logging: *default-logging
windmill_worker:
image: ${WM_IMAGE}
pull_policy: always
deploy:
replicas: 3
resources:
limits:
cpus: "1"
memory: 2048M
restart: unless-stopped
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=worker
- WORKER_GROUP=default
depends_on:
db:
condition: service_healthy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- worker_dependency_cache:/tmp/windmill/cache
- worker_logs:/tmp/windmill/logs
- /home/windmill/windmill:/workspace
networks:
- windmill-internal
logging: *default-logging
windmill_worker_native:
image: ${WM_IMAGE}
pull_policy: always
deploy:
replicas: 1
resources:
limits:
cpus: "1"
memory: 2048M
restart: unless-stopped
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=worker
- WORKER_GROUP=native
- NUM_WORKERS=8
- SLEEP_QUEUE=200
depends_on:
db:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
networks:
- windmill-internal
logging: *default-logging
windmill_indexer:
image: ${WM_IMAGE}
pull_policy: always
deploy:
replicas: 0 # 必要に応じて1に変更
restart: unless-stopped
expose:
- 8002
environment:
- PORT=8002
- DATABASE_URL=${DATABASE_URL}
- MODE=indexer
depends_on:
db:
condition: service_healthy
volumes:
- windmill_index:/tmp/windmill/search
- worker_logs:/tmp/windmill/logs
networks:
- windmill-internal
logging: *default-logging
windmill_extra:
image: ghcr.io/windmill-labs/windmill-extra:latest
pull_policy: always
restart: unless-stopped
expose:
- 3001
- 3002
- 3003
environment:
- ENABLE_LSP=true
- ENABLE_MULTIPLAYER=false
- ENABLE_DEBUGGER=true
- DEBUGGER_PORT=3003
- ENABLE_NSJAIL=false
- REQUIRE_SIGNED_DEBUG_REQUESTS=false
- WINDMILL_BASE_URL=http://windmill_server:8000
volumes:
- lsp_cache:/pyls/.cache
networks:
- windmill-internal
logging: *default-logging
# Caddyは使わないTraefikを使用
# caddy:
# deploy:
# replicas: 0
volumes:
db_data: null
worker_dependency_cache: null
worker_logs: null
worker_memory: null
windmill_index: null
lsp_cache: null

View File

@@ -9,9 +9,9 @@ x-logging: &default-logging
networks:
traefik-net:
external: true # Traefik管理下のネットワーク
external: true # サーバー上の既存Traefikネットワーク
windmill-internal:
driver: bridge # Windmill内部通信用
driver: bridge
services:
db:
@@ -45,7 +45,6 @@ services:
restart: unless-stopped
expose:
- 8000
- 2525
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=server
@@ -54,9 +53,10 @@ services:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
- /home/windmill/windmill:/workspace
# Git同期のために、カレントディレクトリリポジトリルート/workspaceにマウント
# これにより、コンテナ内から .git ディレクトリにアクセス可能となり、git pushが可能になる
- .:/workspace
labels:
# Traefik設定
- "traefik.enable=true"
# HTTPSルーター
- "traefik.http.routers.windmill.rule=Host(`windmill.keinafarm.net`)"
@@ -95,7 +95,8 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
- worker_dependency_cache:/tmp/windmill/cache
- worker_logs:/tmp/windmill/logs
- /home/windmill/windmill:/workspace
# WorkerからもGit同期が必要な場合に備えてマウント
- .:/workspace
networks:
- windmill-internal
logging: *default-logging
@@ -125,28 +126,6 @@ services:
- windmill-internal
logging: *default-logging
windmill_indexer:
image: ${WM_IMAGE}
pull_policy: always
deploy:
replicas: 0 # 必要に応じて1に変更
restart: unless-stopped
expose:
- 8002
environment:
- PORT=8002
- DATABASE_URL=${DATABASE_URL}
- MODE=indexer
depends_on:
db:
condition: service_healthy
volumes:
- windmill_index:/tmp/windmill/search
- worker_logs:/tmp/windmill/logs
networks:
- windmill-internal
logging: *default-logging
windmill_extra:
image: ghcr.io/windmill-labs/windmill-extra:latest
pull_policy: always
@@ -168,15 +147,22 @@ services:
networks:
- windmill-internal
logging: *default-logging
# Caddyは使わないTraefikを使用
# caddy:
# deploy:
# replicas: 0
labels:
# LSPなどのWebSocket用設定Caddyfileの代替
- "traefik.enable=true"
# LSPへのルーティング (/ws/* -> 3001)
- "traefik.http.routers.windmill-lsp.rule=Host(`windmill.keinafarm.net`) && PathPrefix(`/ws/`)"
- "traefik.http.routers.windmill-lsp.entrypoints=websecure"
- "traefik.http.routers.windmill-lsp.tls=true"
- "traefik.http.services.windmill-lsp.loadbalancer.server.port=3001"
# Debuggerへのルーティング (/ws_debug/* -> 3003)
- "traefik.http.routers.windmill-debug.rule=Host(`windmill.keinafarm.net`) && PathPrefix(`/ws_debug/`)"
- "traefik.http.routers.windmill-debug.entrypoints=websecure"
- "traefik.http.routers.windmill-debug.tls=true"
- "traefik.http.services.windmill-debug.loadbalancer.server.port=3003"
volumes:
db_data: null
worker_dependency_cache: null
worker_logs: null
worker_memory: null
windmill_index: null
lsp_cache: null