0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Compute Engineにn8nとCaddy(Basic認証)をインストールし、n8nの自動更新も設定

Posted at

AIノーコード自動化ツールのn8nをGoogle CloudのCompute Engineにインストールする手順です。今回はn8nをDockerにインストールし、さらにn8nの自動更新やバックアップファイルの生成、Basic認証のインストールまで行います。

n8n on Google Compute Engine (Docker) インストール手順

要件(本書で満たすもの)

  • Docker でコンテナ化(docker compose 採用)
  • サブドメインで公開:n8n.xxxx.xxx
  • Basic 認証:Caddy(プロキシ前段)/必要に応じて n8n 内蔵 Basic 認証へ切替可
  • インストールディレクトリは個人ディレクトリ以外/opt/n8n
  • Watchtower による Docker イメージの自動更新(ラベルベース運用)
  • バックアップ/opt/n8n/data(n8nの永続データ)と/opt/n8n/caddy(証明書等)を tar 取得し、14日ローテーション

認証情報(指定どおりに設定)

  • Basic 認証
    • ID<任意のメールアドレス>
    • Password<任意のパスワード>
  • n8nのパスワードは初回ログイン時に手動で設定

セキュリティ上は、運用開始後に必ずより強固なパスワードへ変更してください。


全体構成

  • ディレクトリ: /opt/n8n
  • コンテナ:
    • n8n(アプリ)
    • caddy(リバースプロキシ & Let’s Encrypt)
    • watchtower(自動更新)
  • TLS: Caddy による自動証明書取得(HTTP-01)
  • 認証: まずは Caddy 側で Basic 認証(ダブルプロンプトを避けたい場合は n8n 内蔵 Basic 認証に切替)
  • バックアップ: cron で毎日バックアップ、14日を経過したバックアップを自動削除

0) 事前作業(GCP と DNS)

  1. 静的外部 IP を予約(推奨)
    VPC ネットワーク → 外部 IP アドレス → 静的で予約(例: n8n-server-01, IPアドレス:xxx.xxx.xxx.xxx)
  2. DNS の A レコード追加
    n8n.xxxx.xxx → 上で予約した静的 IP
    ホスト名(Name/Host): n8n(または n8n.xxxx.xxx.)
    種類(Type): A
    値(IPv4): xxx.xxx.xxx.xxx ※上記のIPアドレス
    TTL: 3600

動的 IP でも動作しますが、証明書や DNS の安定のため静的 IP を推奨します。


1) VM インスタンス作成(GCE)

  • 名前 n8n-server

  • リージョン asia-northeast1(東京)

  • ゾーン 指定なし

  • マシンタイプ: e2-micro (パフォーマンス不足を感じたらe2-small(2 vCPU / 2GB)などに後で変更可能)

  • OS: Ubuntu 22.04 LTS(または Debian 12)

  • ブートディスクの種類:バランス永続ディスク

  • ブートディスク: 20GB 以上

  • ネットワーキング

  • ファイアウォール: 「HTTP」「HTTPS」を 許可

  • ネットワーク インターフェース

  • サブネットワーク default IPv4

  • 外部IPv4アドレス n8n-server-01 を選択

  • サービスアカウント: 必要最低限(特別な権限が不要ならデフォルトで可)

VPC 側のファイアウォールで 80/TCP, 443/TCP(必要あれば 22/TCP) を開放。


2) VM に SSH & Docker インストール

# 更新
sudo apt-get update && sudo apt-get upgrade -y

# 便利ツール
sudo apt-get install -y ca-certificates curl gnupg

# Docker リポジトリ追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release; echo $UBUNTU_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# docker の起動 & 自動起動
sudo systemctl enable --now docker

3) ディレクトリ作成(個人外)

個人ディレクトリにインストールしてしまうと、退職や担当変更の際に影響するので共用ディレクトリにインストールするようにします。

