From 639ac23efac16b15534474e9fda5617313b80b5a Mon Sep 17 00:00:00 2001 From: Akira Date: Wed, 18 Feb 2026 15:13:53 +0900 Subject: [PATCH] Prepare for VPS migration: Create server specific docker-compose.yml and rename dev config --- SERVER_SETUP.md | 253 +++++++---------------------------------- docker-compose-dev.yml | 182 +++++++++++++++++++++++++++++ docker-compose.yml | 54 ++++----- 3 files changed, 246 insertions(+), 243 deletions(-) create mode 100644 docker-compose-dev.yml diff --git a/SERVER_SETUP.md b/SERVER_SETUP.md index 767a02e..81511db 100644 --- a/SERVER_SETUP.md +++ b/SERVER_SETUP.md @@ -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: - -# 以降は認証情報が保存されている -``` - -### 方法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認証の追加検討(必要に応じて) \ No newline at end of file +``` \ No newline at end of file diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..aa4b50a --- /dev/null +++ b/docker-compose-dev.yml @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index aa4b50a..dfe9d84 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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