Proxmox LXCへの配備
検証済み構成では、専用のUbuntu 24.04 privileged LXCを使います。OpenFace 自体はLXC内の1つのDocker Composeプロジェクトとして動き、Proxmoxがリソース 制限、スナップショット、ホスト起動時の自動起動を担当します。
検証済みプロファイル
| 設定 | 値 |
|---|---|
| LXC ID / hostname | 101 / openface |
| CPU / memory / swap | 6 cores / 8 GiB / 4 GiB |
| root disk | local-lvm 上の80 GiB |
| network | vmbr0、DHCP |
| container mode | privileged |
| features | nesting=1,keyctl=1 |
| boot | onboot=1 |
OpenFace SpacesはDocker imageとcontainerを動的に作るため、nested Dockerが 必要です。/etc/pve/lxc/<VMID>.conf に次を追加してLXCを再起動します。
features: nesting=1,keyctl=1
lxc.apparmor.profile: unconfined
lxc.cgroup2.devices.allow: a
lxc.cap.drop:このLXCだけ隔離を緩和します。信頼済みのアプリケーションホストとして扱い、 信頼できないユーザーにSpaceのDockerfileを公開させないでください。
Runtimeの導入
LXC内で実行します。
apt-get update
apt-get install -y ca-certificates curl git openssh-server rsync
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker ssh
docker run --rm alpine echo nested-docker-okOpenFaceをcloneして起動します。
git clone https://github.com/Sunwood-ai-labs/OpenFace.git /opt/openface
cd /opt/openface
cp .env.example .env
sed -i 's|^PUBLIC_BASE_URL=.*|PUBLIC_BASE_URL=https://<LXC-IP>:8443|' .env
docker compose up -d --buildhttps://<LXC-IP>:8443 を開きます。自己署名証明書を受け付けないローカル WebViewでは http://<LXC-IP>:8090 も利用できます。
PostgreSQLによる永続化
既存LXCを更新するときは、先にupgradeとデータ保持のrunbookを 実行してください。このページはdeployment固有のbackup commandを説明する もので、preflight、migration、更新後比較の代わりにはなりません。
ComposeはPostgreSQL 17を1サービス起動し、用途別に3 DBを作成します。 v0.5.0 migrationが終わっていないv0.4.0環境では、pipeline audit/historyとreconcile stateはまだlegacy SQLiteの/data/agents/pipelines/pipeline-audit.dbとして openface_agent-metrics-data volume内に保存され、openface_metrics dumpには含まれません。 OpenFace v0.5.0ではauthoritativeなstateをopenface_metricsのopenface_pipeline schemaへ 保存します。upgrade hostで新しいpipeline writeを受け付ける前に、明示的なpipeline移行手順 を実行します。
| Database | 保存内容 |
|---|---|
forgejo | repository、user、Issue、PR、Actions metadata |
openface_metrics | browser/agent view、like、agent identity |
openface_maintenance | webhook deliveryとmaintenance job |
Git repository本体、LFS object、token、agent credential、runner登録、移行前のlegacy pipeline SQLiteはnamed Docker volumeに残ります。MCP profileを有効にする場合は openface_mcp-stateと、operatorが選択したOPENFACE_MCP_STATE_DIR bind mountも 別にバックアップします。後者はnamed volumeではなくregistryとlifecycle-audit fileを含みます。
backup_dir="${BACKUP_DIR:-/opt/openface-deploy}"
postgres_user="${POSTGRES_USER:-$(sed -n 's/^POSTGRES_USER=//p' .env | head -n 1)}"
postgres_user="${postgres_user:-openface}"
umask 077
mkdir -p "$backup_dir"
docker exec openface-postgres pg_dump -U "$postgres_user" -Fc forgejo \
> "$backup_dir/forgejo.dump"
docker exec openface-postgres pg_dump -U "$postgres_user" -Fc openface_metrics \
> "$backup_dir/openface_metrics.dump"
docker exec openface-postgres pg_dump -U "$postgres_user" -Fc openface_maintenance \
> "$backup_dir/openface_maintenance.dump"scripts/restore_lxc_deployment.sh は、準備済みcheckoutへ3つのdumpとnamed volume archiveを復元します。OPENFACE_MCP_ENABLED=1ではMCP named volume、 bind archive、保護されたcredential fileを必須として復元し、復元先pathを変える 場合は対応するOPENFACE_MCP_*_FILE変数を渡します。secretはmanifestとGitへ 出しません。
実機検証
移行後にrepository 105件、Issue 53件、repository view 280行、maintenance job 25件を確認しました。QR Code Generator SpaceをLXC内でbuild・起動し、LXCを 完全再起動した後も running へ自動復帰しています。
| LAN上のホーム | 実行中のDocker Space |
|---|---|
![]() | ![]() |


