Docker Compose deployment
Deploy Squest app
The docker-compose based deployment is a good way to easily and quickly test Squest. This way of deploying is also stable enough to be used in production.
To run the Squest application, execute the docker-compose.yml file:
docker-compose up
Then connect with your web browser to http://127.0.0.1:8080
The default admin account is admin // admin
The default export the port 8080. If you want to use the standard HTTP port 80, update the
file docker-compose.override.yml.
services:
nginx:
ports:
- "80:8080"
Infrastructure image updates
Compose pins infrastructure images to explicit releases: MariaDB 11.8 LTS,
RabbitMQ 4.4 (management), Redis 8.10, Nginx 1.30 stable, PostgreSQL 18, and
Caddy 2.11. phpMyAdmin remains on 5.2.3. The Squest image is selected separately
with SQUEST_IMAGE and SQUEST_TAG.
docker/rabbitmq.conf permits transient non-exclusive queues for compatibility
with the pinned Celery 5.5/Kombu client. RabbitMQ 4.3+ denies these queues by
default. Keep this configuration mounted when deploying the new broker; remove
the compatibility setting only after upgrading and verifying the client's
control/reply queue behavior. Django's HTTP readiness check gates Celery and
Nginx startup so migrations and initial data finish before they start.
The application image uses Python 3.12 on Debian Bookworm. Startup stops on a
failed migration or initialization command instead of serving a partial schema.
Build and deploy the updated Squest image as well, so it includes the backend
configuration and migration compatibility fixes:
docker build -t squest:compose-update -f docker/squest.Dockerfile .
SQUEST_IMAGE=squest SQUEST_TAG=compose-update docker compose up -d
For PostgreSQL, use Docker Compose 2.24.4 or newer:
docker compose -f docker-compose.yml -f psql.docker-compose.yaml -f docker-compose.override.yml up -d
The override selects PostgreSQL as the default backend (DB_ENGINE) for Django
and Celery, including transactions and third-party schedulers, initializes
the application database, and uses a PostgreSQL healthcheck. DB_DATABASE,
DB_USER, and DB_PASSWORD can be set in the shell or Compose .env file to
configure both initialization and the application. The administrator password
is configured through POSTGRES_PASSWORD in docker/environment_variables/db.env.
PostgreSQL uses a separate psql_data volume mounted at /var/lib/postgresql,
as required by the PostgreSQL 18 image layout. Initialization scripts run only
on an empty database volume.
Fresh installations use replacement migrations for four historical
service_catalog migrations:
0014_postgresql_compatibleand0044_postgresql_compatiblecheck foreign keys immediately within their transactions to avoid pending-trigger errors between data changes and DDL.0023_portable_state_conversionand0024_portable_hook_conversionuse historical ORM models to convert legacy states, replacing MySQL-specific SQL string quoting. The hook split retains its original behavior for valid legacy hooks.
The replacements set a transaction-local 2-second lock timeout on PostgreSQL. Existing installations that already applied the original migrations do not rerun their operations. Keep the original migration files: the replacements reuse their historical schema definitions. These are compatibility fixes, not zero-downtime rewrites: the original table locks and schema changes still require a planned upgrade window when updating an installation from before those migrations.
Existing deployments
Back up persistent data before changing database or broker versions. Successful startup on a fresh volume does not validate an upgrade of existing data.
- MariaDB 11.0 → 11.8: follow the
MariaDB upgrade documentation.
Use a supported intermediate upgrade path or a logical dump/restore into a
fresh volume. When following an in-place upgrade procedure, run the required
system-table upgrade (
mariadb-upgrade, or the image'sMARIADB_AUTO_UPGRADEoption) and verify the result before starting Squest. - RabbitMQ 3.13 → 4.4: follow the supported upgrade paths. Enable the required feature flags and upgrade through the supported release series; do not attach the existing 3.13 data volume directly to 4.4. An alternative is a new broker with exported/imported definitions and a planned drain or transfer of queued messages (definitions do not include messages).
- PostgreSQL: the previous
latesttag did not identify the installed major version. Check the running server's version before upgrading. For a major upgrade, use PostgreSQL's documentedpg_upgradeor dump/restore procedure. Existingdb_datavolumes mounted at/var/lib/postgresql/dataare not migrated automatically into the newpsql_datavolume. - Redis: this Compose service is a password-protected, disposable cache without a persistent volume; expect a cold cache after replacement.
TLS
This section explains how to add TLS support on Squest when using docker-compose based deployment.
The TLS endpoint is managed by a reverse proxy on top of the default web server. This is not the only way to handle this part. Many tools like Nginx, Apache or Traefik could be used, and you are free to use the one you want instead of this proposed configuration. The only recommendation we have is to keep the default nginx web server as main http entrypoint.
Using Caddy
Caddy is a powerful webserver written in Go which provide a reverse proxy feature.
In the example below, we'll use self-signed certificate. Follow the official documentation if you want to configure it to use an ACME like "Let's Encrypt" instead.
Place your certificate and key file in the folder docker/certs.
E.g:
docker
├── Caddyfile
├── certs
│ ├── squest.crt
│ └── squest.key
Update the docker/Caddyfile with the FQDN of your server. By default, the FQDN is set to squest.domain.local
squest.domain.local { # This line should match the ALLOWED_HOSTS in your Squest environment
reverse_proxy nginx:8080
encode gzip zstd
tls /etc/ssl/private/squest.crt /etc/ssl/private/squest.key
# or:
# tls /etc/ssl/private/cert.pem
log {
level error
}
}
Update the ALLOWED_HOSTS environment variable from the configuration file docker/environment_variables/squest.env
to match your FQDN.
ALLOWED_HOSTS=squest.domain.local
Start docker compose with the TLS configuration:
docker-compose -f docker-compose.yml -f tls.docker-compose.yml up
The squest service is then reachable via HTTP and HTTPS standard ports (80/443).
- http://squest.domain.local
- https://squest.domain.local