✈️
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トリガーを追加する
参考
Discussion