Upgrading
Upgrades follow the same tag-based flow you used to install, whether you build from source or run the published image.
Build-from-source
Section titled “Build-from-source”Check out the newer release tag and rebuild:
git fetch --tagsgit checkout v1.4.0 # the desired release tagdocker compose -f docker-compose.prod.yml downdocker compose -f docker-compose.prod.yml up -d --build# migrations run automatically via the entrypointPublished image
Section titled “Published image”Point APP_IMAGE at the new tag, then pull and restart:
sed -i 's|^APP_IMAGE=.*|APP_IMAGE=ghcr.io/emmpaul/the-desk:1.4.0|' .envdocker compose -f docker-compose.prod.yml pulldocker compose -f docker-compose.prod.yml up -dMigrations run automatically on start — the app container’s entrypoint runs
php artisan migrate --force.
Your data persists
Section titled “Your data persists”Data survives down/up in named volumes:
pgsql-data— the PostgreSQL databasethe-desk-meili-<version>— the Meilisearch index (version-scoped, see below)redis-data— cache, session, and queued jobsstorage-app— uploaded files
Search reindexing
Section titled “Search reindexing”The Meilisearch on-disk format is version-specific — it refuses to boot against a
data directory written by a different version. MEILISEARCH_VERSION pins both
the image tag and the data volume name, so bumping it starts the new Meilisearch
on a fresh volume, and the app rebuilds the index from Postgres on boot
(php artisan search:sync). No manual dump or migration is needed — the search
index is derived data.
The old volume is left behind; prune it once the new version is healthy:
docker volume rm the-desk-meili-<old-version>