tva
← Insights

Hetzner CloudでのセルフホストによるN8N:Docker完全セットアップチュートリアル

ワークフロー自動化は現代のビジネスに不可欠ですが、チームの拡大に伴いSaaSソリューションのコストは増大しがちです。月額5ユーロ未満でHetzner Cloud上に独自のn8nインスタンスをセットアップする方法をご紹介します。無制限のワークフローと自動化プラットフォームの完全なコントロールを手に入れましょう。

構築内容

このチュートリアルを終えると、以下を実現できます:

  • ✅ HTTPSを備えた完全機能のn8nインストール
  • ✅ Let’s Encryptによる自動SSL証明書
  • ✅ ユーザーアカウント用メール統合
  • ✅ サーバー再起動後の自動起動
  • ✅ 本番環境対応のプロフェッショナルセットアップ

月額コスト:4.51ユーロ(CX11サーバー)+ドメイン費用

前提条件

  • サーバーIPを指すドメイン名
  • 基本的なコマンドライン知識
  • Hetzner Cloudアカウント

ステップ1:サーバーセットアップ

Hetzner Cloudサーバーの作成

  1. Hetzner Cloud Consoleにログイン
  2. 新規プロジェクトの作成
  3. 以下の仕様でサーバーを追加:
    • イメージ: Ubuntu 24.04 LTS
    • タイプ: CX11(vCPU 1基、RAM 4GB、ディスク 20GB)
    • ロケーション: ユーザーに最も近い場所を選択
    • SSHキー: 公開鍵を追加

初期サーバー設定

サーバーに接続します:

ssh root@YOUR_SERVER_IP

システムを更新します:

apt update && apt upgrade -y

ステップ2:Dockerのインストール

DockerおよびDocker Composeをインストールします:

# Install dependencies
apt install apt-transport-https ca-certificates curl software-properties-common gnupg -y

# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Create Docker network for our services
docker network create proxy

Dockerのインストールを確認します:

docker --version
docker compose version

ステップ3:Traefikリバースプロキシの設定

ディレクトリ構造を作成します:

mkdir -p /opt/traefik/data
cd /opt/traefik

Traefik設定ファイルを作成します:

nano /opt/traefik/data/traefik.yml

以下の設定を追加します:

api:
  dashboard: false

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com  # Change this!
      storage: acme.json
      httpChallenge:
        entryPoint: http

SSL証明書用のacme.jsonファイルを作成します:

touch /opt/traefik/data/acme.json
chmod 600 /opt/traefik/data/acme.json

Traefik Docker Composeファイルを作成します:

nano /opt/traefik/docker-compose.yml

以下の設定を追加します:

version: '3'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/etc/traefik/traefik.yml
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"

networks:
  proxy:
    external: true

ステップ4:SMTPリレーのセットアップ(推奨・任意)

メールサーバーディレクトリを作成します:

mkdir -p /opt/mailserver
cd /opt/mailserver

Docker Composeファイルを作成します:

nano /opt/mailserver/docker-compose.yml

以下の設定を追加します:

version: '3'

services:
  mailserver:
    image: bytemark/smtp
    restart: always
    networks:
      - proxy
    environment:
      - RELAY_HOST=smtp.gmail.com  # Change to your SMTP provider
      - RELAY_PORT=587
      - RELAY_USERNAME=your-email@gmail.com  # Change this
      - RELAY_PASSWORD=your-app-password     # Change this
      - MAIL_DOMAIN=yourdomain.com           # Change this
    ports:
      - "25:25"

networks:
  proxy:
    external: true

注意: Gmailの場合は以下が必要です:

  1. 2段階認証を有効化
  2. アプリパスワードを生成
  3. 通常のパスワードではなくアプリパスワードを使用

ステップ5:n8nの設定

n8nディレクトリを作成します:

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

Docker Composeファイルを作成します:

nano /opt/n8n/docker-compose.yml

以下の設定を追加します:

version: '3'

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com          # Change this!
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com  # Change this!
      
      # Email configuration
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - N8N_SMTP_SENDER=noreply@yourdomain.com  # Change this!
      
      # Important fixes for proxy setup
      - N8N_TRUST_PROXY_HEADER=true
      - N8N_RUNNERS_ENABLED=true
      
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"  # Change this!
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

ステップ6:自動起動用Systemdサービスの作成

Traefikサービス

nano /etc/systemd/system/traefik-docker.service

以下の設定を追加します:

[Unit]
Description=Traefik Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/traefik
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

メールサーバーサービス

nano /etc/systemd/system/mailserver-docker.service

以下の設定を追加します:

[Unit]
Description=Mailserver Docker Compose
Requires=docker.service
After=docker.service
Before=n8n-docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mailserver
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

n8nサービス

nano /etc/systemd/system/n8n-docker.service

以下の設定を追加します:

[Unit]
Description=n8n Docker Compose
Requires=docker.service
After=docker.service traefik-docker.service mailserver-docker.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n
ExecStartPre=/bin/bash -c 'until docker container inspect traefik > /dev/null 2>&1; do sleep 2; done'
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=30
TimeoutStartSec=180

[Install]
WantedBy=multi-user.target

サービスの有効化と起動

# Reload systemd daemon
systemctl daemon-reload

# Enable services to start on boot
systemctl enable traefik-docker.service
systemctl enable mailserver-docker.service
systemctl enable n8n-docker.service

# Start services
systemctl start traefik-docker.service
sleep 10
systemctl start mailserver-docker.service
sleep 10
systemctl start n8n-docker.service

