自宅サーバー構築とKamalデプロイ環境構築メモ

目的:自宅サーバー作って遊びたい

  • プライベート利用かつPaaSで高コストになるものの代替
  • 常駐プログラム
    • クローラー
    • 長時間かかるデータ処理
  • 停止しても良いもの
    • バックエンドのCMS(自宅サーバー)
    • フロントエンド(デプロイ時にコンテンツを書き出し、ホスティングプラットフォームへアップロード)
  • その他
    • マイクラなどの身内用ゲームサーバー
    • サーバー構築自体を目的とした遊び(ISUCON過去問など)

要件:令和の自宅サーバー

  • コンテナオーケストレーション
    • コンテナイメージをpushするだけでデプロイ
    • アプリ追加時のミドルウェア設定を自動化
    • Heroku代替のオープンソースツールを検討
      • Dokku, CapRover, Coolify
      • Kubernetes系は自宅環境では複雑
  • 複数台構成への対応
    • 基本は1台のサーバーに複数アプリを集約
    • フェールオーバー用に後からサーバー追加
      • Cloudflare Tunnelで対応
      • Cloudflare Load Balancers(有料)
    • VPSへの移行も視野に入れる
  • セキュアな接続
    • パブリックIPアドレスを公開せずに外部からHTTPS/SSH接続
      • Cloudflare Tunnel
      • Tailscale Funnel

コスト:既存ソリューションより安価かつ運用負荷を低減

  • 比較対象
    • VPS、レンタルサーバー
    • Heroku, RenderなどのPaaS
    • Google Cloud, AWSなどのクラウドプラットフォーム(CaaS)
      • Cloud Run, GKE, AppRunner, ECS, EKSなど
  • 比較対象外
    • Cloudflare Workers, Vercel, AWS LambdaなどのFaaS
    • Fly.io(PaaS/CaaS/FaaSの複合型)

必要な機材

  • Linux(Ubuntu)がインストールできるPC
    • 低価格ミニPC
    • Raspberry Piでも可
  • USBメモリ(Ubuntuインストール用)
    • Ubuntuでなくても可(Kamal開発元の37signalsに合わせる)

Ubuntuのインストール

  • Ubuntu Serverのダウンロード
  • インストール用USBメモリ作成
  • ミニPCへのUbuntuインストール
  • Dockerインストール
  • 内部ネットワークからSSH接続

Kamalのインストールと設定

  • kamal init
  • .kamal/secret の追加
    • Docker Hubアクセス用Personal Access Token
  • config/deploy.yml の編集
  • kamal setup

Cloudflare Tunnelによるセキュアな接続

  • ミニPCへのcloudflaredインストール
  • Tunnelの作成
  • HTTPS接続
  • ローカルマシンへのcloudflaredインストール
  • 外部ネットワークからSSH接続
  • ファイアウォール(ufw)を有効化
  • Cloudflare Tunnel以外からの接続を遮断

Webアプリのデプロイ(Next.js)