sudo mkdir -p /opt/n8n/{caddy,data,scripts}
sudo chown -R root:root /opt/n8n
sudo chmod -R 755 /opt/n8n
cd /opt/n8n

4) .env(n8n 用環境変数)作成

重要: N8N_ENCRYPTION_KEY をランダム値にするため、以下を実行。

openssl rand -base64 24

/opt/n8n/.env

sudo apt-get update
sudo apt-get install -y nano
sudo nano /opt/n8n/.env
# === n8n 基本 ===
N8N_HOST=n8n.xxxx.xxx
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.xxxx.xxx/
N8N_EDITOR_BASE_URL=https://n8n.xxxx.xxx/
GENERIC_TIMEZONE=Asia/Tokyo
TZ=Asia/Tokyo

# セキュリティ(必須)
# 例: openssl rand -base64 24
# 以下を上記で生成されたランダム値に書き換える
N8N_ENCRYPTION_KEY=xxxxxxxxxxxxx

# テレメトリを切る場合
N8N_DIAGNOSTICS_ENABLED=false
N8N_VERSION_NOTIFICATIONS_ENABLED=false

# (オプション)n8n 内蔵 Basic 認証を使う場合は有効化
# ダブルプロンプトを避けたい場合は Caddy 側の basic_auth を無効にし、こちらを有効化してください。
# N8N_BASIC_AUTH_ACTIVE=true
# N8N_BASIC_AUTH_USER=info@xxxx.xxx
# N8N_BASIC_AUTH_PASSWORD=7i+yB%VL29
sudo chmod 640 /opt/n8n/.env
sudo chown root:root /opt/n8n/.env
# cd /opt/n8n && sudo docker compose up -d --force-recreate

5) Caddy 用 Basic 認証パスワードのハッシュ作成(または下記のハッシュを使用)

5-1) Caddy で生成する場合(推奨)

# 改行コードが含まれると正しく実行されないので、下記をコピペするときは改行コードを含めないこと!
sudo docker run --rm caddy:2 caddy hash-password 
# プロンプトが出たらパスワードを入力

5-2) 生成済み bcrypt ハッシュ(コスト 14)を使う場合

下記は本ドキュメントで生成した参考ハッシュです。実運用では 5-1 の方法で毎回新規に生成することを推奨します。

$2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxx

6) Caddyfile 作成

/opt/n8n/Caddyfile

sudo nano /opt/n8n/Caddyfile
{
        email メールアドレス
}

