Skip to content

2025.10.0: Postgres foreign key violation, unique constraint violation, and ExclusiveLock errors #17749

@oblivioncth

Description

@oblivioncth

Describe the bug
Various errors related to postgres and it's new use as a cache occur after upgrading to 2025.10.0

See logs, but highlights are:

Postgres:

WARNING:  you don't own a lock of type ExclusiveLock
ERROR:  insert or update on table "authentik_tasks_tasklog" violates foreign key constraint "authentik_tasks_task_task_id_a82f0835_fk_authentik"
ERROR:  duplicate key value violates unique constraint "django_postgres_cache_cacheentry_pkey"

Worker:

authentik-worker  | {"domain_url": null, "event": "Unexpected failure in before_process_message of .", "exception": [{"exc_notes": [], "exc_type": "IntegrityError", "exc_value": "insert or update on table \"authentik_tasks_tasklog\" violates foreign key constraint \"authentik_tasks_task_task_id_a82f0835_fk_authentik\"\nDETAIL:  Key (task_id)=(fe2558c5-9784-4d0f-91c6-605c5ab1e17a) is not present in table \"authentik_tasks_task\".", "exceptions": [], "frames": [{"filename": "/ak-root/.venv/lib/python3.13/site-packages/dramatiq/broker.py", "lineno": 105, "name": "emit_before"}, {"filename": "/authentik/tasks/middleware.py", "lineno": 95, "name": "before_process_message"}, {"filename": "/authentik/tasks/models.py", "lineno": 126, "name": "log"}, {"filename": "/authentik/tasks/models.py", "lineno": 171, "name": "create_from_log_event"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/manager.py", "lineno": 87, "name": "manager_method"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/query.py", "lineno": 663, "name": "create"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 902, "name": "save"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1008, "name": "save_base"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1169, "name": "_save_table"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1210, "name": "_do_insert"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/manager.py", "lineno": 87, "name": "manager_method"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/query.py", "lineno": 1868, "name": "_insert"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py", "lineno": 1882, "name": "execute_sql"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 79, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 92, "name": "_execute_with_wrappers"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 100, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/utils.py", "lineno": 91, "name": "__exit__"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 105, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django_prometheus/db/common.py", "lineno": 69, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/psycopg/cursor.py", "lineno": 97, "name": "execute"}], "is_cause": false, "is_group": false, "syntax_error": null}, {"exc_notes": [], "exc_type": "ForeignKeyViolation", "exc_value": "insert or update on table \"authentik_tasks_tasklog\" violates foreign key constraint \"authentik_tasks_task_task_id_a82f0835_fk_authentik\"\nDETAIL:  Key (task_id)=(fe2558c5-9784-4d0f-91c6-605c5ab1e17a) is not present in table \"authentik_tasks_task\".", "exceptions": [], "frames": [{"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 105, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django_prometheus/db/common.py", "lineno": 69, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/psycopg/cursor.py", "lineno": 97, "name": "execute"}], "is_cause": true, "is_group": false, "syntax_error": null}], "level": "critical", "logger": "django_dramatiq_postgres.broker", "pid": 59, "schema_name": "public", "timestamp": "2025-10-28T07:43:08.242698"}
authentik-worker  | {"domain_url": null, "event": "Unexpected failure in before_process_message of .", "exception": [{"exc_notes": [], "exc_type": "IntegrityError", "exc_value": "insert or update on table \"authentik_tasks_tasklog\" violates foreign key constraint \"authentik_tasks_task_task_id_a82f0835_fk_authentik\"\nDETAIL:  Key (task_id)=(7c2c05f3-d140-4bda-a27b-5c04b5c6c42e) is not present in table \"authentik_tasks_task\".", "exceptions": [], "frames": [{"filename": "/ak-root/.venv/lib/python3.13/site-packages/dramatiq/broker.py", "lineno": 105, "name": "emit_before"}, {"filename": "/authentik/tasks/middleware.py", "lineno": 95, "name": "before_process_message"}, {"filename": "/authentik/tasks/models.py", "lineno": 126, "name": "log"}, {"filename": "/authentik/tasks/models.py", "lineno": 171, "name": "create_from_log_event"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/manager.py", "lineno": 87, "name": "manager_method"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/query.py", "lineno": 663, "name": "create"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 902, "name": "save"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1008, "name": "save_base"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1169, "name": "_save_table"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/base.py", "lineno": 1210, "name": "_do_insert"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/manager.py", "lineno": 87, "name": "manager_method"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/query.py", "lineno": 1868, "name": "_insert"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py", "lineno": 1882, "name": "execute_sql"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 79, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 92, "name": "_execute_with_wrappers"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 100, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/utils.py", "lineno": 91, "name": "__exit__"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 105, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django_prometheus/db/common.py", "lineno": 69, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/psycopg/cursor.py", "lineno": 97, "name": "execute"}], "is_cause": false, "is_group": false, "syntax_error": null}, {"exc_notes": [], "exc_type": "ForeignKeyViolation", "exc_value": "insert or update on table \"authentik_tasks_tasklog\" violates foreign key constraint \"authentik_tasks_task_task_id_a82f0835_fk_authentik\"\nDETAIL:  Key (task_id)=(7c2c05f3-d140-4bda-a27b-5c04b5c6c42e) is not present in table \"authentik_tasks_task\".", "exceptions": [], "frames": [{"filename": "/ak-root/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", "lineno": 105, "name": "_execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/django_prometheus/db/common.py", "lineno": 69, "name": "execute"}, {"filename": "/ak-root/.venv/lib/python3.13/site-packages/psycopg/cursor.py", "lineno": 97, "name": "execute"}], "is_cause": true, "is_group": false, "syntax_error": null}], "level": "critical", "logger": "django_dramatiq_postgres.broker", "pid": 59, "schema_name": "public", "timestamp": "2025-10-28T07:43:08.286990"}

This occurs directly upon stack deployment after upgrading and removing redis (or even if redis is kept).

Authentik appears to function normally otherwise, though only extremely minimal testing was performed.

To Reproduce
Update to 2025.10.0.

Expected behavior
Postgres interactions occur without error.

Logs
I tried my best to only grab the relevant sections from each service.

Logs are attached because even the cutdown copies exceed the character limit of GitHub.

postgres.log
server.log
worker.log

Version and Deployment (please complete the following information):

2025.10.0

Compose:

services:
  postgres:
    container_name: authentik-postgres
    image: docker.io/library/postgres:17-alpine
    restart: unless-stopped
    user: 568:568
    networks:
      - authentik
      - db
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}
      start_period: 20s
      interval: 30s
      retries: 5
      timeout: 5s
    volumes:
      - ${MOUNT_DB}:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${PG_PASS:?database password required}
      POSTGRES_USER: ${PG_USER:-authentik}
      POSTGRES_DB: ${PG_DB:-authentik}
    deploy:
      resources:
        limits:
          cpus: 2
          memory: 1GB
  # SERVER
  server:
    container_name: authentik-server
    image: ghcr.io/goauthentik/server:2025.10.0@sha256:a283f44eefd68bcfc25cdfbdc0372e6384b60468ca042278bde0a4bd8af4680f
    restart: unless-stopped
    command: server
    user: 568:568
    networks:
      - authentik
      - proxy
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      AUTHENTIK_POSTGRESQL__HOST: authentik-postgres
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
    volumes:
      - ${MOUNT_SERVER_WORKER}/media:/media
      - ${MOUNT_SERVER_WORKER}/custom-templates:/templates
    labels:
      - traefik.enable=true
      # Rules for direct access
      - traefik.http.routers.authentik.rule=Host(`auth.${PROXY_TLD}`) # Direct access
      - traefik.http.routers.authentik.entrypoints=websecure
      - traefik.http.routers.authentik.middlewares=external-expose@file
      - traefik.http.services.authentik.loadbalancer.server.port=9000
      # Rules for forward auth
      - traefik.http.routers.authentik-outpost.rule=(Host(`${PROXY_TLD}`) ||
        HostRegexp(`{subdomain:[a-z0-9-]+}.${PROXY_TLD}`)) &&
        PathPrefix(`/outpost.goauthentik.io/`)
      - traefik.http.routers.authentik-outpost.entrypoints=websecure
      - traefik.http.routers.authentik-outpost.middlewares=external-expose@file # Might break, idk yet
      - traefik.http.routers.authentik-outpost.tls=true
    # ports:
    #   - ${COMPOSE_PORT_HTTP:-9000}:9000
    #   - ${COMPOSE_PORT_HTTPS:-9443}:9443
    depends_on:
      postgres:
        condition: service_healthy
    deploy:
      resources:
        limits:
          cpus: 4
          memory: 4GB
  # WORKER
  worker:
    container_name: authentik-worker
    image: ghcr.io/goauthentik/server:2025.10.0@sha256:a283f44eefd68bcfc25cdfbdc0372e6384b60468ca042278bde0a4bd8af4680f
    restart: unless-stopped
    command: worker
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      AUTHENTIK_POSTGRESQL__HOST: authentik-postgres
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
      AUTHENTIK_DISABLE_STARTUP_ANALYTICS: true
      AUTHENTIK_DISABLE_UPDATE_CHECK: false
      AUTHENTIK_ERROR_REPORTING__ENABLED: false
      # AUTHENTIK_COOKIE_DOMAIN:
      # SMTP Host Emails are sent to
      AUTHENTIK_EMAIL__HOST: smtp.gmail.com
      AUTHENTIK_EMAIL__PORT: 587
      # Optionally authenticate (don't add quotation marks to your password)
      AUTHENTIK_EMAIL__USERNAME: ${AUTHENTIK_EMAIL_ADDRESS}
      AUTHENTIK_EMAIL__PASSWORD: ${AUTHENTIK_EMAIL_PASSWORD}
      # Use StartTLS
      AUTHENTIK_EMAIL__USE_TLS: true
      # Use SSL
      AUTHENTIK_EMAIL__USE_SSL: false
      AUTHENTIK_EMAIL__TIMEOUT: 10
      # Email address authentik will send from, should have a correct @domain
      AUTHENTIK_EMAIL__FROM: ${AUTHENTIK_EMAIL_ADDRESS}
    user: 568:568
    networks:
      - authentik
    volumes:
      # - /var/run/docker.sock:/var/run/docker.sock Only for Docker integration, which has security challenges, and doesn't allow as much manual control. If ever using, use socket proxy instead
      - ${MOUNT_SERVER_WORKER}/media:/media
      - ${MOUNT_SERVER_WORKER}/certs:/certs
      - ${MOUNT_SERVER_WORKER}/custom-templates:/templates
      - ${MOUNT_SERVER_WORKER}/custom-blueprints:/blueprints/custom
    deploy:
      resources:
        limits:
          cpus: 4
          memory: 4GB
    depends_on:
      postgres:
        condition: service_healthy
networks:
  authentik:
    name: authentik-network
  proxy:
    external: true
  db:
    external: true

Metadata

Metadata

Assignees

Type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions