HestiaCP + n8n WebSocket HTTPS構築手順(完全版) » 履歴 » バージョン 1
KAN YOSHIDA, 2025/06/10 19:21
| 1 | 1 | KAN YOSHIDA | # HestiaCP + n8n WebSocket HTTPS構築手順(完全版) |
|---|---|---|---|
| 2 | |||
| 3 | ## 🎯 概要 |
||
| 4 | |||
| 5 | **成功事例**: HestiaCP環境でn8nのWebSocket機能を含む完全なHTTPS対応を実現した手順書です。 |
||
| 6 | |||
| 7 | ### 環境情報 |
||
| 8 | - **OS**: Ubuntu(HestiaCPインストール済み) |
||
| 9 | - **Webサーバー**: Nginx(フロントエンド) + Apache(バックエンド) |
||
| 10 | - **n8n**: Docker Compose構成 |
||
| 11 | - **SSL証明書**: Let's Encrypt |
||
| 12 | - **併存サービス**: Dify(競合なし) |
||
| 13 | |||
| 14 | ### 最終構成 |
||
| 15 | ``` |
||
| 16 | Internet → Nginx (Port 443) → n8n Docker (Port 5678) |
||
| 17 | → Nginx (Port 443) → Dify Docker (Port 3000) |
||
| 18 | ``` |
||
| 19 | |||
| 20 | ## 📋 前提条件 |
||
| 21 | |||
| 22 | ### 必要な環境 |
||
| 23 | - HestiaCPがインストール済み |
||
| 24 | - Docker & Docker Composeが利用可能 |
||
| 25 | - ドメイン(例:`n8n.artjunkie.co.jp`) |
||
| 26 | - DNS設定済み |
||
| 27 | |||
| 28 | ### ディレクトリ構造 |
||
| 29 | ``` |
||
| 30 | /opt/docker-apps/ |
||
| 31 | ├── n8n/ |
||
| 32 | │ ├── docker-compose.yml |
||
| 33 | │ └── .env |
||
| 34 | └── dify/ |
||
| 35 | ├── docker-compose.yml |
||
| 36 | └── .env |
||
| 37 | ``` |
||
| 38 | |||
| 39 | ## 🚀 Step 1: n8n Docker環境構築 |
||
| 40 | |||
| 41 | ### 1.1 ディレクトリ作成 |
||
| 42 | ```bash |
||
| 43 | sudo mkdir -p /opt/docker-apps/n8n |
||
| 44 | cd /opt/docker-apps/n8n |
||
| 45 | ``` |
||
| 46 | |||
| 47 | ### 1.2 docker-compose.yml作成 |
||
| 48 | ```yaml |
||
| 49 | version: '3.8' |
||
| 50 | |||
| 51 | services: |
||
| 52 | postgres: |
||
| 53 | image: postgres:15-alpine |
||
| 54 | container_name: n8n-postgres |
||
| 55 | restart: unless-stopped |
||
| 56 | environment: |
||
| 57 | - POSTGRES_USER=n8n |
||
| 58 | - POSTGRES_PASSWORD=n8n_password |
||
| 59 | - POSTGRES_DB=n8n |
||
| 60 | volumes: |
||
| 61 | - postgres_data:/var/lib/postgresql/data |
||
| 62 | ports: |
||
| 63 | - "127.0.0.1:5433:5432" |
||
| 64 | healthcheck: |
||
| 65 | test: ["CMD-SHELL", "pg_isready -U n8n"] |
||
| 66 | interval: 10s |
||
| 67 | timeout: 5s |
||
| 68 | retries: 5 |
||
| 69 | |||
| 70 | n8n: |
||
| 71 | image: n8nio/n8n:latest |
||
| 72 | container_name: n8n-app |
||
| 73 | restart: unless-stopped |
||
| 74 | environment: |
||
| 75 | - DB_TYPE=postgresdb |
||
| 76 | - DB_POSTGRESDB_HOST=postgres |
||
| 77 | - DB_POSTGRESDB_PORT=5432 |
||
| 78 | - DB_POSTGRESDB_DATABASE=n8n |
||
| 79 | - DB_POSTGRESDB_USER=n8n |
||
| 80 | - DB_POSTGRESDB_PASSWORD=n8n_password |
||
| 81 | - N8N_PROTOCOL=https |
||
| 82 | - N8N_HOST=n8n.artjunkie.co.jp |
||
| 83 | - WEBHOOK_URL=https://n8n.artjunkie.co.jp/ |
||
| 84 | - NODE_ENV=production |
||
| 85 | - N8N_TRUST_PROXY=true |
||
| 86 | ports: |
||
| 87 | - "127.0.0.1:5678:5678" |
||
| 88 | volumes: |
||
| 89 | - n8n_data:/home/node/.n8n |
||
| 90 | depends_on: |
||
| 91 | postgres: |
||
| 92 | condition: service_healthy |
||
| 93 | |||
| 94 | volumes: |
||
| 95 | postgres_data: |
||
| 96 | n8n_data: |
||
| 97 | ``` |
||
| 98 | |||
| 99 | ### 1.3 n8n起動 |
||
| 100 | ```bash |
||
| 101 | sudo docker-compose up -d |
||
| 102 | sudo docker-compose ps |
||
| 103 | sudo docker-compose logs n8n |
||
| 104 | ``` |
||
| 105 | |||
| 106 | ## 🔧 Step 2: HestiaCPドメイン設定 |
||
| 107 | |||
| 108 | ### 2.1 ドメイン追加 |
||
| 109 | HestiaCPで新しいドメイン `n8n.artjunkie.co.jp` を追加 |
||
| 110 | |||
| 111 | ### 2.2 SSL証明書生成 |
||
| 112 | ```bash |
||
| 113 | # HestiaCPでLet's Encrypt SSL証明書を生成 |
||
| 114 | # または手動で: |
||
| 115 | sudo certbot certonly --webroot -w /home/webdev/web/n8n.artjunkie.co.jp/public_html -d n8n.artjunkie.co.jp |
||
| 116 | ``` |
||
| 117 | |||
| 118 | ## ⚙️ Step 3: Nginx WebSocket設定 |
||
| 119 | |||
| 120 | ### 3.1 現在の設定確認 |
||
| 121 | ```bash |
||
| 122 | # 既存設定バックアップ |
||
| 123 | sudo cp /home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf /home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf.backup |
||
| 124 | |||
| 125 | # 設定確認 |
||
| 126 | ls -la /home/webdev/conf/web/n8n.artjunkie.co.jp/ |
||
| 127 | ``` |
||
| 128 | |||
| 129 | ### 3.2 WebSocket対応Nginx設定 |
||
| 130 | ```bash |
||
| 131 | sudo nano /home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf |
||
| 132 | ``` |
||
| 133 | |||
| 134 | **設定内容**: |
||
| 135 | ```nginx |
||
| 136 | #=========================================================================# |
||
| 137 | # n8n WebSocket SSL Configuration # |
||
| 138 | #=========================================================================# |
||
| 139 | server { |
||
| 140 | listen 133.18.43.195:443 ssl; |
||
| 141 | http2 on; |
||
| 142 | server_name n8n.artjunkie.co.jp; |
||
| 143 | |||
| 144 | # SSL設定 |
||
| 145 | ssl_certificate /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/n8n.artjunkie.co.jp.pem; |
||
| 146 | ssl_certificate_key /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/n8n.artjunkie.co.jp.key; |
||
| 147 | |||
| 148 | # セキュリティヘッダー |
||
| 149 | add_header Strict-Transport-Security "max-age=31536000"; |
||
| 150 | add_header X-Frame-Options SAMEORIGIN; |
||
| 151 | add_header X-Content-Type-Options nosniff; |
||
| 152 | |||
| 153 | # ログ設定 |
||
| 154 | error_log /var/log/nginx/domains/n8n.artjunkie.co.jp.error.log error; |
||
| 155 | access_log /var/log/nginx/domains/n8n.artjunkie.co.jp.log combined; |
||
| 156 | |||
| 157 | # WebSocket Push endpoint (最重要!) |
||
| 158 | location /rest/push { |
||
| 159 | proxy_pass http://127.0.0.1:5678; |
||
| 160 | proxy_http_version 1.1; |
||
| 161 | proxy_set_header Upgrade $http_upgrade; |
||
| 162 | proxy_set_header Connection "upgrade"; |
||
| 163 | proxy_set_header Host $http_host; |
||
| 164 | proxy_set_header X-Real-IP $remote_addr; |
||
| 165 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||
| 166 | proxy_set_header X-Forwarded-Proto $scheme; |
||
| 167 | proxy_set_header X-Nginx-Proxy true; |
||
| 168 | proxy_redirect off; |
||
| 169 | proxy_read_timeout 86400; |
||
| 170 | proxy_connect_timeout 300; |
||
| 171 | proxy_send_timeout 300; |
||
| 172 | |||
| 173 | # WebSocket特別設定 |
||
| 174 | proxy_buffering off; |
||
| 175 | proxy_cache off; |
||
| 176 | } |
||
| 177 | |||
| 178 | # Socket.io WebSocket |
||
| 179 | location /socket.io/ { |
||
| 180 | proxy_pass http://127.0.0.1:5678; |
||
| 181 | proxy_http_version 1.1; |
||
| 182 | proxy_set_header Upgrade $http_upgrade; |
||
| 183 | proxy_set_header Connection "upgrade"; |
||
| 184 | proxy_set_header Host $http_host; |
||
| 185 | proxy_set_header X-Real-IP $remote_addr; |
||
| 186 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||
| 187 | proxy_set_header X-Forwarded-Proto $scheme; |
||
| 188 | proxy_read_timeout 86400; |
||
| 189 | proxy_buffering off; |
||
| 190 | } |
||
| 191 | |||
| 192 | # 通常のHTTP API |
||
| 193 | location / { |
||
| 194 | proxy_pass http://127.0.0.1:5678; |
||
| 195 | proxy_set_header Host $http_host; |
||
| 196 | proxy_set_header X-Real-IP $remote_addr; |
||
| 197 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||
| 198 | proxy_set_header X-Forwarded-Proto $scheme; |
||
| 199 | proxy_read_timeout 300; |
||
| 200 | proxy_connect_timeout 300; |
||
| 201 | proxy_redirect off; |
||
| 202 | } |
||
| 203 | |||
| 204 | # エラーページ |
||
| 205 | location /error/ { |
||
| 206 | alias /home/webdev/web/n8n.artjunkie.co.jp/document_errors/; |
||
| 207 | } |
||
| 208 | } |
||
| 209 | ``` |
||
| 210 | |||
| 211 | ### 3.3 設定反映 |
||
| 212 | ```bash |
||
| 213 | # 設定テスト |
||
| 214 | sudo nginx -t |
||
| 215 | |||
| 216 | # 再読み込み |
||
| 217 | sudo nginx -s reload |
||
| 218 | ``` |
||
| 219 | |||
| 220 | ## 🔍 Step 4: 動作確認 |
||
| 221 | |||
| 222 | ### 4.1 基本接続確認 |
||
| 223 | ```bash |
||
| 224 | # n8n内部接続 |
||
| 225 | curl -I http://127.0.0.1:5678/ |
||
| 226 | |||
| 227 | # HTTPS接続 |
||
| 228 | curl -I https://n8n.artjunkie.co.jp/ |
||
| 229 | |||
| 230 | # Docker状況 |
||
| 231 | sudo docker-compose ps |
||
| 232 | ``` |
||
| 233 | |||
| 234 | ### 4.2 WebSocket接続テスト |
||
| 235 | ```bash |
||
| 236 | # WebSocket Upgrade テスト |
||
| 237 | curl -v -H "Upgrade: websocket" -H "Connection: upgrade" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" -H "Sec-WebSocket-Version: 13" https://n8n.artjunkie.co.jp/rest/push |
||
| 238 | ``` |
||
| 239 | |||
| 240 | **期待結果**: `HTTP/2 401 {"status":"error","message":"Unauthorized"}` |
||
| 241 | → WebSocketは正常に機能(認証が必要なため401) |
||
| 242 | |||
| 243 | ## 🎯 Step 5: 最終確認と最適化 |
||
| 244 | |||
| 245 | ### 5.1 ログディレクトリ作成 |
||
| 246 | ```bash |
||
| 247 | sudo mkdir -p /var/log/nginx/domains |
||
| 248 | sudo touch /var/log/nginx/domains/n8n.artjunkie.co.jp.access.log |
||
| 249 | sudo chown nginx:nginx /var/log/nginx/domains/n8n.artjunkie.co.jp.access.log |
||
| 250 | ``` |
||
| 251 | |||
| 252 | ### 5.2 Apache設定無効化(オプション) |
||
| 253 | **重要**: 2重プロキシを避けるため、Apache経由ではなくNginx直接プロキシを使用 |
||
| 254 | |||
| 255 | ```bash |
||
| 256 | # Apache設定確認(使用しない) |
||
| 257 | ls -la /etc/apache2/conf.d/domains/n8n.artjunkie.co.jp* |
||
| 258 | ``` |
||
| 259 | |||
| 260 | ## ✅ 成功確認 |
||
| 261 | |||
| 262 | ### ブラウザテスト |
||
| 263 | 1. **URL**: `https://n8n.artjunkie.co.jp/` |
||
| 264 | 2. **期待結果**: n8nログイン画面表示 |
||
| 265 | 3. **WebSocket**: リアルタイム機能が正常動作 |
||
| 266 | |||
| 267 | ### 管理コマンド |
||
| 268 | ```bash |
||
| 269 | # サービス状況確認 |
||
| 270 | sudo docker-compose ps |
||
| 271 | |||
| 272 | # ログ確認 |
||
| 273 | sudo docker-compose logs -f n8n |
||
| 274 | |||
| 275 | # 接続確認 |
||
| 276 | sudo ss -tlnp | grep 5678 |
||
| 277 | curl -I https://n8n.artjunkie.co.jp/ |
||
| 278 | ``` |
||
| 279 | |||
| 280 | ## 🔧 トラブルシューティング |
||
| 281 | |||
| 282 | ### よくある問題と解決策 |
||
| 283 | |||
| 284 | #### 1. 503 Service Unavailable |
||
| 285 | **原因**: n8nコンテナが停止中 |
||
| 286 | ```bash |
||
| 287 | cd /opt/docker-apps/n8n |
||
| 288 | sudo docker-compose restart |
||
| 289 | ``` |
||
| 290 | |||
| 291 | #### 2. WebSocket接続エラー |
||
| 292 | **原因**: 2重プロキシ設定 |
||
| 293 | **解決**: Nginx直接プロキシ設定に変更(上記設定を使用) |
||
| 294 | |||
| 295 | #### 3. X-Forwarded-For警告 |
||
| 296 | **原因**: プロキシ設定不備 |
||
| 297 | **解決**: docker-compose.ymlに `N8N_TRUST_PROXY=true` 追加 |
||
| 298 | |||
| 299 | #### 4. SSL証明書エラー |
||
| 300 | **確認**: |
||
| 301 | ```bash |
||
| 302 | ls -la /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/ |
||
| 303 | sudo nginx -t |
||
| 304 | ``` |
||
| 305 | |||
| 306 | ## 📊 最終構成情報 |
||
| 307 | |||
| 308 | ### ポート使用状況 |
||
| 309 | - **443**: Nginx SSL(n8n、Dify、その他ドメイン) |
||
| 310 | - **5678**: n8n Docker(内部のみ) |
||
| 311 | - **5433**: PostgreSQL(内部のみ) |
||
| 312 | |||
| 313 | ### 重要なファイル |
||
| 314 | - `/opt/docker-apps/n8n/docker-compose.yml` |
||
| 315 | - `/home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf` |
||
| 316 | - `/var/log/nginx/domains/n8n.artjunkie.co.jp.error.log` |
||
| 317 | |||
| 318 | ### 環境変数 |
||
| 319 | ```env |
||
| 320 | N8N_PROTOCOL=https |
||
| 321 | N8N_HOST=n8n.artjunkie.co.jp |
||
| 322 | WEBHOOK_URL=https://n8n.artjunkie.co.jp/ |
||
| 323 | N8N_TRUST_PROXY=true |
||
| 324 | ``` |
||
| 325 | |||
| 326 | ## 🎉 完了 |
||
| 327 | |||
| 328 | **成功事例**: HestiaCPでn8nのWebSocket機能を含む完全なHTTPS構成が完了しました! |
||
| 329 | |||
| 330 | - ✅ **HTTPS**: Let's Encrypt SSL証明書 |
||
| 331 | - ✅ **WebSocket**: リアルタイム通信対応 |
||
| 332 | - ✅ **Docker**: コンテナ化による管理 |
||
| 333 | - ✅ **併存**: Difyとの競合なし |
||
| 334 | - ✅ **パフォーマンス**: Nginx直接プロキシによる最適化 |
||
| 335 | |||
| 336 | **アクセス**: https://n8n.artjunkie.co.jp/ |