---
title: Upgrade PostgreSQL on Docker Compose
---

This guide describes a manual PostgreSQL major-version upgrade for the default authentik Docker Compose deployment.

It assumes the PostgreSQL service is named `postgresql` and the authentik database is named `authentik`. If your Compose file uses different names, adjust the commands accordingly.

## Before you start

- Make sure you have enough free disk space for:
    - a SQL dump of the database
    - a copy of the existing PostgreSQL data directory or volume
    - the newly initialized PostgreSQL data directory
- Expect downtime while the database is exported, recreated, and restored.
- Review the [Backup and restore](../../sys-mgmt/ops/backup-restore.md) guidance before proceeding.

## 1. Create a logical backup

Create a database dump:

```shell
docker compose exec postgresql pg_dump -U authentik -d authentik -cC > authentik-postgres-backup.sql
```

Before continuing, confirm that `authentik-postgres-backup.sql` exists and contains the expected database objects.

## 2. Stop your authentik stack

Stop all services with this command:

```shell
docker compose down
```

## 3. Back up the PostgreSQL data directory

Back up the existing PostgreSQL data before replacing it.

If you use Docker volumes:

```shell
docker volume create authentik_database_backup
docker run --rm -v authentik_database:/from -v authentik_database_backup:/to alpine sh -c 'cd /from && cp -a . /to'
```

You can find the exact name of the PostgreSQL volume with `docker volume ls` if it differs from `authentik_database`.

Alternatively, if your PostgreSQL data is stored on the host filesystem:

```shell
cp -a /path/to/postgres-data /path/to/postgres-data-backup
```

## 4. Remove the old data directory

:::danger
Do not continue unless both the database dump and the filesystem or volume backup completed successfully.
:::

If you use Docker volumes:

```shell
docker volume rm -f authentik_database
```

Alternatively, if your PostgreSQL data is stored on the host filesystem:

```shell
rm -rf /path/to/postgres-data
```

## 5. Update the PostgreSQL image

Edit your `compose.yml` and update the PostgreSQL image tag to the new major version.

For example, change:

```yaml
image: docker.io/library/postgres:12-alpine
```

to:

```yaml
image: docker.io/library/postgres:16-alpine
```

Temporarily add `network_mode: none` to the PostgreSQL service to prevent connections being established to the database during the upgrade.

## 6. Recreate PostgreSQL and restore the database

Pull images and start only PostgreSQL:

```shell
docker compose pull
docker compose up --force-recreate -d postgresql
```

Restore the logical backup:

```shell
cat authentik-postgres-backup.sql | docker compose exec -T postgresql psql -U authentik
```

After the restore succeeds, remove the temporary `network_mode: none` setting from `compose.yml`.

## 7. Start authentik again

Start the full stack:

```shell
docker compose up --force-recreate -d
```

## 8. Verify the upgrade

After the stack is healthy again:

- confirm that authentik loads normally
- check the server, worker, and postgresql logs for startup or migration errors
- log in to authentik through the UI to verify the application is functioning normally
