Dockerfile builds warp-aio on SQLite, Dockerfile.PocketBase builds warp-aio-pocketbase and Dockerfile.PostgreSQL builds warp-aio-postgresql with PostgreSQL bundled. The database driver and connection string now come from the image, so the SQLite and PocketBase images no longer carry PostgreSQL (103 MB instead of 149 MB). The AIO compose files point at their own Dockerfile and image, and the entrypoint refuses to start an embedded PostgreSQL in an image that has none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Docker-AIO: everything in one image
The homeserver, the admin panel and the web client in one image, one image
per database. entrypoint.sh starts them in one
container; if one exits, the rest are stopped and the container's restart
policy brings the set back.
| Dockerfile | Image | Database |
|---|---|---|
Dockerfile |
warp-aio |
SQLite, /data/warp.db |
Dockerfile.PocketBase |
warp-aio-pocketbase |
PocketBase (embedded driver), /data/pb_data |
Dockerfile.PostgreSQL |
warp-aio-postgresql |
PostgreSQL 17 in the container, /data/postgres |
| Compose file | Image |
|---|---|
docker-compose.sqlite.yml |
warp-aio, built here |
docker-compose.pocketbase.yml |
warp-aio-pocketbase, built here |
docker-compose.postgresql.yml |
warp-aio-postgresql, built here |
docker-compose.*.prod.yml |
the same images, pulled, never built |
Everything lives in the warp-data volume, mounted on /data.
cd Docker-AIO
cp .env.example .env # then edit it
docker compose -f docker-compose.sqlite.yml up -d --build
docker compose -f docker-compose.sqlite.yml exec warp warp create-account --username admin --admin
Homeserver on :8008, admin panel on :8009, web client on :8080.
The PostgreSQL in warp-aio-postgresql listens only on a Unix socket
inside the container, so it needs no password and is not reachable from
outside. To point that image at a PostgreSQL elsewhere instead, set
WARP_AIO_EMBEDDED_POSTGRES=false and WARP_DB_CONNECTION_STRING.
The three Dockerfiles share their build stages line for line; only the header and the final stage differ. Keep the build stages in step when changing one.
Settings
Every setting is in .env, copied from .env.example,
which lists them all with their defaults; an empty value means the
default. .env is not committed. On top of the settings of
Docker/, it has:
| Variable | Default | |
|---|---|---|
WARP_AIO_ADMIN |
true |
false runs no admin panel |
WARP_AIO_WEB |
true |
false runs no web client |
The database driver and connection string come from the image.
Prod files
The .prod.yml files pull $WARP_REGISTRY/<image>:$WARP_VERSION
(defaults ghcr.io/dariuszjaniak and latest). Push the images first,
from the repository root:
docker build -t $WARP_REGISTRY/warp-aio:$WARP_VERSION -f Docker-AIO/Dockerfile .
docker build -t $WARP_REGISTRY/warp-aio-pocketbase:$WARP_VERSION -f Docker-AIO/Dockerfile.PocketBase .
docker build -t $WARP_REGISTRY/warp-aio-postgresql:$WARP_VERSION -f Docker-AIO/Dockerfile.PostgreSQL .
for i in warp-aio warp-aio-pocketbase warp-aio-postgresql; do
docker push $WARP_REGISTRY/$i:$WARP_VERSION
done