✈️

Strapi Data Transfer × GitHub Actionsで本番とステージングの同期を自動化

に公開

背景

  • ステージング環境で本番データを使ってテストしたい。
    • しかし毎回手動で同期するのは面倒。

手段

GitHub Actionsを使ってボタン押すと、同期できるようにする。

なぜGitHub Actionsにしたか

  • 誰でもボタン一発で実行可能
  • 履歴が残る
  • サーバー側でcron等、管理しなくて良い
  • チーム運用しやすい

注意点

  • transferはStrapi v4.7以上が必要。
  • schemaが一致していないと失敗する(content-type構造違い注意)。
  • 今回 --only contentでデータだけ同期している(schemaは触らない)。

事前準備

Strapi公式のtransferコマンドを使う。必要なのは以下

変数名 用途 保存場所
PROD_URL 本番StrapiのURL GitHub Secrets
PROD_TOKEN 本番側のTransfer Token GitHub Secrets
STG_URL ステージングStrapiのURL GitHub Secrets
STG_TOKEN ステージング側のTransfer Token GitHub Secrets
SSH_KEY ステージングサーバー接続用のSSH秘密鍵 GitHub Secrets
HOST_STAGING, USER_NAME SSH接続情報 GitHub Secrets

実際のGitHub Actions定義

name: Strapi Sync Production to Staging

on:
  workflow_dispatch:

concurrency:
  group: strapi-sync-stg
  cancel-in-progress: false

jobs:
  sync:
    runs-on: ubuntu-latest
    timeout-minutes: 600

    steps:
      - name: SSH鍵セット
        env:
          PRIVATE_KEY: ${{ secrets.SSH_KEY }}
        run: |
          mkdir -p ~/.ssh
          echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          eval $(ssh-agent -s)
          ssh-add ~/.ssh/id_rsa
          ssh-keyscan -H "${{ secrets.HOST_STAGING }}" >> ~/.ssh/known_hosts

      - name: Production→Staging コンテンツ同期
        env:
          SSH_USER: ${{ secrets.USER_NAME }}
          SSH_HOST: ${{ secrets.HOST_STAGING }}
          STG_URL: ${{ secrets.STG_URL }}
          STG_TOKEN: ${{ secrets.STG_TOKEN }}
          PROD_URL: ${{ secrets.PROD_URL }}
          PROD_TOKEN: ${{ secrets.PROD_TOKEN }}
        run: |
          ssh -o StrictHostKeyChecking=yes -i ~/.ssh/id_rsa \
            "$SSH_USER@$SSH_HOST" \
            "cd hub-strapi && \
            docker compose exec -T \
              -e STRAPI_TRANSFER_URL='$STG_URL' \
              -e STRAPI_TRANSFER_TOKEN='$STG_TOKEN' \
              -e PROD_URL='$PROD_URL' \
              -e PROD_TOKEN='$PROD_TOKEN' \
              strapi bash -c 'strapi transfer --from \"\$PROD_URL\" --from-token \"\$PROD_TOKEN\" --only content --force' && \
            echo '✅ Sync completed' && \
            docker compose up -d --no-deps --build --force-recreate strapi
            echo '✅ Up completed'"

tips

  • 定期的に同期したいときはGithub Actionsでcronトリガーを追加する

参考

https://docs.strapi.io/cms/data-management/transfer

Discussion