2026-04-04

【Strapi on Raspberry Pi】Raspberry Pi DB セットアップ

 Herokuで動かしているStrapiをRaspberry Piに移行するプロジェクト。
 前回 → 【Strapi on Raspberry Pi】Raspberry Pi セットアップ (4)

HerokuのDB データダウンロード

 Heroku Postgresのデータを取得する。Herokuにはちゃんとバックアップ用のコマンドが用意されているので、CLIで実施する。

# Herokuでバックアップを作成
HEROKU_APP={Herokuアプリ名}
heroku pg:backups:capture --app "${HEROKU_APP}"

# バックアップをダウンロード
BACKUP_URL=$(heroku pg:backups:url --app "${HEROKU_APP}")
curl -o "${DUMP_FILE}" "${BACKUP_URL}"

# ラズパイにコピー
scp "${DUMP_FILE}" "${PI_USER}@${PI_HOST}:~/${DUMP_FILE}"

Docker側のDBにインポート

 まずDBコンテナだけ先に起動する。
 DBコンテナの設定だけ記載したdocker-compose.yamlファイルを用意し

services:
  db:
    image: postgres:15
    platform: linux/arm64
    container_name: ******
    restart: unless-stopped
    env_file:
      - ../env/db.env
    ports:
      - 5432:5432
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pg-data:

 DBコンテナを起動。

docker compose -f compose.db.yml up -d

 バックアップファイルをコンテナのDBにインポートする。

# DBの起動を確認
docker exec "${CONTAINER_NAME}" psql -U "${DB_USER}" -d postgres -c "
  SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${DB_NAME}' AND pid <> pg_backend_pid();
  DROP DATABASE IF EXISTS ${DB_NAME};
  CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};
"

# 一応既存データをクリア
docker exec "${CONTAINER_NAME}" psql -U "${DB_USER}" -d postgres -c "
  SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${DB_NAME}' AND pid <> pg_backend_pid();
  DROP DATABASE IF EXISTS ${DB_NAME};
  CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};
"

# バックアップファイルからデータをインポート
docker exec -i "${CONTAINER_NAME}" pg_restore \
  -U "${DB_USER}" \
  -d "${DB_NAME}" \
  --no-acl \
  --no-owner \
  --verbose \
  < "${DUMP_FILE}"

 テーブル一覧を出力。

$ docker exec -it noura-release-note-strapi-db psql -U strapi -d strapi -c '\dt'
                List of relations
 Schema |                      Name                      | Type  | Owner
--------+------------------------------------------------+-------+--------
 public | admin_permissions                              | table | strapi
 public | admin_permissions_role_lnk                     | table | strapi
 public | admin_roles                                    | table | strapi
 public | admin_users                                    | table | strapi
 public | admin_users_roles_lnk                          | table | strapi
 public | articles                                       | table | strapi
...

 問題なくインポートできていることを確認。