【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プランで十分なケースがほとんどだ。
| プラン | メモリ | vCPU | SSD | 月額(目安) |
|---|---|---|---|---|
| 1GBプラン | 1GB | 1コア | 100GB | 約850円 |
| 2GBプラン | 2GB | 2コア | 100GB | 約1,500円 |
| 4GBプラン | 4GB | 4コア | 100GB | 約3,000円 |
| 8GBプラン | 8GB | 8コア | 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つある。
- SSHでのログイン確認
- 一般ユーザーの作成とsudo権限付与
- rootログインの無効化
- UFW(ファイアウォール)の設定
1-1. SSHでのログイン確認
VPS契約後、コントロールパネルからIPアドレスとrootのパスワードを確認する。最初はrootでログインする。
ssh root@YOUR_SERVER_IP接続できたら最初にパッケージを更新する。
apt update && apt upgrade -y1-2. 一般ユーザーの作成
セキュリティの基本として、rootで作業し続けるのは危険だ。一般ユーザーを作成してsudo権限を付与する。
# ユーザー作成(例: devuser)
adduser devuser
# sudoグループに追加
usermod -aG sudo devuser
# ユーザーに切り替えて確認
su - devuser
sudo whoami # "root" と表示されればOK1-3. SSH鍵認証の設定
パスワード認証は総当たり攻撃のリスクがある。SSH鍵認証に切り替える。
ローカルマシンで鍵ペアを生成する(まだない場合):
ssh-keygen -t ed25519 -C "your-email@example.com"
# パスフレーズを設定する(推奨)公開鍵をVPSにコピーする:
ssh-copy-id devuser@YOUR_SERVER_IP
# または手動で ~/.ssh/authorized_keys に追記するVPS側のSSH設定を変更する:
sudo nano /etc/ssh/sshd_config以下の設定を確認・変更する。
PermitRootLogin no # rootログインを無効化
PasswordAuthentication no # パスワード認証を無効化
PubkeyAuthentication yes # 鍵認証を有効化設定を反映する。
sudo systemctl restart sshd注意
SSH設定変更後は既存のセッションを切らずに別のターミナルから鍵認証でログインできることを確認してから、古いセッションを閉じること。ロックアウトするとVPSのコンソールからしか復旧できなくなる。
1-4. 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 verboseSTEP 2: Dockerのインストール
Ubuntu 24.04 LTSを例にDockerをインストールする。
2-1. Docker Engineのインストール
# 必要なパッケージのインストール
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/nullsudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# バージョン確認
docker --version
docker compose version2-2. sudoなしでDockerを使う設定
sudo usermod -aG docker devuser
# 反映のため一度ログアウト・再ログイン
exit
ssh devuser@YOUR_SERVER_IP
# 確認
docker ps2-3. Dockerの動作確認
docker run hello-worldHello from Docker! と表示されれば成功だ。
STEP 3: docker-compose で構成を作る
個人開発でよく使う構成としてNext.js + PostgreSQL + Nginxの3コンテナ構成を例に説明する。
ディレクトリ構成
~/myapp/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── app/ # Next.jsアプリ
│ ├── Dockerfile
│ └── ...
└── .envdocker-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
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.js に output: 'standalone' を追加することで、node_modules 全体をコピーせず最小限のファイルだけで動作するバイナリを生成できる。Dockerイメージが劇的に軽くなる。
Nginxの設定
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証明書を発行する。
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を設定する。
sudo crontab -e
# 以下を追記(毎月1日の3:30に更新チェック)
30 3 1 * * certbot renew --quiet && docker compose -f /home/devuser/myapp/docker-compose.yml restart nginxSTEP 5: GitHub Actions で自動デプロイ
コードをpushするたびに本番VPSへ自動デプロイされる仕組みを作る。
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_HOST | VPSのIPアドレス |
VPS_USER | devuser |
VPS_KEY | デプロイ用SSH秘密鍵(全文) |
GitHub Actionsワークフロー
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 -fSTEP 6: 運用・モニタリングのTips
ログの確認
# 全コンテナのログを追跡
docker compose logs -f
# 特定コンテナのログのみ
docker compose logs -f app
# 最新100行のみ表示
docker compose logs --tail=100 appディスク使用量の管理
Dockerを使い続けると不要なイメージ・コンテナ・ボリュームが溜まる。定期的に以下のコマンドで掃除する。
# 停止中コンテナ・未使用イメージ・キャッシュを削除
docker system prune -f
# ボリュームも含めて削除(注意: データが消える)
docker system prune -f --volumesメモリ・CPU監視
# コンテナ別リソース使用量をリアルタイム表示
docker stats
# サーバー全体の負荷確認
htopバックアップ(PostgreSQL)
データベースのバックアップは必ず設定する。
docker compose exec db pg_dump -U postgres myapp > backup_$(date +%Y%m%d).sqlcronで自動化する場合は以下のようにする。
# 毎日午前2時にバックアップ
0 2 * * * cd ~/myapp && docker compose exec -T db pg_dump -U postgres myapp > ~/backups/backup_$(date +\%Y\%m\%d).sqlXserver 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.json → pnpm install → COPY . . の順にする)、② GitHub Actionsのビルドキャッシュ(actions/cache)を使ってnode_modulesをキャッシュする。この2つで初回以降のビルド時間が30〜50%短縮される。
まとめ:今日からできるアクション
この記事で解説した手順をまとめる。
- Xserver VPSを契約する(個人開発なら2GBプランから)
- UFW・SSH鍵認証でセキュリティを固める(rootログインを必ず無効化)
- Docker Engine + Compose V2をインストールする
- docker-compose.yml でサービスを定義する(Next.js + PostgreSQL + Nginxの3層構成)
- Let's EncryptでHTTPS化してcronで自動更新する
- GitHub Actions で自動デプロイを設定する(mainブランチpushで即時デプロイ)
- 定期バックアップ・
docker system pruneをcronで自動化する
VPSは「借りたまま放置」が一番もったいない。この記事の構成を土台にして、自分のプロダクトを本番に乗せてみてほしい。
Xserver VPSを今すぐ申し込む →