プロジェクト

全般

プロフィール

操作

HestiaCP + n8n WebSocket HTTPS構築手順(完全版)

🎯 概要

成功事例: HestiaCP環境でn8nのWebSocket機能を含む完全なHTTPS対応を実現した手順書です。

環境情報

  • OS: Ubuntu(HestiaCPインストール済み)
  • Webサーバー: Nginx(フロントエンド) + Apache(バックエンド)
  • n8n: Docker Compose構成
  • SSL証明書: Let's Encrypt
  • 併存サービス: Dify(競合なし)

最終構成

Internet → Nginx (Port 443) → n8n Docker (Port 5678)
         → Nginx (Port 443) → Dify Docker (Port 3000)

📋 前提条件

必要な環境

  • HestiaCPがインストール済み
  • Docker & Docker Composeが利用可能
  • ドメイン(例:n8n.artjunkie.co.jp
  • DNS設定済み

ディレクトリ構造

/opt/docker-apps/
├── n8n/
│   ├── docker-compose.yml
│   └── .env
└── dify/
    ├── docker-compose.yml
    └── .env

🚀 Step 1: n8n Docker環境構築

1.1 ディレクトリ作成

sudo mkdir -p /opt/docker-apps/n8n
cd /opt/docker-apps/n8n

1.2 docker-compose.yml作成

version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=n8n_password
      - POSTGRES_DB=n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5433:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n-app
    restart: unless-stopped
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=n8n_password
      - N8N_PROTOCOL=https
      - N8N_HOST=n8n.artjunkie.co.jp
      - WEBHOOK_URL=https://n8n.artjunkie.co.jp/
      - NODE_ENV=production
      - N8N_TRUST_PROXY=true
    ports:
      - "127.0.0.1:5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

1.3 n8n起動

sudo docker-compose up -d
sudo docker-compose ps
sudo docker-compose logs n8n

🔧 Step 2: HestiaCPドメイン設定

2.1 ドメイン追加

HestiaCPで新しいドメイン n8n.artjunkie.co.jp を追加

2.2 SSL証明書生成

# HestiaCPでLet's Encrypt SSL証明書を生成
# または手動で:
sudo certbot certonly --webroot -w /home/webdev/web/n8n.artjunkie.co.jp/public_html -d n8n.artjunkie.co.jp

⚙️ Step 3: Nginx WebSocket設定

3.1 現在の設定確認

# 既存設定バックアップ
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

# 設定確認
ls -la /home/webdev/conf/web/n8n.artjunkie.co.jp/

3.2 WebSocket対応Nginx設定

sudo nano /home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf

設定内容:

#=========================================================================#
# n8n WebSocket SSL Configuration                                         #
#=========================================================================#
server {
    listen      133.18.43.195:443 ssl;
    http2 on;
    server_name n8n.artjunkie.co.jp;
    
    # SSL設定
    ssl_certificate      /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/n8n.artjunkie.co.jp.pem;
    ssl_certificate_key  /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/n8n.artjunkie.co.jp.key;
    
    # セキュリティヘッダー
    add_header Strict-Transport-Security "max-age=31536000";
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    
    # ログ設定
    error_log   /var/log/nginx/domains/n8n.artjunkie.co.jp.error.log error;
    access_log  /var/log/nginx/domains/n8n.artjunkie.co.jp.log combined;

    # WebSocket Push endpoint (最重要!)
    location /rest/push {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Nginx-Proxy true;
        proxy_redirect off;
        proxy_read_timeout 86400;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        
        # WebSocket特別設定
        proxy_buffering off;
        proxy_cache off;
    }

    # Socket.io WebSocket
    location /socket.io/ {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
        proxy_buffering off;
    }

    # 通常のHTTP API
    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_redirect off;
    }
    
    # エラーページ
    location /error/ {
        alias /home/webdev/web/n8n.artjunkie.co.jp/document_errors/;
    }
}

3.3 設定反映

# 設定テスト
sudo nginx -t

# 再読み込み
sudo nginx -s reload

🔍 Step 4: 動作確認

4.1 基本接続確認

# n8n内部接続
curl -I http://127.0.0.1:5678/

# HTTPS接続
curl -I https://n8n.artjunkie.co.jp/

# Docker状況
sudo docker-compose ps

4.2 WebSocket接続テスト

# WebSocket Upgrade テスト
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

期待結果: HTTP/2 401 {"status":"error","message":"Unauthorized"}
→ WebSocketは正常に機能(認証が必要なため401)

🎯 Step 5: 最終確認と最適化

5.1 ログディレクトリ作成

sudo mkdir -p /var/log/nginx/domains
sudo touch /var/log/nginx/domains/n8n.artjunkie.co.jp.access.log
sudo chown nginx:nginx /var/log/nginx/domains/n8n.artjunkie.co.jp.access.log

5.2 Apache設定無効化(オプション)

重要: 2重プロキシを避けるため、Apache経由ではなくNginx直接プロキシを使用

# Apache設定確認(使用しない)
ls -la /etc/apache2/conf.d/domains/n8n.artjunkie.co.jp*

✅ 成功確認

ブラウザテスト

  1. URL: https://n8n.artjunkie.co.jp/
  2. 期待結果: n8nログイン画面表示
  3. WebSocket: リアルタイム機能が正常動作

管理コマンド

# サービス状況確認
sudo docker-compose ps

# ログ確認
sudo docker-compose logs -f n8n

# 接続確認
sudo ss -tlnp | grep 5678
curl -I https://n8n.artjunkie.co.jp/

🔧 トラブルシューティング

よくある問題と解決策

1. 503 Service Unavailable

原因: n8nコンテナが停止中

cd /opt/docker-apps/n8n
sudo docker-compose restart

2. WebSocket接続エラー

原因: 2重プロキシ設定
解決: Nginx直接プロキシ設定に変更(上記設定を使用)

3. X-Forwarded-For警告

原因: プロキシ設定不備
解決: docker-compose.ymlに N8N_TRUST_PROXY=true 追加

4. SSL証明書エラー

確認:

ls -la /home/webdev/conf/web/n8n.artjunkie.co.jp/ssl/
sudo nginx -t

📊 最終構成情報

ポート使用状況

  • 443: Nginx SSL(n8n、Dify、その他ドメイン)
  • 5678: n8n Docker(内部のみ)
  • 5433: PostgreSQL(内部のみ)

重要なファイル

  • /opt/docker-apps/n8n/docker-compose.yml
  • /home/webdev/conf/web/n8n.artjunkie.co.jp/nginx.ssl.conf
  • /var/log/nginx/domains/n8n.artjunkie.co.jp.error.log

環境変数

N8N_PROTOCOL=https
N8N_HOST=n8n.artjunkie.co.jp
WEBHOOK_URL=https://n8n.artjunkie.co.jp/
N8N_TRUST_PROXY=true

🎉 完了

成功事例: HestiaCPでn8nのWebSocket機能を含む完全なHTTPS構成が完了しました!

  • HTTPS: Let's Encrypt SSL証明書
  • WebSocket: リアルタイム通信対応
  • Docker: コンテナ化による管理
  • 併存: Difyとの競合なし
  • パフォーマンス: Nginx直接プロキシによる最適化

アクセス: https://n8n.artjunkie.co.jp/

KAN YOSHIDA さんが13日前に更新 · 1件の履歴