【入門編】Penpotデータベースの内部構造とバックアップ戦略:PostgreSQLを用いたデザインデータの定期バックアップとマイグレーション手法 – UI/UX・デザインツール活用バイブル

こんにちは!デザインシステムとエンジニアリングの境界線を美しく溶かす、プロダクトデザイナーの先輩です。

普段、Figmaなどのクラウド型ツールを使っていると、「自分たちのデザインデータがどこに保存され、どう管理されているか」を意識することはほとんどありませんよね。しかし、セキュリティやプライバシーの観点から、オープンソースの本格的デザインツール「Penpot」をセルフホスト(自社サーバーやローカル環境への導入)して使いこなしたいという現場が急増しています。

今回は、セルフホスト版Penpotの心臓部である「PostgreSQLデータベース」にスポットを当てます。「データをどう守るか」「どう安全にバックアップし、未来へ引き継ぐか」という、プロトタイピング環境の根幹を支える極限の知見を、優しく紐解いていきましょう。

これをマスターすれば、サーバー障害への恐怖から解放され、チームの資産を完璧にコントロールできるようになりますよ。

—

1. PenpotとPostgreSQLの関係:なぜデータベースを知る必要があるのか?

Penpotは、フロントエンド(ClojureScript)とバックエンド(Clojure)、そしてデータベース(PostgreSQL)という非常にモダンで堅牢なスタックで構築されています。

Figmaと違い、セルフホスト版Penpotにおけるすべてのデザインデータ(コンポーネント、ページ、カラーパレット、ユーザー情報など)は、あなたが管理するPostgreSQLのコンテナ(またはサーバー)の中にすべて格納されます。

つまり、Penpotのバージョンアップで失敗したり、サーバーが突然吹き飛んだりしたとき、PostgreSQLのバックアップさえあれば、デザイン資産は100%安全に救出できます。逆に、ここを疎かにしていると、チームの数ヶ月分のデザインが消え去る悪夢を見ることに……。

そうならないための「守りの要」を、一緒に構築していきましょう。

—

2. 基礎セットアップ:Docker Compose環境の全体像

Penpotを立ち上げるとき、通常は公式が提供するDocker Composeを使用します。このとき、裏側でPostgreSQLがどのように動いているか、`docker-compose.yml`の該当部分を覗いてみましょう。

version: “3.8”

services:
penpot-postgres:
image: postgres:15-alpine
restart: always
environment:

  • POSTGRES_DB=penpot
  • POSTGRES_USER=penpot
  • POSTGRES_PASSWORD=penpot_secret_password

volumes:
# データベースの永続化(ここが命綱!)

  • penpot-postgres-data:/var/lib/postgresql/data

networks:

  • penpot-network

volumes:
penpot-postgres-data:

ここで重要なのが、`volumes`で指定されている `penpot-postgres-data` です。コンテナをどれだけ破棄(`docker compose down`)しても、この名前付きボリュームが存在する限り、データベースの中身は消えません。

まずは、これが正しく設定されていることを確認してください。これがセルフホストの第一歩です。

—

3. データの生死を分ける:安全なダンプ(バックアップ)の取得方法

「よし、毎日バックアップを取るぞ」と思ったとき、単にコンテナをそのままコピーするのはNGです。データベースが書き込み処理を行っている最中にファイルをコピーすると、データが破損する(整合性が失われる)リスクがあります。

PostgreSQLから安全に、かつ確実にデータを抽出するには、コンテナ内部のユーティリティである `pg_dump` を使います。

手動でのバックアップコマンド

ターミナルを開き、以下のコマンドを実行してみてください。

docker exec -t penpot-postgres pg_dump -U penpot -d penpot > ./penpot_backup_$(date +%Y%m%d_%H%M%S).sql

  • `docker exec -t penpot-postgres`: 稼働中のPostgreSQLコンテナ内でコマンドを実行します。
  • `pg_dump -U penpot -d penpot`: PostgreSQLの標準バックアップツールを使い、`penpot`データベースの全データをSQL形式で出力します。
  • `> ./penpot_backup_…sql`: ホスト側のカレントディレクトリに、タイムスタンプ付きのきれいなSQLファイルとして保存します。

