コンテンツにスキップ

🌐 VPS 環境 再構築 Runbook

📁 docs/ops/runbook/vps.md

[!IMPORTANT] 最終検証日: 2026-07-13 環境変更時(OS再インストール・パッケージ更新・サービス追加)は必ずこの日付を更新すること。

対象環境

項目 仕様
プロバイダ Oracle Cloud Infrastructure(Always Free Tier)
OS Ubuntu 22.04 ARM64
主な用途 Bot 常時起動・cron・Webhook 受信
ドメイン kzlab.com(Cloudflare 管理)

⚡ クイックスタート(全ステップ一覧)

Phase 1: 初期設定(ユーザー・SSH・ファイアウォール)
Phase 2: 開発ツール(Python・Git・pip)
Phase 3: 1Password CLI(op)
Phase 4: MyLab セットアップ
Phase 5: サービス設定(systemd・cron)
Phase 6: Cloudflare Named Tunnel
Phase 7: 監視・ログ設定

Phase 1: 初期設定

1-1. SSH 接続確認

# Mac から接続
ssh ubuntu@<VPS_IP>

1-2. システム更新

sudo apt update && sudo apt upgrade -y
sudo reboot

1-3. 作業ユーザー確認

whoami  # ubuntu であることを確認

1-4. 必要パッケージ

sudo apt install -y \
  git curl wget unzip jq \
  python3 python3-pip python3-venv \
  build-essential libssl-dev \
  tmux htop

1-5. ファイアウォール設定

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp   # HTTP
sudo ufw allow 443/tcp  # HTTPS
sudo ufw enable
sudo ufw status

Phase 2: 開発ツール

2-1. Git 設定

git config --global user.name "KZ55230"
git config --global user.email "73998660+KZ55230@users.noreply.github.com"

2-2. Python 環境

# pyenv インストール
curl https://pyenv.run | bash

# ~/.bashrc に追加
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

pyenv install 3.12.9
pyenv global 3.12.9
python3 --version

2-3. GitHub CLI

curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
  | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
  | sudo tee /etc/apt/sources.list.d/github-cli.list
sudo apt update && sudo apt install gh -y

Phase 3: 1Password CLI

# インストール
curl -sS https://downloads.1password.com/linux/keys/1password.asc \
  | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg
echo 'deb [arch=arm64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/arm64 stable main' \
  | sudo tee /etc/apt/sources.list.d/1password.list
sudo apt update && sudo apt install 1password-cli -y

# サービスアカウントトークンの設定
mkdir -p ~/.config/op
echo "(1Password サービスアカウントトークン)" > ~/.config/op/service_account_token
chmod 600 ~/.config/op/service_account_token

# 動作確認
export OP_SERVICE_ACCOUNT_TOKEN=$(cat ~/.config/op/service_account_token)
op whoami

[!NOTE] VPS 用のサービスアカウントトークンは Mac とは別のものを使用する。
1Password 管理コンソール(1password.com/integrations)で発行。


Phase 4: MyLab セットアップ

4-1. リポジトリのクローン

cd ~
git clone https://github.com/KZ55230/MyLab.git
cd MyLab

4-2. Python 仮想環境

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements-project.txt

4-3. 環境変数設定

# ~/.bashrc に追加
cat >> ~/.bashrc << 'EOF'
export OP_SERVICE_ACCOUNT_TOKEN=$(cat ~/.config/op/service_account_token)
export GH_TOKEN=$(op read "op://MyLab/MyLab - Github Pat/token")
EOF
source ~/.bashrc

Phase 5: サービス設定

5-1. systemd サービス(例: discord-notifier)

sudo tee /etc/systemd/system/discord-notifier.service << 'EOF'
[Unit]
Description=Discord Notifier Bot
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/MyLab
Environment=PATH=/home/ubuntu/MyLab/.venv/bin
ExecStart=/home/ubuntu/MyLab/.venv/bin/python scripts/discord_notifier.py
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable discord-notifier
sudo systemctl start discord-notifier
sudo systemctl status discord-notifier

5-2. 現在稼働中のサービス

サービス名 スクリプト 備考
(未設定)

[!TIP] 新しいサービスを追加したら上記の表を更新すること。

5-3. cron 設定確認

crontab -l

5-4. 現在の cron 一覧

スケジュール コマンド 用途
0 7 * * * cd ~/MyLab && .venv/bin/python scripts/sync_vps_inventory.py VPS インベントリ同期

Phase 6: Cloudflare Named Tunnel

[!NOTE] ドメイン kzlab.com は Cloudflare で管理。Tunnel で VPS を外部公開。

# cloudflared インストール
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb \
  -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# Tunnel 認証(ブラウザ認証が必要なため Mac で実施してトークンを転送)
# cloudflared tunnel login

# 既存の Tunnel 設定を適用
cp ~/MyLab/configs/cloudflared/config.yml ~/.cloudflared/config.yml

# サービス化
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl status cloudflared

Phase 7: 監視・ログ

7-1. ログ確認

# systemd サービスのログ
journalctl -u discord-notifier -f

# cron ログ
grep CRON /var/log/syslog | tail -20

7-2. ディスク確認

df -h
du -sh ~/MyLab/

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

SSH 接続できない

# Oracle Cloud のセキュリティリスト(ファイアウォールルール)を確認
# コンソール → ネットワーキング → セキュリティリスト → イングレスルール
# ポート 22 (TCP) が許可されているか確認

サービスが起動しない

# ログ確認
journalctl -u <service-name> --no-pager -n 50

# 権限確認
ls -la ~/MyLab/scripts/
chmod +x ~/MyLab/scripts/target_script.py

1Password CLI が認証エラー

# トークンを再設定
cat ~/.config/op/service_account_token
export OP_SERVICE_ACCOUNT_TOKEN=$(cat ~/.config/op/service_account_token)
op whoami

📚 関連ドキュメント