Node.jsアプリケーションをさくらのクラウドのAppRunへ自動ビルド・デプロイするGitHub Actionです。
SQLite のデータベースファイルを Litestream を使って自動でオブジェクトストレージにレプリケーションすることができるので、簡単な設定だけで コンテナ+SQLite環境で永続化を実現 します。
- 🚀 複数のNode.jsフレームワークに対応(HonoX、Next.js、React Router)
- 🔍 package.jsonから自動フレームワーク検出
- 🌸 さくらのAppRunへ直接デプロイ
- 📦 npm startで起動するアプリに対応(デフォルト3000、ポート指定可能)
- 🏗️ TypeScriptビルド対応(マルチステージビルド)
- 🔄 既存アプリケーションの自動更新
- 🏷️ Git SHAベースの自動バージョニング
- 🔐 安全な認証情報の管理
- 🗄️ Litestreamを使ったSQLiteのレプリケーション機能
- 📁 自前のDockerfileを使うことも可能
このActionは以下のNode.jsフレームワークを自動で検出し、適切なビルドプロセスを実行します:
フレームワークの検出はpackage.json
の依存関係から自動的に行われます。
- さくらのクラウドアカウント(AppRun有効化済み)
- さくらのコンテナレジストリ
- 各種APIキー・認証情報:
- さくらのクラウドAPIキー(AppRun権限付き)
- コンテナレジストリの認証情報
- (SQLiteレプリケーション使用時)さくらのオブジェクトストレージの認証情報
- name: さくらのAppRunへデプロイ
uses: meso/sakura-apprun-action@v3
with:
sakura-api-key: ${{ secrets.SAKURA_API_KEY }}
sakura-api-secret: ${{ secrets.SAKURA_API_SECRET }}
container-registry: MYREGISTRY.sakuracr.jp
container-registry-user: ${{ secrets.REGISTRY_USER }}
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
- name: さくらのAppRunへデプロイ
uses: meso/sakura-apprun-action@v3
with:
sakura-api-key: ${{ secrets.SAKURA_API_KEY }}
sakura-api-secret: ${{ secrets.SAKURA_API_SECRET }}
container-registry: MYREGISTRY.sakuracr.jp
container-registry-user: ${{ secrets.REGISTRY_USER }}
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
use-repository-dockerfile: 'true'
名前 | 説明 | 必須 | デフォルト値 |
---|---|---|---|
sakura-api-key |
さくらのクラウドAPIキー | はい | - |
sakura-api-secret |
さくらのクラウドAPIシークレット | はい | - |
container-registry |
コンテナレジストリのURL | はい | - |
container-registry-user |
レジストリのユーザー名 | はい | - |
container-registry-password |
レジストリのパスワード | はい | - |
app-name |
アプリケーション名 | いいえ | リポジトリ名 |
port |
アプリケーションのポート番号 | いいえ | 3000 |
max-cpu |
最大CPU | いいえ | 0.4 |
max-memory |
最大メモリ | いいえ | 256Mi |
timeout-seconds |
リクエストタイムアウト(秒) | いいえ | 300 |
use-repository-dockerfile |
リポジトリのDockerfileを使用する | いいえ | true |
object-storage-bucket |
SQLiteレプリケーション用のオブジェクトストレージバケット名 | いいえ | - |
object-storage-access-key |
オブジェクトストレージのアクセスキー | いいえ | - |
object-storage-secret-key |
オブジェクトストレージのシークレットキー | いいえ | - |
sqlite-db-path |
SQLiteデータベースファイルのパス | いいえ | - |
litestream-replicate-interval |
Litestreamレプリケーション間隔 | いいえ | 10s |
true
(デフォルト): リポジトリのルートにDockerfile
が存在する場合、それを使用しますfalse
: 常に最適化されたDockerfileを使用します
リポジトリにDockerfileが存在しない場合は、自動的に最適化されたDockerfileが使用されます。
本Actionはpackage.json
の依存関係を分析して、使用するフレームワークを自動的に検出します:
- Next.js:
"next"
の依存関係が検出された場合 - React Router:
"@react-router/dev"
または"react-router"
の依存関係が検出された場合 - HonoX: 上記以外の場合(デフォルト)
全てのフレームワークでnpm run build
によるビルドとnpm start
による起動をサポートしています。
本Actionは、SQLiteデータベースのレプリケーション機能を提供します。以下の全てのパラメータが設定されている場合、Litestreamが自動的に有効になります:
object-storage-bucket
object-storage-access-key
object-storage-secret-key
sqlite-db-path
データベースのバックアップは以下の形式で整理されます:
{bucket}/{app-name}/{database-filename}
これにより、複数のアプリケーションが同じバケットを使用してもファイルが衝突することはありません。
- name: さくらのAppRunへデプロイ
uses: meso/sakura-apprun-action@v3
with:
sakura-api-key: ${{ secrets.SAKURA_API_KEY }}
sakura-api-secret: ${{ secrets.SAKURA_API_SECRET }}
container-registry: MYREGISTRY.sakuracr.jp
container-registry-user: ${{ secrets.REGISTRY_USER }}
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
# SQLiteレプリケーション設定
object-storage-bucket: my-backup-bucket
object-storage-access-key: ${{ secrets.STORAGE_ACCESS_KEY }}
object-storage-secret-key: ${{ secrets.STORAGE_SECRET_KEY }}
sqlite-db-path: ./database.sqlite
litestream-replicate-interval: 5s
名前 | 説明 |
---|---|
public-url |
デプロイされたアプリケーションの公開URL |
app-id |
AppRunアプリケーションID |
name: 本番環境へデプロイ
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: チェックアウト
uses: actions/checkout@v4
- name: さくらのAppRunへデプロイ
id: deploy
uses: meso/sakura-apprun-action@v3
with:
sakura-api-key: ${{ secrets.SAKURA_API_KEY }}
sakura-api-secret: ${{ secrets.SAKURA_API_SECRET }}
container-registry: MYREGISTRY.sakuracr.jp
container-registry-user: ${{ secrets.REGISTRY_USER }}
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
port: '3000'
- name: デプロイURLを表示
run: |
echo "デプロイ先: ${{ steps.deploy.outputs.public-url }}"
name: SQLiteレプリケーション付きデプロイ
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: チェックアウト
uses: actions/checkout@v4
- name: さくらのAppRunへデプロイ(SQLiteバックアップ付き)
id: deploy
uses: meso/sakura-apprun-action@v3
with:
sakura-api-key: ${{ secrets.SAKURA_API_KEY }}
sakura-api-secret: ${{ secrets.SAKURA_API_SECRET }}
container-registry: MYREGISTRY.sakuracr.jp
container-registry-user: ${{ secrets.REGISTRY_USER }}
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
# SQLiteレプリケーション設定
object-storage-bucket: my-backup-bucket
object-storage-access-key: ${{ secrets.STORAGE_ACCESS_KEY }}
object-storage-secret-key: ${{ secrets.STORAGE_SECRET_KEY }}
sqlite-db-path: ./data/app.db
litestream-replicate-interval: 10s
- name: デプロイURLを表示
run: |
echo "デプロイ先: ${{ steps.deploy.outputs.public-url }}"
echo "アプリID: ${{ steps.deploy.outputs.app-id }}"
GitHubリポジトリの Settings > Secrets and variables > Actions で以下を追加:
基本的なデプロイに必要なシークレット:
SAKURA_API_KEY
: さくらのクラウドAPIキー(AppRun権限付き)SAKURA_API_SECRET
: さくらのクラウドAPIシークレットREGISTRY_USER
: さくらのコンテナレジストリのユーザー名REGISTRY_PASSWORD
: さくらのコンテナレジストリのパスワード
SQLiteバックアップに必要な追加シークレット:
STORAGE_ACCESS_KEY
: さくらのオブジェクトストレージアクセスキーSTORAGE_SECRET_KEY
: さくらのオブジェクトストレージシークレットキー
A: HonoX、Next.js、React Routerに対応しています。フレームワークはpackage.jsonから自動的に検出されます。
A: use-repository-dockerfile: 'true'
(デフォルト)を設定し、リポジトリのルートにDockerfileを配置してください。
A: use-repository-dockerfile: 'false'
を設定するか、リポジトリのルートにDockerfileを置かないでください。
A: 現在はnpm startのみ対応しています。package.jsonのscriptsにstartコマンドを定義してください。
A: 以下を確認してください:
- APIキーにAppRun権限があるか
- コンテナレジストリの認証情報が正しいか
- アプリケーション名が既に使用されていないか(v1以降は自動的に更新されます)
A: はい、対応しています。package.jsonにbuild
スクリプトが定義されていれば自動的にビルドされます。
A: はい、同名のアプリケーションが存在する場合は自動的に更新されます。
A: Litestreamを使用して、SQLiteデータベースに変更があった場合に自動的にさくらのオブジェクトストレージにレプリケーションされます。変更がない場合はレプリケーションは実行されないため、効率的です。全ての必要なパラメータが設定されている場合にのみ有効になります。
A: はい、litestream-replicate-interval
パラメータで設定可能です(例:1s、10s、1m)。これは変更をチェックする頻度で、実際のレプリケーションはデータベースに変更があった時にのみ実行されます。デフォルトは10秒です。
A: バックアップファイルはアプリケーション名で自動的に整理されるため、ファイルが衝突することはありません。バックアップパスは{bucket}/{app-name}/{database-filename}
の形式になります。
A: アプリケーション起動時に、指定されたパスにSQLiteデータベースファイルが存在しない場合、Litestreamが自動的にバックアップから復元を試みます。バックアップが存在しない場合は、新しいデータベースファイルが作成されます。
MIT