Unraid AIO Penpot with PostgreSQL, Redis, Mailpit, exporter, and MCP.
6.2K
![]()
An Unraid-first, single-container deployment of Penpot for people who want the easiest reliable self-hosted install without manually wiring PostgreSQL, Redis, SMTP capture, exporter, MCP, and the upstream compose stack on day one.
penpot-aio is opinionated for a predictable beginner install, but it does not hide the real tradeoffs: Penpot is still a heavier multi-service design platform, PENPOT_PUBLIC_URI still needs to match the URL users actually visit, and public production use still needs HTTPS, real SMTP, backups, and production-safe flags.
80808025/appdata/assets by default/appdata storage for database state, cache state, assets, generated secrets, Mailpit data, and optional overridesPENPOT_SECRET_KEY, bundled database password, bundled Redis password, and bundled Mailpit UI password when you leave them blankIf you want the simplest supported path:
Web UI Port and AppData at their defaults unless you have a port or path conflict.Public URL to the URL users will actually visit, such as http://tower.local:9001 or your reverse-proxy HTTPS URL.Mailpit UI Port and read the generated credentials from /appdata/config/generated.env.If you leave the important secrets blank, the wrapper will:
PENPOT_SECRET_KEY/appdata/assetsThe default lab-friendly flags include disable-email-verification, enable-smtp, disable-secure-session-cookies, and enable-mcp. Those defaults make first boot easier on a private LAN; they are not the right final posture for a public HTTPS deployment.
This repo is deliberately not a stripped-down wrapper. The generated Unraid template tracks the practical Penpot self-hosted environment surface from upstream config, official compose examples, docs, frontend entrypoint behavior, MCP settings, and AIO-specific defaults. In Advanced View you can:
PENPOT_AIO_ENABLE_INTERNAL_POSTGRES=false and external PENPOT_DATABASE_* settingsPENPOT_AIO_ENABLE_INTERNAL_REDIS=false and PENPOT_REDIS_URIPENPOT_FLAGS or the per-flag dropdown controls for known upstream flags/appdata/config/extra.env as a final sanitized key/value escape hatch for rare supported variablesThe wrapper still defaults to the internal bundled services so new Unraid users are not forced into extra containers on day one. External services should be configured intentionally, not half-filled alongside the internal defaults.
/appdata stores generated secrets, PostgreSQL data, cache data, uploaded assets, Mailpit data, logs, and optional override files. Back it up before upgrades or serious use.PENPOT_PUBLIC_URI must be correct. Browser flows, links, cookies, callbacks, and reverse-proxy behavior can break when it does not match the URL users actually visit.disable-secure-session-cookies and disable-email-verification, configure real SMTP, and review auth settings before production use./appdata/config/extra.env is parsed as dotenv-style KEY=value data. It is not shell-sourced; shell syntax is not executed, and only supported key prefixes/core runtime keys are accepted.v2.15.3-aio.1.aio-fleet from .aio-fleet.yml.<Changes> sync are run centrally by aio-fleet during release preparation.main publishes latest, the pinned upstream version tag, the explicit AIO package tag, and sha-<commit> to Docker Hub.See docs/releases.md for the central release process details.
Required local validation is split between app-specific tests and aio-fleet:
python3 -m venv .venv-local
.venv-local/bin/pip install -e "../aio-fleet[app-tests]"
python3 scripts/refresh_upstream_inventory.py
python3 scripts/generate_penpot_template.py --check
.venv-local/bin/pytest tests/template --junit-xml=reports/pytest-unit.xml -o junit_family=xunit1
.venv-local/bin/pytest tests/integration -m integration --junit-xml=reports/pytest-integration.xml -o junit_family=xunit1
cd ../aio-fleet
.venv/bin/python -m aio_fleet validate-repo --repo penpot-aio --repo-path ../penpot-aio
.venv/bin/python -m aio_fleet cleanup-repo --repo penpot-aio --repo-path ../penpot-aio --verify
.venv/bin/python -m aio_fleet sync-catalog --repo penpot-aio --catalog-path ../awesome-unraid --dry-run
The integration suite builds a Linux amd64 image and boots the full container stack, so it is intentionally more expensive than the unit and XML checks.
The extended runtime matrix is opt-in and covers external PostgreSQL, external Redis, S3-compatible storage, and external SMTP/Mailpit paths:
AIO_RUN_EXTENDED_INTEGRATION=true .venv-local/bin/pytest tests/integration -m extended_integration
CI cost model:
main pushes run the fast validation layers firstmain release-metadata commits when publish is still in play, and for manual dispatchesThis repo is the source repo. The CA-facing XML and icon should be synced into JSONbored/awesome-unraid only after:
awesome-unraid/main assetsIf this work saves you time, support it here:
Content type
Image
Digest
sha256:cb7bf7304…
Size
1.3 GB
Last updated
about 1 month ago
docker pull jsonbored/penpot-aio:sha-e756c0925cdd67cf42fdad0429ec3170c3e9f39b