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