検証用の安い海外VPSが欲しいが、SSH鍵やFirewallで自分を締め出すのが怖い——という前提で書きます。結論: 先に鍵、次に Tokyo の最小 Ubuntu、繋がったら用途別(systemd/Docker/WordPress)へ進み、不要なら Destroy。個人開発なら Ubuntu 24.04 LTS(または現行LTS)が無難です。EA/WindowsはWindows・Botへ。
デプロイ手順
- Products(製品) → Deploy / Cloud Compute(デプロイ/クラウドコンピュート)
- Location(リージョン): Tokyo
- Image(OSイメージ): Ubuntu 24.04 LTS x64
- Plan(プラン): 最小〜中位(後から変更・作り直し可)
- SSH Keys(SSH鍵): 事前登録した公開鍵(
id_ed25519_vultr)を選択 - Deploy Now(今すぐデプロイ)
起動直後(Linux)— ユーザー名の段階
- 初回ログイン — インスタンス詳細に表示されるユーザー(多くは
rootまたはlinuxuser)で入る - 一般ユーザー作成 — SSH・セキュリティどおり
deployを作り、以降はそちらを使う
# 初回(パネル表示のユーザー名に合わせる)
ssh -i ~/.ssh/id_ed25519_vultr root@YOUR_SERVER_IP
# または
ssh -i ~/.ssh/id_ed25519_vultr linuxuser@YOUR_SERVER_IP
# deploy 作成後
ssh -i ~/.ssh/id_ed25519_vultr deploy@YOUR_SERVER_IP
sudo apt update && sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Tokyo
# 自動セキュリティ更新(再起動方針は自分で決める。kernel更新後は計画再起動)
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades1GBプランのとき — swap
2GB以上なら必須ではありません。1GBで Node / Docker が OOM しやすい場合のみ。
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab常駐アプリ(systemd)
# /etc/systemd/system/myapp.service 例
[Unit]
Description=My Node App
After=network.target
[Service]
User=deploy
WorkingDirectory=/home/deploy/app
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myappNodeなら pm2(pm2 start → pm2 startup → pm2 save)でも同様です。
Docker・GitHub Actions
sudo apt install -y docker.io docker-compose-plugin
sudo usermod -aG docker deploy
# ログインし直してから
docker run --rm hello-world# docker-compose.yml(最小例)
services:
web:
image: nginx:alpine
ports:
- "8080:80"
restart: unless-stopped
env_file:
- .env下の YAML はこのままでは動きません。Secrets の対応例: host ← HOST、key ← SSH_KEY、username は deploy。式構文は appleboy/ssh-action の README を正とします。
# .github/workflows/deploy.yml の骨格例
name: deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: appleboy/ssh-action@v1.0.3
with:
host: # GitHub Secrets の HOST に置き換え
username: deploy
key: # GitHub Secrets の SSH_KEY に置き換え
script: |
cd /home/deploy/app
git pull
docker compose up -d --buildシークレット管理チェックリスト
- APIキー・DBパスワードは Git に入れない
- サーバー側
.envはchmod 600、所有者は実行ユーザー - GitHub Secrets にはデプロイ用SSH鍵とホストのみ
- 漏れたらローテーション(鍵再発行・パスワード変更)
Webサイト運営者向け:公開までの次の一手
共用サーバーの制約を超えて WordPress や動的サイトを載せたいが、TLS・メール・障害が不安——という方向けです。静的サイトだけなら Cloudflare Pages 等の方が安いことが多いです(他社比較)。動的PHP・WordPress・独自常駐が必要ならこの節へ。開発者向けの Docker/systemd は上の目次から戻ってください。
WordPressのみ・日本語サポート優先なら国内共用サーバーも候補です。常駐プロセスや root が要るなら VPS。
- ドメインのDNSで
AレコードをサーバーIPへ向ける - Nginx を入れ、80/443を開放する
sudo apt install -y nginx sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable - サーバブロックを置き、有効化する(下の Nginx + PHP-FPM 例)
- Let's Encrypt — パッケージ導入 → 初回取得 → renew 確認
sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com -d www.example.com sudo certbot renew --dry-run
Nginx + PHP-FPM(コピペ骨格)
# /etc/nginx/sites-available/example.com
# fastcgi_pass のソケットは ls /run/php/ で実在パスを確認
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# PHPソケット確認
ls /run/php/表示速度
# nginx.conf の http ブロック内(例)
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
# 静的アセットには expires 7d と Cache-Control: publicオリジン(このVPSのNginx)で圧縮・キャッシュヘッダーを整え、CDNが必要なら前段に Cloudflare を置く、という役割分担が現実的です。画像の WebP 化や重いキャッシュプラグインはオリジンを軽く保ち、CDN/プラグイン側で行うのが無難です。
WordPress等CMS — 公開前チェックリスト
sudo apt install -y mysql-server php-fpm php-mysql php-xml php-curl unzip- MySQLでDBとユーザーを作成する
sudo mysql CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; FLUSH PRIVILEGES; EXIT; - 公式zipを展開する
cd /tmp wget https://wordpress.org/latest.zip sudo unzip latest.zip -d /var/www/ sudo mv /var/www/wordpress /var/www/example.com sudo chown -R www-data:www-data /var/www/example.com - ブラウザでインストールウィザードを完了
wp-config.phpの権限を適切に(例: 640)- 設定 → パーマリンクを「投稿名」等に変更し、保存してリライトルールを反映
- HTTPS強制 — certbot 成功後、WPの一般設定でサイトURL/WordPressアドレスを
https://に揃える(www/非wwwも統一) - 強力な管理者パスワード、不要テーマ/プラグイン削除
- xmlrpc を使わないなら無効化を検討
- 管理画面はIP制限または追加認証
- 自動更新方針を決め、バックアップ(後述)を先に用意
TLS更新(初回後)
sudo certbot renew --dry-run
systemctl list-timers | grep certbotメール・DNS
VPS上で自前MTAを立てるのは非推奨です。SendGrid / Amazon SES 等の外部SMTPを使い、レジストラのDNSに SPF / DKIM / DMARC を入れます。include: の値は各ベンダーDocsの指示に置換してください(下は形の例のみ)。
- SPF — TXT(形の例:
v=spf1 include:VENDOR_VALUE ~all) - DKIM — ベンダーが発行する CNAME / TXT
- DMARC — TXT(形の例:
v=DMARC1; p=none; rua=mailto:you@example.com)
外形監視と障害時の切り分け
status.vultr.com ↗ はインフラ側。自サイトは UptimeRobot 等で HTTPS を監視します。
- 外形監視アラート
- 証明書期限(ブラウザ警告/
sudo certbot certificates) - DNSの A が旧IPのまま残っていないか
- SSHできるか
- Nginx / PHP-FPM の状態(
systemctl status) - ディスク空き(
df -h)と inode(df -i)・ログ肥大(/var/log) - Vultr Status・インスタンスコンソール
スナップショット・バックアップ
二段構え — (1) 週次スナップショット(丸ごと戻し)(2) 日次のDBダンプ/重要ファイル。保存GB課金(目安 $0.05/GB/月)。
APIキーは Account(アカウント)→ API で発行。Git に載せない。
# vultr-cli 例(要APIキー)— 直近2世代だけ残す運用を推奨
vultr-cli snapshot create --instance-id YOUR_ID --description "weekly"
# DB例(WordPress等)
mysqldump -u USER -p DBNAME > /home/deploy/backups/db-$(date +%F).sqlスケール寄りの機能 — 今いるか
| 機能 | 今いるか |
|---|---|
| IPv6 | クライアントがIPv6前提なら。DNS AAAA とFW許可が必要 |
| VPC | WebとDBを分けたら導入。単一アプリ1台なら不要なことが多い |
| ロードバランサー | 複数インスタンスが必要になってから。個人サイトでは過剰なことが多い |
IaC・自動化
初回はGUIで十分です。同じ構成を繰り返すときだけ公式 Terraform / CLI / API を使います。Terraform provider ↗、vultr-cli ↗、REST API ↗。
# 公式Docsの例を正とする。骨格イメージのみ
# resource "vultr_instance" "app" {
# region = "nrt" # Tokyo 等。公式の region code を確認
# plan = "vc2-1c-1gb"
# os_id = 2284 # Ubuntu 等。時点で変わる
# ssh_key_ids = [vultr_ssh_key.main.id]
# }アカウント未作成なら登録・初期設定へ。特典付き登録は出口ページの提携CTAのみです。