検証用の安い海外VPSが欲しいが、SSH鍵やFirewallで自分を締め出すのが怖い——という前提で書きます。結論: 先に鍵、次に Tokyo の最小 Ubuntu、繋がったら用途別(systemd/Docker/WordPress)へ進み、不要なら Destroy。個人開発なら Ubuntu 24.04 LTS(または現行LTS)が無難です。EA/WindowsはWindows・Botへ。

デプロイ手順

  1. Products(製品)Deploy / Cloud Compute(デプロイ/クラウドコンピュート)
  2. Location(リージョン): Tokyo
  3. Image(OSイメージ): Ubuntu 24.04 LTS x64
  4. Plan(プラン): 最小〜中位(後から変更・作り直し可)
  5. SSH Keys(SSH鍵): 事前登録した公開鍵(id_ed25519_vultr)を選択
  6. Deploy Now(今すぐデプロイ)

起動直後(Linux)— ユーザー名の段階

  1. 初回ログイン — インスタンス詳細に表示されるユーザー(多くは root または linuxuser)で入る
  2. 一般ユーザー作成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-upgrades

1GBプランのとき — 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 myapp

Nodeなら pm2(pm2 startpm2 startuppm2 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 の対応例: hostHOSTkeySSH_KEYusernamedeploy。式構文は 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 に入れない
  • サーバー側 .envchmod 600、所有者は実行ユーザー
  • GitHub Secrets にはデプロイ用SSH鍵とホストのみ
  • 漏れたらローテーション(鍵再発行・パスワード変更)

Webサイト運営者向け:公開までの次の一手

共用サーバーの制約を超えて WordPress や動的サイトを載せたいが、TLS・メール・障害が不安——という方向けです。静的サイトだけなら Cloudflare Pages 等の方が安いことが多いです(他社比較)。動的PHP・WordPress・独自常駐が必要ならこの節へ。開発者向けの Docker/systemd は上の目次から戻ってください。

WordPressのみ・日本語サポート優先なら国内共用サーバーも候補です。常駐プロセスや root が要るなら VPS。

  1. ドメインのDNSで A レコードをサーバーIPへ向ける
  2. Nginx を入れ、80/443を開放する
    sudo apt install -y nginx
    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx Full'
    sudo ufw enable
  3. サーバブロックを置き、有効化する(下の Nginx + PHP-FPM 例)
  4. 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 — 公開前チェックリスト

  1. sudo apt install -y mysql-server php-fpm php-mysql php-xml php-curl unzip
  2. 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;
  3. 公式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
  4. ブラウザでインストールウィザードを完了
  5. wp-config.php の権限を適切に(例: 640)
  6. 設定 → パーマリンクを「投稿名」等に変更し、保存してリライトルールを反映
  7. HTTPS強制 — certbot 成功後、WPの一般設定でサイトURL/WordPressアドレスを https:// に揃える(www/非wwwも統一)
  8. 強力な管理者パスワード、不要テーマ/プラグイン削除
  9. xmlrpc を使わないなら無効化を検討
  10. 管理画面はIP制限または追加認証
  11. 自動更新方針を決め、バックアップ(後述)を先に用意

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 を監視します。

  1. 外形監視アラート
  2. 証明書期限(ブラウザ警告/sudo certbot certificates
  3. DNSの A が旧IPのまま残っていないか
  4. SSHできるか
  5. Nginx / PHP-FPM の状態(systemctl status
  6. ディスク空き(df -h)と inode(df -i)・ログ肥大(/var/log
  7. 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許可が必要
VPCWebと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のみです。

公式料金表 ↗