🚀

【続編】Shlink-UI-RailsをOracle Cloud A1でCI/CD運用してみた

に公開

はじめに

以前の記事では、Shlink-UI-Rails の紹介と開発環境構築についてまとめました。
今回はその続編として、Oracle Cloud Free Tier の A1 インスタンスに本番運用を導入した構成と運用経験を紹介します。

リポジトリ: GitHub - enjoydarts/shlink-ui-rails

本番環境の構成

  • Oracle Cloud Ampere A1 (ARM64) … 無料枠で常時稼働
  • GitHub Actions … push をトリガーに CI/CD を実行
  • GitHub Container Registry (GHCR) … Docker イメージの保存先
  • docker-compose … サービス管理
  • deploy.sh … デプロイ処理を自動化(ヘルスチェック・ロールバック含む)

GitHub Actions の設定

.github/workflows/deploy.yml では以下を実行しています。

  • RSpec と RuboCop によるテスト
  • ARM64 向けの Docker イメージをビルド
  • GHCR への push
  • SSH 経由で本番サーバに接続し、デプロイスクリプトを実行
- name: Build and push Docker image
  uses: docker/build-push-action@v6
  with:
    context: .
    file: ./Dockerfile.production
    platforms: linux/arm64   # OCI Ampere A1 用
    push: true
    tags: ${{ steps.meta.outputs.tags }}

デプロイスクリプト

サーバ側の scripts/deploy.sh は以下を担当します。

  • GHCR から最新イメージを pull
  • 既存コンテナをバックアップ
  • DB スキーマを Ridgepole で適用
  • docker-compose でゼロダウンタイム再起動
  • /health で稼働確認、失敗時はロールバック
# ヘルスチェック
wait_for_health() {
  log "INFO" "Waiting for application health..."
  timeout 300 bash -c '
    while ! curl -sf http://localhost:3000/health; do
      sleep 10
    done
  '
}

運用してみて

本番運用を始めてから、以下の点を実感しました。

  • デプロイ作業の効率化
    GitHub に push すればテストからリリースまで自動で完結。
  • サーバ管理の簡素化
    本番サーバは Docker ホストとして動作するのみ。依存関係やライブラリ更新は CI 側で完結。
  • 無料での安定運用
    GitHub Actions と Oracle Cloud A1 の組み合わせでコストゼロ。
  • ロールバック機能の安心感
    大きな障害はまだないが、仕組みとして備えていることで安定感がある。
  • 通知による可視性
    Slack / Discord に成功・失敗が通知され、外出先からでも状況確認が可能。

まとめ

GitHub Actions × GHCR × Oracle Cloud A1 を利用することで、無料で本番運用に耐える CI/CD 環境を構築できました。
個人開発や小規模サービスにおいても十分実用的な構成だと感じています。

お知らせ

Rails や Laravel の技術記事のほか、ガジェットやイヤホン、香水のレビューもブログで発信しています。今回の Shlink-UI-Rails の開発記録も随時まとめていく予定です。

👉 コードと音と香りの交差点 https://enjoydarts.blog

Discussion