🐈

【完全ガイド】ConoHa VPSでn8nをDocker+TraefikでHTTPS公開する方法

に公開

n8n(ノーコード自動化ツール)をConoHa VPS上で安全に運用するための、Docker+Traefik構成によるHTTPS化ガイドです。
HTTP公開だけではブラウザの制限によりアクセスできないため、Let's Encrypt証明書を使ったHTTPS対応まで解説します。


1. SSHでサーバに接続

まず、ローカル端末(Windowsのコマンドプロンプトなど)からサーバへSSH接続します。

ssh root@example.ip.address

2. Dockerのインストール

サーバにログインしたら、DockerとComposeをインストールします。

dnf -y update
dnf -y install docker
systemctl enable --now docker

Dockerが動作しているか確認します。

docker version

Docker Composeのインストール

curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

Docker Compose v2以降では、docker compose コマンドとして統合されています。

docker compose version

3. ファイアウォール設定(ポート開放)

n8nが使用するポート(例:5678)を開放します。

firewall-cmd --add-port=5678/tcp --permanent
firewall-cmd --reload

さらに、ConoHaの管理画面(セキュリティ設定/ACL)でも同ポートを許可しておきましょう。

4. n8n用ディレクトリとComposeファイルの作成

mkdir -p /opt/n8n/data
cd /opt/n8n

docker-compose.ymlを作成します。

version: "3.9"
services:
  n8n:
    image: n8nio/n8n:latest
    environment:
      N8N_ENCRYPTION_KEY: "your-long-random-string"
      N8N_BASIC_AUTH_ACTIVE: "true"
      N8N_BASIC_AUTH_USER: "admin"
      N8N_BASIC_AUTH_PASSWORD: "change-this-password"
      GENERIC_TIMEZONE: "Asia/Tokyo"
    ports:
      - "5678:5678"
    volumes:
      - "./data:/home/node/.n8n"
    restart: unless-stopped

起動します。

docker compose pull
docker compose up -d
docker ps

これでHTTPではアクセス可能ですが、HTTPSが未設定のためブラウザではエラー表示になります。

5. DNS設定(ドメインとIPの紐付け)

DNSでサブドメインをVPSのIPアドレスに向けます。

例:n8n.example.com123.45.67.89

ConoHaのコントロールパネルで以下のように設定:

項目
ホスト名 n8n
種別 A
値(IPアドレス) example.ip.address
TTL 3600(デフォルト設定可)

反映確認:

dig +short n8n.example.com

→ 正しくIPが返れば成功です。

6. Traefikを使ったHTTPS構成

Traefikを利用してLet’s Encrypt証明書を自動取得・更新します。

ディレクトリ構成

mkdir -p /opt/n8n/{data,db,traefik}
cd /opt/n8n

.env ファイル

DOMAIN=n8n.example.com
N8N_HOST=${DOMAIN}
N8N_PORT=5678
N8N_PROTOCOL=https
N8N_EDITOR_BASE_URL=https://${DOMAIN}/
N8N_ENCRYPTION_KEY=your-random-key
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=change-this-password

POSTGRES_USER=n8n
POSTGRES_PASSWORD=strong-db-password
POSTGRES_DB=n8n

traefik/traefik.yml

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: "you@example.com"
      storage: "/letsencrypt/acme.json"
      httpChallenge:
        entryPoint: web

docker-compose.yml

version: "3.9"

services:
  traefik:
    image: traefik:v3.1
    command:
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./traefik:/letsencrypt"
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - "./db:/var/lib/postgresql/data"
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:latest
    environment:
      N8N_HOST: ${N8N_HOST}
      N8N_PORT: ${N8N_PORT}
      N8N_PROTOCOL: ${N8N_PROTOCOL}
      N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_BASIC_AUTH_ACTIVE: ${N8N_BASIC_AUTH_ACTIVE}
      N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
      N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      GENERIC_TIMEZONE: Asia/Tokyo
    volumes:
      - "./data:/home/node/.n8n"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`${DOMAIN}`)"
      - "traefik.http.routers.n8n.entrypoints=websecure"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"
    depends_on:
      - postgres
      - traefik
    restart: unless-stopped

7. サービス起動と確認

cd /opt/n8n
docker compose pull
docker compose up -d

アクセス確認:

docker compose logs traefik | grep "certificate"

8. バックアップと更新

バックアップ(データベース・設定含む):

tar czf n8n-backup-$(date +%F).tar.gz data db traefik

アップデート:

docker compose pull && docker compose up -d

9. 運用コマンドまとめ

内容 コマンド
サービス状態確認 docker compose ps
n8nログ docker compose logs -f n8n
Traefikログ docker compose logs -f traefik
バックアップ tar czf ~/n8n-backup-$(date +%F).tar.gz /opt/n8n/data

10. トラブル時のチェック項目

  • dig +short n8n.example.com が正しいIPを返しているか
  • ファイアウォールとACLでポート80・443が開放されているか
  • Traefikのログに「certificate successfully issued」が出ているか

まとめ

この手順により、ConoHa VPS上でn8nをHTTPS対応の安定運用環境として構築できます。
Traefikを使えば証明書の自動更新も行われ、長期的なメンテナンスも容易になります。
次は、n8nにWebhookフローを作って、自作WebアプリやSlackなどと連携してみましょう。

Discussion