【テクニカル・上級編】Penpotのセルフホスト環境におけるRedisを活用したセッション共有とスケールアウト構成の構築手順 – UI/UX・デザインツール活用バイブル

Penpotの極限スケールアウト:Redisセッション管理とWebSocket最適化の深淵

Penpotは、オープンソースのUI/UXデザインツールとして異端であり、かつ本質的だ。多くの企業がFigmaのブラックボックスに依存する中、真のエンジニアリングチームは自らのインフラ上に「デザインの源泉」を構築する。

しかし、単一のDockerコンテナで立ち上げて満足しているなら、それはまだ「おもちゃ」の域を出ていない。本稿では、Penpotを堅牢かつスケーラブルな「デザインプラットフォーム」へと昇華させるための、低レイヤからの最適化術を伝授する。

—

1. 単一コンテナの呪縛を解く:アーキテクチャの再設計

デフォルトの`docker-compose.yml`は開発用だ。本番環境でスケールアウトを目指すなら、ステートフルなコンポーネントを排除し、「すべてのコンテナを一時的な計算リソースとして扱う」思想へと切り替える必要がある。

鍵となる分離戦略

  • Redis: セッション管理およびPub/Subのハブ。
  • PostgreSQL: クラスター化、または高可用性RDSインスタンスへのオフロード。
  • Penpot Backend (App): ステートレス化し、ロードバランサー背後で水平スケールさせる。

—

2. Redisによるセッション共有とWebSocketの安定稼働

Penpotのリアルタイムコラボレーションの心臓部はWebSocketだ。ロードバランサー環境下でこれを稼働させる際、最も多い失敗が「セッションのスティッキーセッション(粘着)設定の不備」と「Pub/Subの不整合」である。

Redis設定の最適化(`redis.conf` ハック)

デフォルトのRedis設定では、大量のWebSocket接続によるメモリフラグメンテーションでダウンする。以下の設定で耐性を高める。

メモリ最適化: 揮発性のキーを適切に破棄
maxmemory 2gb
maxmemory-policy allkeys-lru

パフォーマンス重視: I/O効率化
io-threads 4
io-threads-do-reads yes

Penpot Backendの接続定義

`docker-compose`の環境変数で、Redisの接続先を明示し、セッションストアとして活用させる。

docker-compose.yml 抜粋
services:
penpot-backend:
environment:
# Redisセッションストアの有効化

  • PENPOT_REDIS_URL=redis://your-redis-cluster-endpoint:6379

# WebSocketのシグナリングをRedis経由に統一

  • PENPOT_REDIS_ENABLED=true

—

3. ロードバランサー(Nginx/HAProxy)の極意

スケールアウトの最大の敵は、WebSocketのハンドシェイク失敗だ。Nginxをフロントに置く場合、必ずアップストリームでアップグレードヘッダーを透過させる必要がある。

upstream penpot_backend {
server app1:6001;
server app2:6001;
# 物理的距離とレイテンシを考慮したleast_connアルゴリズム
least_conn;
}

server {
location /api/workspace/collaboration {
proxy_pass http://penpot_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”;
proxy_set_header Host $host;
# WebSocketのタイムアウトを延長
proxy_read_timeout 86400s;
}
}

—

4. 完全自動化のためのパイプライン:CLI活用術

インフラの増減を手動で行うのは、技術的負債の増大を意味する。Penpotの起動確認やヘルスチェックを自動化するスクリプトをCI/CDに組み込め。

!/bin/bash
penpot-health-check.sh
内部APIを叩き、全コンテナの生存確認とRedisの接続状態を監視する

ENDPOINT=”http://localhost:6001/api/health”

check_status() {
response=$(curl -s -o /dev/null -w “%{http_code}” $ENDPOINT)
if [ $response -eq 200 ]; then
echo “[OK] Penpot Backend is healthy.”
else
echo “[CRITICAL] Penpot Backend unhealthy: $response”
# 自動再起動トリガーの呼び出し
systemctl restart penpot-container
fi
}

check_status

—

5. エキスパートの視点:メモリ消費とパフォーマンスハック

Penpotを大規模運用すると、キャンバス上のオブジェクト数が膨大になった際、メモリ消費が急激に跳ね上がる。これを防ぐための「現場の知見」を共有する。

1. JVM/BEAMのチューニング: PenpotはClojureで書かれており、Java仮想マシン(JVM)上で動作する。`JAVA_OPTS`を調整し、GC(ガベージコレクション)がアプリのレスポンスを止めないよう設定せよ。
2. CDNの活用: 静的アセット(`assets`)はコンテナから直接配信せず、S3 + CloudFrontの構成で完全にオフロードすること。これにより、Backendコンテナは「ロジックとデータ」のみに集中できる。
3. Redisの監視: `redis-cli –stat` を活用し、接続数とメモリ使用率を常に監視せよ。接続数が上限に達した際は、`keepalive`設定を調整し、不要なコネクションを即座に開放する設計が不可欠だ。

—

最後に:ツールを支配せよ

Penpotをセルフホストするということは、自らのデザインインフラを「プロダクト」として運用することと同義である。単に動けばいいという段階を卒業し、Redisによるセッション管理と水平スケーリングを完璧に制御できたとき、君たちはFigmaという閉じた世界から解放され、真に自由な創造の土台を手に入れることになる。

システムは、書かれた通りに動くのではない。設計された通りに動くのだ。
健闘を祈る。

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