これで、いつでも元の状態に戻せる「タイムカプセル」が手に入りました。

—

4. 自動化の極意:毎日のバックアップスクリプトを組む

手動で毎日コマンドを叩くのは、エンジニアの仕事ではありません。シェルスクリプトとCron(またはコンテナのスケジューラー)を組み合わせて、完全自動化レイヤーを作り上げましょう。

以下のスクリプトを `backup-penpot.sh` として保存してください。

!/bin/bash

エラーが発生したら即座にスクリプトを停止
set -e

設定変数
BACKUP_DIR=”/path/to/your/penpot/backups”
CONTAINER_NAME=”penpot-postgres”
DB_USER=”penpot”
DB_NAME=”penpot”
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE=”$BACKUP_DIR/penpot_db_$DATE.sql”

バックアップディレクトリが存在しない場合は作成
mkdir -p “$BACKUP_DIR”

echo “==> Penpotデータベースのバックアップを開始します: $DATE”

1. pg_dumpを実行してSQLファイルに出力
docker exec -t “$CONTAINER_NAME” pg_dump -U “$DB_USER” -d “$DB_NAME” > “$BACKUP_FILE”

2. 圧縮して軽量化
gzip “$BACKUP_FILE”

echo “==> バックアップが完了しました: ${BACKUP_FILE}.gz”

3. 30日以上前の古いバックアップを自動削除(ディスク肥大化防止)
find “$BACKUP_DIR” -name “penpot_db_.sql.gz” -mtime +30 -delete

echo “==> 古いバックアップのクリーンアップが完了しました。”

このスクリプトに実行権限を与え (`chmod +x backup-penpot.sh`)、Linuxの `crontab` に登録しておけば、毎夜眠っている間にデザイン資産が完璧に保護されます。

—

5. メジャーバージョンアップ時のデータ移行(マイグレーション)の注意点

Penpot本体のバージョンアップに伴い、PostgreSQLのバージョンを上げなければならないケース(例: PostgreSQL 13から15への移行など)が出てきます。

ここで最もやってはいけないのが、「古いバージョンのボリュームデータを、新しいバージョンのPostgreSQLコンテナにそのまま直結させること」です。内部のデータ構造(ストレージフォーマット)が異なるため、起動時に致命的なエラーを起こします。

安全な移行のステップは以下の通りです。

1. 旧環境で完全バックアップを取得する
先ほどの `pg_dump` を使い、必ずSQL形式のダンプを取ります。
2. 新環境(新バージョン)をクリーンな状態で起動する
新しいボリュームを用意し、新しいPostgreSQLコンテナを立ち上げます。
3. データをリストア(復元)する
取得したSQLダンプを新しいデータベースに流し込みます。

新しいコンテナへデータを流し込むコマンド
docker exec -i new-penpot-postgres psql -U penpot -d penpot < ./penpot_backup_YYYYMMDD_HHMMSS.sql この「Dump & Restore」の原則を守るだけで、バージョンアップのトラブル起因によるデータ損失のリスクをゼロに抑えることができます。

—

おわりに:インフラを愛する者は、デザインを守る

今回は、PenpotのバックボーンであるPostgreSQLの内部構造と、現場で絶対に役立つバックアップ・移行戦略について解説しました。

「デザインツール」というと、どうしてもUI上の操作やコンポーネントの組み方に目が行がしまいがちです。しかし、チームのナレッジやアイデアが詰まったデータベースを安全にコントロールできるようになると、あなたのデザイン環境は「趣味やプロトタイプ用」から「実用に耐えうる堅牢なプロダクトインフラ」へと進化します。

これをマスターすれば、サーバーのメンテナンス日も、枕を高くしてぐっすり眠れますよ。
明日の開発・デザインライフが、より安心でクリエイティブなものになりますように!

タイトルとURLをコピーしました