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/ |