Goバイナリサービス

コンパイル済みGoバイナリをsystemdサービスとしてデプロイします。静的バイナリの利点、高同時接続サーバーのファイルディスクリプタ制限、ハードニングオプションについて解説します。

Application Services

詳細な説明

systemdでGoアプリケーションをデプロイする

Goアプリケーションは静的バイナリにコンパイルされるため、systemdデプロイに最適です。インストールするランタイムも、管理する仮想環境も、デプロイ時の依存関係解決もありません。

[Unit]
Description=Go API Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/myapi
Restart=always
RestartSec=3
User=apiuser
Group=apiuser
WorkingDirectory=/opt/myapi
Environment="GIN_MODE=release"
Environment="PORT=8080"
LimitNOFILE=65535
StandardOutput=journal
StandardError=journal

# ハードニング
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/myapi/data

[Install]
WantedBy=multi-user.target

Goバイナリがsystemdに最適な理由

  1. シングルファイルデプロイ: バイナリをコピーし、ユニットファイルを作成するだけ
  2. ランタイム依存なし: JVM、Pythonインタプリタ、Node.jsが不要
  3. 高速起動: Goバイナリはミリ秒で起動
  4. 静的リンク: すべての依存関係がバイナリにコンパイル
  5. シグナル処理: Goはos.Signalによる正常シャットダウンをビルトインサポート

セキュリティハードニング

ハードニングディレクティブはサービスができることを制限します:

  • NoNewPrivileges=yes: setuid/setgidバイナリによる追加権限の取得を防止
  • ProtectSystem=strict: ファイルシステム全体を読み取り専用としてマウント
  • ProtectHome=yes: /home/root/run/userをアクセス不可に
  • ReadWritePaths=: 特定のディレクトリへの書き込みアクセスを明示的に許可

ユースケース

多数の同時接続を処理し、高速再起動が必要で、セキュリティハードニングにより最小限のシステム権限で実行すべき高性能Go APIサーバーをデプロイする場合に使用します。

試してみる — Systemd Unit File Generator

フルツールを開く