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:
<任意のパスワード>
-
ID:
- n8nのパスワードは初回ログイン時に手動で設定
セキュリティ上は、運用開始後に必ずより強固なパスワードへ変更してください。
全体構成
-
ディレクトリ:
/opt/n8n
-
コンテナ:
-
n8n
(アプリ) -
caddy
(リバースプロキシ & Let’s Encrypt) -
watchtower
(自動更新)
-
- TLS: Caddy による自動証明書取得(HTTP-01)
- 認証: まずは Caddy 側で Basic 認証(ダブルプロンプトを避けたい場合は n8n 内蔵 Basic 認証に切替)
- バックアップ: cron で毎日バックアップ、14日を経過したバックアップを自動削除
0) 事前作業(GCP と DNS)
-
静的外部 IP を予約(推奨)
VPC ネットワーク → 外部 IP アドレス → 静的で予約(例:n8n-server-01
, IPアドレス:xxx.xxx.xxx.xxx) -
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 認証に切替える場合:
Caddyfile
のbasic_auth { ... }
ブロックを削除.env
のN8N_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.xxx
とcurl -I http://n8n.xxxx.xxx
で確認。 -
Caddyfile の反映
sudo docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
13) 最短チェックリスト
- 静的 IP 予約 →
n8n.xxxx.xxx
を A レコードで紐付け - GCE VM(Ubuntu 22.04 / e2-small / HTTP,HTTPS 許可)作成
- Docker & compose plugin インストール
-
/opt/n8n
作成 →.env
とCaddyfile
とdocker-compose.yml
配置 - Caddy ハッシュ生成(または本書の参考ハッシュを使用)
-
docker compose up -d
で起動 -
https://n8n.xxxx.xxx
へアクセスして確認 -
systemd
自動起動、Watchtower 稼働、バックアップ cron 設定を確認