ステップ7:DNS設定

ドメインをサーバーに向けます:

  1. ドメインレジストラ/DNSプロバイダーにアクセス
  2. Aレコードを作成:
    • 名前: n8n
    • タイプ: A
    • 値: YOUR_SERVER_IP
    • TTL: 300(または許可される最小値)

DNS伝播を待ちます(最大24時間かかることがありますが、通常はより速く完了します)。

ステップ8:インストールのテスト

サービスが稼働中か確認します:

docker ps

traefik、mailserver、n8nの3つのコンテナが稼働していることを確認してください。

n8nインスタンスにアクセスします:

https://n8n.yourdomain.com

n8nのセットアップページと緑のロックアイコン(HTTPS動作中)が表示されるはずです。

よくある問題のトラブルシューティング

SSL証明書が機能しない場合

Traefikのログを確認します:

docker logs traefik

主な原因:

  • DNSがサーバーを指していない
  • ファイアウォールがポート80/443をブロックしている
  • 設定内のドメインが誤っている

n8nにアクセスできない場合

n8nのログを確認します:

docker logs n8n-n8n-1

主な対処法:

  • すべてのファイルでドメイン設定が一致していることを確認
  • すべてのコンテナが同じネットワーク上にあることを確認

メールが機能しない場合

メールサーバーのログを確認します:

docker logs mailserver-mailserver-1

SMTPの認証情報と設定を確認してください。

再起動後にサービスが起動しない場合

サービスの状態を確認します:

systemctl status traefik-docker.service
systemctl status n8n-docker.service

必要に応じて再起動します:

systemctl restart traefik-docker.service
systemctl restart n8n-docker.service

メンテナンスとアップデート

定期メンテナンス

週次チェック:

# Check container status
docker ps

# Check disk space
df -h

# Check logs for errors
docker logs n8n-n8n-1 | grep -i error

月次アップデート:

# Update container images
cd /opt/n8n && docker compose pull && docker compose up -d
cd /opt/traefik && docker compose pull && docker compose up -d
cd /opt/mailserver && docker compose pull && docker compose up -d

# Clean up old images
docker system prune -f

データのバックアップ

バックアップスクリプトを作成します:

nano /opt/backup-n8n.sh

以下の内容を追加します:

#!/bin/bash
mkdir -p /opt/backups
tar -czf /opt/backups/n8n-backup-$(date +%Y%m%d).tar.gz /opt/n8n/data
find /opt/backups -name "n8n-backup-*.tar.gz" -mtime +30 -delete

実行権限を付与してcronに追加します:

chmod +x /opt/backup-n8n.sh

# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /opt/backup-n8n.sh

セキュリティ強化

ファイアウォールの設定

# Install UFW
apt install ufw

# Set defaults
ufw default deny incoming
ufw default allow outgoing

# Allow SSH
ufw allow 22

# Allow HTTP/HTTPS
ufw allow 80
ufw allow 443

# Enable firewall
ufw enable

SSHのセキュリティ強化

SSH設定を編集します:

nano /etc/ssh/sshd_config

以下の変更を加えます:

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

SSHを再起動します:

systemctl restart ssh

Fail2Banの設定

apt install fail2ban

# Copy default configuration
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Enable and start
systemctl enable fail2ban
systemctl start fail2ban

コスト内訳

月額コスト:

  • Hetzner CX11サーバー:4.51ユーロ
  • ドメイン(年間、変動あり):年間約10〜15ユーロ
  • 合計:月額約5〜6ユーロ

n8n Cloudとの比較:

  • n8n Starter:月額20ドル
  • n8n Pro:月額50ドル
  • 年間節約額:180〜540ドル

セットアップのスケールアップ

複数のn8nインスタンス

異なるチーム向けに複数の独立したn8nインスタンスを実行できます:

/opt/n8n-team2/docker-compose.yml を作成します:

version: '3'
services:
  n8n-team2:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=team2.yourdomain.com
      # ... rest of configuration
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n-team2.rule=Host(`team2.yourdomain.com`)"
      - "traefik.http.routers.n8n-team2.entrypoints=https"
      - "traefik.http.routers.n8n-team2.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n-team2.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

サーバーリソースのアップグレード

より高い性能が必要な場合は、Hetznerサーバーをアップグレードしてください:

  • CX21:vCPU 2基、RAM 8GB(月額8.46ユーロ)
  • CX31:vCPU 2基、RAM 16GB(月額16.07ユーロ)

まとめ

ホスティングソリューションのほんの一部のコストで、本番環境対応のn8nインストールが完成しました。完全なコントロールを維持しながら、自動HTTPS、メール機能、堅牢なサービス管理を備えたセットアップです。

このアプローチの主なメリット:

  • コスト効率:年間数百ドルの節約
  • 完全なコントロール:使用制限や制約なし
  • プライバシー:データは自社インフラ上に保持
  • カスタマイズ性:必要に応じて変更・拡張可能

この設定は本番環境でテスト済みであり、コストの一部でエンタープライズグレードの信頼性を提供します。

tvaについて

tvaは、データベースシステム、クラウド環境、グローバルサプライチェーンの包括的なインフラ管理を提供しています。厳格なセキュリティプロトコルとパフォーマンス最適化を組み合わせた体系的なアプローチにより、戦略的アドバイザリーサービスでデジタル能力と物理資産の両方を精密に調整し、あらゆる業務において最高水準の卓越した運用とコンプライアンスを維持しています。

サービスの詳細については tva.sg をご覧ください。