goauthentik / goauthentik/authentik
Migration error during upgrade 2026.05.06 -> 2026.05.07
- Dominant language
- Python
- Stars
- 25.6k
- Forks
- 2k
- Avg merge
- 1d 2h
- Merged PRs (30d)
- 651
Description
### Describe the bug
During migrations a ProgrammingError is prompted (logs attached below). The application appears to still function after upgrade
### How to reproduce
Upgrade 2026.05.06 -> 2026.05.07, we are using docker-compose
### Expected behavior
No migration error
### Screenshots
_No response_
### Additional context
_No response_
### Deployment Method
Docker
### Version
2026.05.07
### Relevant log output
```shell
server-1 | === Starting migration
server-1 | Operations to perform:
server-1 | Apply all migrations: auth, authentik_blueprints, authentik_brands, authentik_core, authentik_crypto, authentik_endpoints, authentik_endpoints_connectors_agent, authentik_endpoints_connectors_fleet, authentik_endpoints_connectors_google_chrome, authentik_enterprise, authentik_events, authentik_flows, authentik_lifecycle, authentik_outposts, authentik_policies, authentik_policies_dummy, authentik_policies_event_matcher, authentik_policies_expiry, authentik_policies_expression, authentik_policies_geoip, authentik_policies_password, authentik_policies_reputation, authentik_policies_unique_password, authentik_providers_google_workspace, authentik_providers_ldap, authentik_providers_microsoft_entra, authentik_providers_oauth2, authentik_providers_proxy, authentik_providers_rac, authentik_providers_radius, authentik_providers_saml, authentik_providers_scim, authentik_providers_ssf, authentik_providers_ws_federation, authentik_rbac, authentik_reports, authentik_sources_kerberos, authentik_sources_ldap, authentik_sources_oauth, authentik_sources_plex, authentik_sources_saml, authentik_sources_scim, authentik_sources_telegram, authentik_stages_account_lockdown, authentik_stages_authenticator_duo, authentik_stages_authenticator_email, authentik_stages_authenticator_endpoint_gdtc, authentik_stages_authenticator_sms, authentik_stages_authenticator_static, authentik_stages_authenticator_totp, authentik_stages_authenticator_validate, authentik_stages_authenticator_webauthn, authentik_stages_captcha, authentik_stages_consent, authentik_stages_deny, authentik_stages_dummy, authentik_stages_email, authentik_stages_identification, authentik_stages_invitation, authentik_stages_mtls, authentik_stages_password, authentik_stages_prompt, authentik_stages_redirect, authentik_stages_source, authentik_stages_user_delete, authentik_stages_user_login, authentik_stages_user_logout, authentik_stages_user_write, authentik_tasks, authentik_tasks_schedules, authentik_tenants, contenttypes, django_channels_postgres, django_postgres_cache, guardian, sessions
server-1 | Running migrations:
server-1 | Applying authentik_core.0064_user_authentik_c_usernam_2f0e4b_idx...
server-1 | {"domain_url": null, "event": "releasing database lock", "level": "info", "logger": "lifecycle.migrate", "pid": 24, "schema_name": "public", "timestamp": "2026-09-11T05:37:42.590809"}
server-1 | Failed to read config file: ./lifecycle/gunicorn.conf.py
server-1 | Traceback (most recent call last):
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 103, in _execute
server-1 | return self.cursor.execute(sql)
server-1 | ~~~~~~~~~~~~~~~~~~~^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django_prometheus/db/common.py", line 69, in execute
server-1 | return super().execute(*args, **kwargs)
server-1 | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/psycopg/cursor.py", line 117, in execute
server-1 | raise ex.with_traceback(None)
server-1 | psycopg.errors.DuplicateTable: relation "authentik_c_usernam_2f0e4b_idx" already exists
server-1 |
server-1 | The above exception was the direct cause of the following exception:
server-1 |
server-1 | Traceback (most recent call last):
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/gunicorn/app/base.py", line 110, in get_config_from_filename
server-1 | spec.loader.exec_module(mod)
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~^^^^^
server-1 | File "", line 759, in exec_module
server-1 | File "", line 491, in _call_with_frames_removed
server-1 | File "/lifecycle/gunicorn.conf.py", line 153, in
server-1 | run_migrations()
server-1 | ~~~~~~~~~~~~~~^^
server-1 | File "/lifecycle/migrate.py", line 123, in run_migrations
server-1 | execute_from_command_line(["", "migrate_schemas"])
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
server-1 | utility.execute()
server-1 | ~~~~~~~~~~~~~~~^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/__init__.py", line 436, in execute
server-1 | self.fetch_command(subcommand).run_from_argv(self.argv)
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/base.py", line 420, in run_from_argv
server-1 | self.execute(*args, **cmd_options)
server-1 | ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/base.py", line 464, in execute
server-1 | output = self.handle(*args, **options)
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django_tenants/management/commands/migrate_schemas.py", line 66, in handle
server-1 | executor.run_migrations(tenants=[self.PUBLIC_SCHEMA_NAME])
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django_tenants/migration_executors/standard.py", line 11, in run_migrations
server-1 | run_migrations(self.args, self.options, self.codename, self.PUBLIC_SCHEMA_NAME)
server-1 | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django_tenants/migration_executors/base.py", line 61, in run_migrations
server-1 | migrate_command_class(stdout=stdout, stderr=stderr).execute(*args, **options)
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/base.py", line 464, in execute
server-1 | output = self.handle(*args, **options)
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/base.py", line 111, in wrapper
server-1 | res = handle_func(*args, **kwargs)
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/core/management/commands/migrate.py", line 353, in handle
server-1 | post_migrate_state = executor.migrate(
server-1 | targets,
server-1 | ...<3 lines>...
server-1 | fake_initial=fake_initial,
server-1 | )
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/migrations/executor.py", line 135, in migrate
server-1 | state = self._migrate_all_forwards(
server-1 | state, plan, full_plan, fake=fake, fake_initial=fake_initial
server-1 | )
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/migrations/executor.py", line 167, in _migrate_all_forwards
server-1 | state = self.apply_migration(
server-1 | state, migration, fake=fake, fake_initial=fake_initial
server-1 | )
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/migrations/executor.py", line 255, in apply_migration
server-1 | state = migration.apply(state, schema_editor)
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/migrations/migration.py", line 132, in apply
server-1 | operation.database_forwards(
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
server-1 | self.app_label, schema_editor, old_state, project_state
server-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | )
server-1 | ^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/migrations/operations/models.py", line 954, in database_forwards
server-1 | schema_editor.add_index(model, self.index)
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/postgresql/schema.py", line 317, in add_index
server-1 | self.execute(
server-1 | ~~~~~~~~~~~~^
server-1 | index.create_sql(model, self, concurrently=concurrently), params=None
server-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | )
server-1 | ^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/pgtrigger/migrations.py", line 483, in execute
server-1 | return super().execute(*args, **kwargs)
server-1 | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/postgresql/schema.py", line 45, in execute
server-1 | return super().execute(sql, params)
server-1 | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/base/schema.py", line 204, in execute
server-1 | cursor.execute(sql, params)
server-1 | ~~~~~~~~~~~~~~^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 79, in execute
server-1 | return self._execute_with_wrappers(
server-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
server-1 | sql, params, many=False, executor=self._execute
server-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | )
server-1 | ^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
server-1 | return executor(sql, params, many, context)
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 100, in _execute
server-1 | with self.db.wrap_database_errors:
server-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/utils.py", line 91, in __exit__
server-1 | raise dj_exc_value.with_traceback(traceback) from exc_value
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 103, in _execute
server-1 | return self.cursor.execute(sql)
server-1 | ~~~~~~~~~~~~~~~~~~~^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/django_prometheus/db/common.py", line 69, in execute
server-1 | return super().execute(*args, **kwargs)
server-1 | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
server-1 | File "/ak-root/.venv/lib/python3.14/site-packages/psycopg/cursor.py", line 117, in execute
server-1 | raise ex.with_traceback(None)
server-1 | django.db.utils.ProgrammingError: relation "authentik_c_usernam_2f0e4b_idx" already exists
server-1 | {"error":"exit status 1","event":"gunicorn process died, restarting","level":"warning","logger":"authentik.router","timestamp":"2026-09-11T05:37:43Z"}
server-1 | {"error":"exit status 1","event":"gunicorn failed to start, restarting","level":"error","logger":"authentik.router","timestamp":"2026-09-11T05:37:43Z"}
server-1 | {"event": "Loaded config", "level": "debug", "logger": "authentik.lib.config", "timestamp": 1789105063.4624715, "file": "/authentik/lib/default.yml"}
server-1 | {"event": "Loaded environment variables", "level": "debug", "logger": "authentik.lib.config", "timestamp": 1789105063.4627516, "count": 26}
server-1 | {"event": "Starting authentik bootstrap", "level": "info", "logger": "authentik.lib.config", "timestamp": 1789105063.7799828}
server-1 | {"event": "PostgreSQL connection successful", "level": "info", "logger": "authentik.lib.config", "timestamp": 1789105063.7817416}
server-1 | {"event": "Finished authentik bootstrap", "level": "info", "logger": "authentik.lib.config", "timestamp": 1789105063.7818353}
```
Contributor guide
Assessment
This issue has not been assessed yet.