n8n.xxxx.xxx {
        @noauth path /healthz /webhook* /webhook-test* /favicon.ico /assets/*

        handle @noauth {
                reverse_proxy n8n:5678 {
                        transport http {
                                read_timeout 5m
                                write_timeout 5m
                        }
                }
        }

        # それ以外は Basic 認証で保護(ダブルプロンプトを避けたい場合は、この block を削除し、.env の n8n 内蔵 basic auth を有効に)
        handle {
                basic_auth {
                        "メールアドレス" $2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxx
                }
                reverse_proxy n8n:5678 {
                        transport http {
                                read_timeout 5m
                                write_timeout 5m
                        }
                }
        }
}

7) docker-compose.yml 作成(Watchtower 付き)

/opt/n8n/docker-compose.yml

sudo nano /opt/n8n/docker-compose.yml
services:
  n8n:
    image: n8nio/n8n:latest
    restart: always # unless-stopped
    env_file:
      - .env
    ports:
      - "127.0.0.1:5678:5678"   # 外部に直接晒さない
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - n8n_net
    labels:
      com.centurylinklabs.watchtower.enable: "true"

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy/data:/data
      - ./caddy/config:/config
    networks:
      - n8n_net
    labels:
      com.centurylinklabs.watchtower.enable: "true"

  watchtower:
    image: containrrr/watchtower
    restart: always #unless-stopped
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --schedule "0 30 3 * * *" --label-enable --cleanup
    # 毎日 03:30 にラベル付きコンテナ(n8n/caddy)のみを更新、古いイメージは削除

networks:
  n8n_net:
    driver: bridge

8) 起動

cd /opt/n8n
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
  • 数十秒後、Caddy が Let’s Encrypt で証明書を取得(初回のみ)
  • ブラウザで https://n8n.xxxx.xxx にアクセス
    • Caddy 側 Basic 認証のプロンプト → 認証成功後、n8n のセットアップ/ログイン画面

Caddy Basic 認証を止めて n8n 内蔵 Basic 認証に切替える場合:

  • Caddyfilebasic_auth { ... } ブロックを削除
  • .envN8N_BASIC_AUTH_* を有効化
  • sudo docker compose up -d --force-recreate で反映

9) 自動起動(サーバ再起動後も立ち上げ)

/etc/systemd/system/n8n-compose.service

sudo nano /etc/systemd/system/n8n-compose.service
[Unit]
Description=n8n via docker compose
Requires=docker.service
After=docker.service

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

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now n8n-compose

10) バックアップ(tar で 14日ローテーション)

10-1) スクリプト作成

/opt/n8n/scripts/backup.sh

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/opt/n8n/backups"
SOURCE_DIR="/opt/n8n"
DATE="$(date +%F)"
mkdir -p "$BACKUP_DIR"

# n8n の永続データと Caddy の証明書/設定をまとめて取得
tar -czf "$BACKUP_DIR/n8n-backup-${DATE}.tar.gz" -C "$SOURCE_DIR" data caddy

# 14日より古いバックアップを削除
find "$BACKUP_DIR" -type f -name "n8n-backup-*.tar.gz" -mtime +14 -delete
sudo chmod +x /opt/n8n/scripts/backup.sh
sudo mkdir -p /opt/n8n/backups

10-2) cron 登録(毎日 03:10)

sudo apt update
sudo apt install cron
sudo systemctl enable cron
sudo systemctl start cron

# root の cron に追加 以下をコピペして実行
( crontab -l 2>/dev/null; echo "10 3 * * * /opt/n8n/scripts/backup.sh" ) | sudo crontab -

確認方法は以下で、"10 3 * * * /opt/n8n/scripts/backup.sh"が返ってくればOK
sudo crontab -l

バックアップは /opt/n8n/backups/n8n-backup-YYYY-MM-DD.tar.gz に作成されます。


11) 動作確認 & 運用

  • 認証テスト(ローカルから)

    curl -I -u 'メールアドレス:パスワード(平文)' https://n8n.xxxx.xxx
    

    HTTP/2 200 になれば OK。401 の場合は Caddy 側 Basic 認証設定を再確認。

  • Watchtower の状態

    sudo docker compose logs -f watchtower
    
  • バックアップの確認

    ls -lh /opt/n8n/backups
    

12) つまずきポイントと対処

  • Basic 認証の再ポップアップ
    ブラウザや拡張の影響、/rest/* への認証が失われるケースが稀にあります。
    → 解決策: Caddy 側の Basic 認証を無効化し、n8n 内蔵 Basic 認証を有効にする。

  • 証明書が取れない
    DNS A レコード未反映 / ポート 80 が閉じている可能性。
    dig n8n.xxxx.xxxcurl -I http://n8n.xxxx.xxx で確認。

  • Caddyfile の反映

    sudo docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
    

13) 最短チェックリスト

  1. 静的 IP 予約 → n8n.xxxx.xxx を A レコードで紐付け
  2. GCE VM(Ubuntu 22.04 / e2-small / HTTP,HTTPS 許可)作成
  3. Docker & compose plugin インストール
  4. /opt/n8n 作成 → .envCaddyfiledocker-compose.yml 配置
  5. Caddy ハッシュ生成(または本書の参考ハッシュを使用)
  6. docker compose up -d で起動
  7. https://n8n.xxxx.xxx へアクセスして確認
  8. systemd 自動起動、Watchtower 稼働、バックアップ cron 設定を確認
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?