DevOctane
VPSDockerXserverインフラ

【2026年版】Xserver VPS + Dockerで個人開発環境を構築する

2026.05.2443 min read
【2026年版】Xserver VPS + Dockerで個人開発環境を構築する

「個人開発をしているけど、ローカルだけで完結してしまっている」「VPSを借りたけど何をすればいいかわからない」——こういった悩みは意外と多い。

この記事ではXserver VPSを使ってDockerベースの個人開発環境・本番環境を一から構築する手順を解説する。コマンド一つひとつ丁寧に説明するので、VPS初心者のエンジニアでも迷わず完成できる構成だ。

この記事でわかること
① Xserver VPSの料金・スペック・選び方
② VPS初期設定(ユーザー・SSH・ファイアウォール)
③ Dockerインストールとdocker-compose設定
④ Next.js + PostgreSQLのコンテナ構成
⑤ Nginx + SSL(Let's Encrypt)でHTTPS化
⑥ GitHub Actions自動デプロイの設定
⑦ 運用コスト最適化のTips

Xserver VPSとは?なぜVPSが個人開発に向いているか

Xserver VPSはXserver株式会社が提供するVPS(仮想専用サーバー)サービスだ。国内最大級のレンタルサーバー「エックスサーバー」の技術力を活かしたVPS製品で、2022年のサービス開始以来、個人開発者・エンジニアを中心に急速に普及している。

VPS vs 共有サーバー vs クラウド

個人開発のインフラ選択肢は大きく3つある。

比較項目共有サーバーVPSクラウド(AWS EC2等)
月額費用500〜2,000円600〜3,000円1,500〜10,000円+
root権限なしありあり
Docker利用不可可能可能
スペック固定固定(共有)固定柔軟にスケール
設定の自由度低い高い高い
初期学習コスト低い中程度高い

個人開発においてVPSが選ばれる理由は固定費で予算が読めることDockerが使えることの2点に尽きる。クラウドのようにトラフィック次第でコストが跳ね上がる心配がなく、月数百〜数千円の定額で本番環境を維持できる。

また、Docker環境を使えばローカルと本番の環境差を最小化できるため、「ローカルでは動くのに本番で動かない」という問題が大幅に減る。

Xserver VPSを選ぶ理由

国内VPSには他にもさくらVPS・ConoHa VPS・KAGOYA VPS等がある。その中でXserver VPSを選ぶ理由は以下の通りだ。

  • 高速NVMe SSD採用: 読み書き速度が従来HDDの数倍。Dockerイメージのビルドや展開が速い
  • 国内データセンター: 東京・大阪の国内2リージョンで低レイテンシ
  • 高い回線品質: 国内最大手エックスサーバーのネットワークインフラ
  • 豊富なOSイメージ: Ubuntu・Debian・CentOS Stream・AlmaLinux等から選べる
  • コスパ良好: 2GBメモリ・2vCPUが月額1,500円前後(2026年5月時点)

Xserver VPSの最新キャンペーン
Xserver VPSは定期的に初期費用無料・月額割引キャンペーンを実施している。公式サイトで確認してから申し込むとお得だ。

Xserver VPSの料金・プランを確認する →

※本リンクはアフィリエイトリンクです

Xserver VPSの料金・スペック比較

2026年5月時点のプラン構成は以下の通りだ。個人開発であれば2GBプランで十分なケースがほとんどだ。

プランメモリvCPUSSD月額(目安)
1GBプラン1GB1コア100GB約850円
2GBプラン2GB2コア100GB約1,500円
4GBプラン4GB4コア100GB約3,000円
8GBプラン8GB8コア100GB約5,500円

個人開発での推奨プランの選び方

  • ブログ・ポートフォリオ・小規模API: 2GBプラン(月1,500円程度)
  • 複数サービスを同時に動かす場合: 4GBプラン
  • DBの書き込みが多い・機械学習ジョブを回す: 8GBプラン

Dockerを使う場合、コンテナ自体が数百MB〜1GBのメモリを消費するため、1GBプランは最低限のAPIサーバーのみという状況にしかならない。2GBあれば、Next.js + PostgreSQL + Nginxの3コンテナ構成を快適に動かせる。

STEP 1: Xserver VPSの初期設定

VPSを契約したら最初に行う作業は大きく4つある。

  1. SSHでのログイン確認
  2. 一般ユーザーの作成とsudo権限付与
  3. rootログインの無効化
  4. UFW(ファイアウォール)の設定

1-1. SSHでのログイン確認

VPS契約後、コントロールパネルからIPアドレスとrootのパスワードを確認する。最初はrootでログインする。

初回SSH接続
ssh root@YOUR_SERVER_IP

接続できたら最初にパッケージを更新する。

パッケージ更新
apt update && apt upgrade -y

1-2. 一般ユーザーの作成

セキュリティの基本として、rootで作業し続けるのは危険だ。一般ユーザーを作成してsudo権限を付与する。

ユーザー作成とsudo権限付与
# ユーザー作成(例: devuser)
adduser devuser
 
# sudoグループに追加
usermod -aG sudo devuser
 
# ユーザーに切り替えて確認
su - devuser
sudo whoami  # "root" と表示されればOK

1-3. SSH鍵認証の設定

パスワード認証は総当たり攻撃のリスクがある。SSH鍵認証に切り替える。

ローカルマシンで鍵ペアを生成する(まだない場合):

ローカルでSSH鍵生成
ssh-keygen -t ed25519 -C "your-email@example.com"
# パスフレーズを設定する(推奨)

公開鍵をVPSにコピーする:

公開鍵の転送
ssh-copy-id devuser@YOUR_SERVER_IP
# または手動で ~/.ssh/authorized_keys に追記する

VPS側のSSH設定を変更する:

SSHデーモン設定
sudo nano /etc/ssh/sshd_config

以下の設定を確認・変更する。

/etc/ssh/sshd_config の変更点
PermitRootLogin no          # rootログインを無効化
PasswordAuthentication no   # パスワード認証を無効化
PubkeyAuthentication yes    # 鍵認証を有効化

設定を反映する。

SSH再起動
sudo systemctl restart sshd

注意
SSH設定変更後は既存のセッションを切らずに別のターミナルから鍵認証でログインできることを確認してから、古いセッションを閉じること。ロックアウトするとVPSのコンソールからしか復旧できなくなる。

1-4. UFWファイアウォールの設定

UFWの基本設定
# UFWインストール(Ubuntuには最初から入っている場合が多い)
sudo apt install ufw -y
 
# デフォルトポリシーの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
 
# 必要なポートを開放
sudo ufw allow ssh      # SSHポート(22番)
sudo ufw allow 80/tcp   # HTTP
sudo ufw allow 443/tcp  # HTTPS
 
# UFWを有効化
sudo ufw enable
 
# 設定確認
sudo ufw status verbose

STEP 2: Dockerのインストール

Ubuntu 24.04 LTSを例にDockerをインストールする。

2-1. Docker Engineのインストール

Docker公式リポジトリの追加
# 必要なパッケージのインストール
sudo apt install ca-certificates curl gnupg -y
 
# GPGキーの追加
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
sudo chmod a+r /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 "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engineインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
 
# バージョン確認
docker --version
docker compose version

2-2. sudoなしでDockerを使う設定

dockerグループへの追加
sudo usermod -aG docker devuser
 
# 反映のため一度ログアウト・再ログイン
exit
ssh devuser@YOUR_SERVER_IP
 
# 確認
docker ps

2-3. Dockerの動作確認

Hello Worldで動作確認
docker run hello-world

Hello from Docker! と表示されれば成功だ。

STEP 3: docker-compose で構成を作る

個人開発でよく使う構成としてNext.js + PostgreSQL + Nginxの3コンテナ構成を例に説明する。

ディレクトリ構成

プロジェクト構成
~/myapp/
├── docker-compose.yml
├── nginx/
   └── default.conf
├── app/          # Next.jsアプリ
   ├── Dockerfile
   └── ...
└── .env

docker-compose.yml

docker-compose.yml
version: '3.9'
 
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/myapp
      - NODE_ENV=production
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped
 
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
 
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - app
    restart: unless-stopped
 
volumes:
  postgres_data:

Next.jsのDockerfile

app/Dockerfile
FROM node:20-alpine AS base
 
# 依存関係のインストール
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json pnpm-lock.yaml* ./
RUN corepack enable pnpm && pnpm install --frozen-lockfile
 
# ビルド
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN corepack enable pnpm && pnpm build
 
# 本番イメージ
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
 
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
 
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
 
USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
 
CMD ["node", "server.js"]

Next.jsのstandaloneモード
next.config.jsoutput: 'standalone' を追加することで、node_modules 全体をコピーせず最小限のファイルだけで動作するバイナリを生成できる。Dockerイメージが劇的に軽くなる。

Nginxの設定

nginx/default.conf
server {
    listen 80;
    server_name your-domain.com;
 
    # HTTPSへリダイレクト
    return 301 https://$host$request_uri;
}
 
server {
    listen 443 ssl;
    server_name your-domain.com;
 
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
 
    location / {
        proxy_pass http://app:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

STEP 4: SSL証明書の取得(Let's Encrypt)

ドメインを取得してDNSのAレコードをVPSのIPに向けた後、以下の手順でSSL証明書を発行する。

Certbotのインストール
sudo apt install certbot -y
 
# Nginxが80番を使っている場合は一時停止
docker compose stop nginx
 
# 証明書の発行
sudo certbot certonly --standalone -d your-domain.com
 
# Nginxを再起動
docker compose start nginx

証明書は90日で期限切れになるため、自動更新のcronを設定する。

自動更新のcron設定
sudo crontab -e
 
# 以下を追記(毎月1日の3:30に更新チェック)
30 3 1 * * certbot renew --quiet && docker compose -f /home/devuser/myapp/docker-compose.yml restart nginx

STEP 5: GitHub Actions で自動デプロイ

コードをpushするたびに本番VPSへ自動デプロイされる仕組みを作る。

VPS側の準備

デプロイ用SSHキーの生成(VPS上で実行)
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/deploy_key  # 秘密鍵をコピーしてGitHub Secretsに登録

GitHub Secretsへの登録

GitHubリポジトリの Settings > Secrets and variables > Actions に以下を追加する。

Secret名
VPS_HOSTVPSのIPアドレス
VPS_USERdevuser
VPS_KEYデプロイ用SSH秘密鍵(全文)

GitHub Actionsワークフロー

.github/workflows/deploy.yml
name: Deploy to VPS
 
on:
  push:
    branches: [main]
 
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to VPS via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USER }}
          key: ${{ secrets.VPS_KEY }}
          script: |
            cd ~/myapp
            git pull origin main
            docker compose build app
            docker compose up -d
            docker image prune -f

STEP 6: 運用・モニタリングのTips

ログの確認

コンテナログの確認
# 全コンテナのログを追跡
docker compose logs -f
 
# 特定コンテナのログのみ
docker compose logs -f app
 
# 最新100行のみ表示
docker compose logs --tail=100 app

ディスク使用量の管理

Dockerを使い続けると不要なイメージ・コンテナ・ボリュームが溜まる。定期的に以下のコマンドで掃除する。

Dockerリソースのクリーンアップ
# 停止中コンテナ・未使用イメージ・キャッシュを削除
docker system prune -f
 
# ボリュームも含めて削除(注意: データが消える)
docker system prune -f --volumes

メモリ・CPU監視

リソース使用量の確認
# コンテナ別リソース使用量をリアルタイム表示
docker stats
 
# サーバー全体の負荷確認
htop

バックアップ(PostgreSQL)

データベースのバックアップは必ず設定する。

PostgreSQLの手動バックアップ
docker compose exec db pg_dump -U postgres myapp > backup_$(date +%Y%m%d).sql

cronで自動化する場合は以下のようにする。

自動バックアップcron
# 毎日午前2時にバックアップ
0 2 * * * cd ~/myapp && docker compose exec -T db pg_dump -U postgres myapp > ~/backups/backup_$(date +\%Y\%m\%d).sql

Xserver VPSのここがよかった(実際に使ってみての感想)

実際に半年以上Xserver VPSを使ってみた体感をお伝えする。

良かった点:

  • コンパネが直感的: 初心者でもサーバーの再起動・OSの再インストールが迷わずできる
  • 回線が速い: Docker pullやaptのダウンロードが体感的に速い。さくらVPS比で1.5〜2倍くらいの速度感
  • サポートが丁寧: チャットサポートが日本語で対応。設定ミスで詰まったときに助かった
  • ドキュメントが充実: 公式のセットアップガイドがUbuntu/AlmaLinux等OSごとに整備されている

気になった点:

  • スナップショット機能がない: 設定ミスで壊しても巻き戻しができないため、重要な変更前はバックアップが必要
  • スケールが手動: AWSのAuto Scalingのようなトラフィック連動スケールは不可(固定スペック)

個人開発のステージでは気になる点はほぼないが、大量トラフィックが見込まれるサービスになってきたらクラウドへの移行を検討するのが良いだろう。

Xserver VPSを申し込む →

※本リンクはアフィリエイトリンクです

よくある質問

Q. Docker Composeとdocker composeの違いは?

Docker Compose V1(docker-composeコマンド)は2023年6月に廃止された。現在はDocker Engine組み込みのCompose V2(docker composeコマンド)を使う。本記事はすべてV2前提だ。

Q. VPSとEC2を比較した場合、どちらが個人開発向きか?

月額コストで比較するとVPS有利だ。EC2のt3.smallは一定額のfreeトラフィックを超えるとデータ転送費用が加算され、固定費として読めない。個人開発のフェーズではVPS一択で、プロダクトが成長してトラフィックが読めるようになったらEC2・ECS等に移行するのが定石だ。

Q. ドメインはどこで取ればいいか?

お名前.com・お名前.comドメイン・Cloudflare Registrarが一般的だ。Cloudflare Registrarはドメインを原価で提供しているため、数年分維持するとかなりコストが安くなる。また、CloudflareのDNSはDDoS対策も兼ねており、個人開発でも利用を推奨する。

Q. メモリ2GBでNext.jsとPostgresの両方は動くか?

十分に動く。Next.js(Node.js)は通常200〜400MBのメモリを使用し、PostgreSQLは設定次第で256MB〜512MBに抑えられる。NginxはAlpine版で30〜50MB程度なので、合計1GB前後で3コンテナが動作する。余裕をもって2GBプランを選んでおけば問題ない。

Q. Let's Encryptの証明書更新が失敗した場合は?

certbot renew のログは /var/log/letsencrypt/letsencrypt.log に保存されている。よくある失敗原因は「80番ポートがDockerに占有されていてcertbotがアクセスできない」ケースだ。更新時だけNginxコンテナを一時停止するか、Certbotのwebroot方式に切り替えることで解決できる。

Q. 複数のドメイン・サービスを同じVPSで動かせるか?

可能だ。Nginxの設定で server_name を切り替えることで1つのVPSで複数ドメイン・サービスを運用できる。コンテナをサービスごとに分けてdocker-compose.ymlに追記し、Nginxのバーチャルホスト設定を増やすだけだ。2GBプランなら2〜3サービス程度は問題なく動く。

Q. Dockerイメージのビルドに時間がかかる。速くする方法は?

以下の2点が効果的だ。①Dockerfile のレイヤーキャッシュを活用する(COPY package.jsonpnpm installCOPY . . の順にする)、② GitHub Actionsのビルドキャッシュ(actions/cache)を使ってnode_modulesをキャッシュする。この2つで初回以降のビルド時間が30〜50%短縮される。

まとめ:今日からできるアクション

この記事で解説した手順をまとめる。

  1. Xserver VPSを契約する(個人開発なら2GBプランから)
  2. UFW・SSH鍵認証でセキュリティを固める(rootログインを必ず無効化)
  3. Docker Engine + Compose V2をインストールする
  4. docker-compose.yml でサービスを定義する(Next.js + PostgreSQL + Nginxの3層構成)
  5. Let's EncryptでHTTPS化してcronで自動更新する
  6. GitHub Actions で自動デプロイを設定する(mainブランチpushで即時デプロイ)
  7. 定期バックアップ・docker system pruneをcronで自動化する

VPSは「借りたまま放置」が一番もったいない。この記事の構成を土台にして、自分のプロダクトを本番に乗せてみてほしい。

Xserver VPSを今すぐ申し込む →

※本リンクはアフィリエイトリンクです