INFRASTRUCTURE2026-04-09📖 2分

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.netprodユーザー公開
プレビューpre.janten.netmain開発確認

プレビュー環境にはIP制限を設定し、関係者のみアクセスできるようにしている。

# プレビュー環境のIP制限 ip_allow: - 14.11.163.0/32

Nixpacksによるゼロ設定ビルド

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: 3000

Dockerfileを自前で管理する必要がなく、package.jsonbuildstartを定義するだけで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 build

CIが通ったコミットのみが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パイプラインの構築にお困りの方は、ぜひお問い合わせください。