CoolifyでNext.jsブラウザゲームをセルフホストする方法|本番環境の構築手順
Next.jsで開発したブラウザ麻雀ゲーム「雀天」を、Coolifyを使ってVPSにセルフホストする手順を解説。Nixpacksビルド、本番/プレビュー環境分離、GitHub Actions CI/CD連携、メモリ最適化、Let's Encrypt SSL設定まで。
代表 / エンジニア
私たちaduceでは、麻雀ブラウザゲーム雀天(janten.net)をNext.jsで開発し、VPS上のCoolifyでセルフホストしている。本記事では、その本番環境の構築手順を実際の設定ファイルとともに紹介する。
Coolifyとは?VPSでNext.jsをセルフホストする選択肢
CoolifyはオープンソースのPaaS(Platform as a Service)で、VercelやNetlifyのようなデプロイ体験をVPS上で実現できるツールだ。GitHubリポジトリと連携し、pushをトリガーにビルドとデプロイを自動化できる。
Next.jsのセルフホスト先としてCoolifyを選んだ理由は明快で、VPS1台でSSL証明書の自動管理、ヘルスチェック、リソース制限まで完結する点にある。Vercelの従量課金を気にせず、ゲームのような常時接続型アプリケーションを安定運用できる。
janten.netのインフラ構成(本番+プレビューの2環境)
雀天では本番環境とプレビュー環境の2つをCoolify上で運用している。本番はprodブランチ、プレビューはmainブランチに対応し、それぞれ独立したアプリケーションとしてCoolifyに登録している。
| 環境 | ドメイン | ブランチ | 用途 |
|---|---|---|---|
| 本番 | janten.net | prod | ユーザー公開 |
| プレビュー | pre.janten.net | main | 開発確認 |
プレビュー環境にはIP制限を設定し、関係者のみアクセスできるようにしている。
# プレビュー環境のIP制限
ip_allow:
- 14.11.163.0/32Nixpacksによるゼロ設定ビルド
CoolifyはビルドパックとしてNixpacksを標準サポートしている。package.jsonを検出すると自動的にNode.js環境を構築し、ビルドコマンドを実行する。
雀天ではローカルパッケージmahjong-coreを事前ビルドする必要があるため、package.jsonのbuildスクリプトで一括処理している。
{
"scripts": {
"build": "cd mahjong-core && npm install && npm run build && cd .. && next build",
"start": "next start"
}
}Coolify側の設定はシンプルだ。
build:
pack: nixpacks
command: npm run build
runtime:
start_command: npm run start
port: 3000Dockerfileを自前で管理する必要がなく、package.jsonのbuildとstartを定義するだけでNext.jsアプリがデプロイできる。
GitHub Actions CI/CDとの連携
CoolifyのGitHub連携とは別に、GitHub ActionsでCI(テスト・ビルド検証)を実行している。mainとprodブランチへのpush・PRをトリガーに、以下のパイプラインが走る。
name: CI
on:
push:
branches: [main, prod]
pull_request:
branches: [main, prod]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- name: Build mahjong-core
run: cd mahjong-core && npm install && npm run build
- name: Test
run: npm test
- name: Build
run: npx next buildCIが通ったコミットのみがmainにマージされ、mainからprodへのマージで本番デプロイが走る流れだ。Coolify側のWebhookがpushイベントを検知し、自動でビルド・デプロイを開始する。
本番環境のチューニング(メモリ制限・ヘルスチェック)
VPSのリソースは有限なので、コンテナにメモリとCPUの上限を設定している。
environment:
runtime:
NODE_ENV: production
NODE_OPTIONS: "--max-old-space-size=768"
resources:
memory: 512
cpu: 500
healthcheck:
path: /
interval: 30
timeout: 10
retries: 3ポイントはNODE_OPTIONSの--max-old-space-size=768だ。コンテナのメモリ上限が512MBであっても、Node.jsのヒープ上限をやや高めに設定しておくことで、ビルド時のメモリ不足を防ぎつつ、OOM Killerによるコンテナ再起動で暴走を防止する設計にしている。
ヘルスチェックは30秒間隔で/にリクエストを送り、3回連続で失敗した場合にコンテナを再起動する。ブラウザゲームは長時間のセッションが前提なので、異常時の自動復旧が重要だ。
Let's Encrypt自動SSLの設定
CoolifyはLet's Encryptとの統合が組み込まれており、ドメインを設定するだけでSSL証明書が自動取得・自動更新される。
domains:
primary: janten.net
ssl:
enabled: true
auto_renew: true設定はこれだけで、証明書の手動更新やcron設定は不要だ。Coolifyの内部でTraefikがリバースプロキシとして動作し、HTTPS終端とLet's Encryptのチャレンジ応答を処理する。本番・プレビューの両環境で同じ設定を適用できる。
まとめ
CoolifyをVPS上で運用することで、雀天のようなNext.jsブラウザゲームをDockerfileなしでデプロイし、SSL・ヘルスチェック・リソース管理まで一元化できている。Nixpacksによるゼロ設定ビルド、GitHub Actionsとの組み合わせによるCI/CD、IP制限付きプレビュー環境など、小規模チームでも本番品質のインフラを維持できる構成だ。
aduceではこうしたインフラ構築・DevOpsの知見をもとに、技術支援を行っています。VPSでのセルフホストやCI/CDパイプラインの構築にお困りの方は、ぜひお問い合わせください。