Skip to content

[Bug] Application crash: (Restore from backup is broken) InvalidSchemaNameError: schema "_timescaledb_functions" does not exist #229

@fa1rid

Description

@fa1rid

Describe the bug
I did clean installation and then restored from backup using the cli command pasarguard restore.

To Reproduce
Steps to reproduce the behavior:

  1. Install on server 1, and take backup
  2. Install on server 2
  3. Copy backup to server 2
  4. Restore backup
  5. App crash

Expected behavior
To restore backup and app works, but something wrong in the restore process.

Machine details:

  • OS: Debian 13

Additional context

pasarguard restore
Starting restore process...
Available backup files:
1. backup_20260130040620.zip (Size: 16K, Date: 2026-01-30 04:06:21)
Select backup file to restore from (1-1): 1
Selected backup: backup_20260130040620.zip
Preparing archive for extraction...
Extracting backup...
✓ Archive extracted successfully
Loading configuration from backup...
WARNING: .env file contains null bytes, cleaning...
Loading environment variables...
✓ Loaded 10 environment variables
✓ Found SQLALCHEMY_DATABASE_URL: postgresql+asyncpg://pasarguard:Wvk5vQh1Jh9r3Y4drs...
Detecting database type...
✓ Detected TimescaleDB database
✓ Database configuration detected: timescaledb
⚠️  DANGER: This will PERMANENTLY overwrite your current timescaledb database!
WARNING: This will overwrite your current timescaledb database!
Database type: timescaledb
Database name: pasarguard
Container: 2477f0b036b8a2d5c879fe238e72a498ae49976f95a623996c6dec569158fe34
Do you want to proceed with the restore? (yes/no): yes
Stopping pasarguard services for clean restore...
⚠️  DANGER: Starting database restore - this will overwrite existing data!
Starting database restore...
Backup file size: 72K
Restoring timescaledb database from container: 2477f0b036b8a2d5c879fe238e72a498ae49976f95a623996c6dec569158fe34
Attempting restore using app user 'pasarguard' to database 'pasarguard'...
SET
SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
DROP INDEX
DROP INDEX
DROP INDEX
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
DROP SEQUENCE
DROP TABLE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP SEQUENCE
DROP TABLE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP TYPE
DROP EXTENSION
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
CREATE TYPE
ALTER TYPE
SET
SET
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
COPY 0
COPY 1
COPY 1
COPY 2
COPY 1
COPY 1
COPY 2
COPY 1
COPY 1
COPY 0
COPY 0
COPY 0
COPY 35
COPY 35
COPY 1
COPY 0
COPY 1
COPY 1
COPY 0
COPY 0
COPY 0
COPY 0
COPY 1
COPY 1
 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      2
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
     52
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
    434
(1 row)

 setval
--------
    918
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

 setval
--------
      1
(1 row)

ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
timescaledb database restored successfully.
Restoring data directory...
Data directory restored to /var/lib/pasarguard.
Restoring configuration files...
Environment file restored.
Database credentials in backup differ from current installation; preserving current database credentials.
Docker Compose file restored.
Restarting pasarguard services...
Restore completed successfully!
PasarGuard services have been restarted.

Container log:

timescaledb-1  | 2026-01-30 00:39:33.354 UTC [114] ERROR:  schema "_timescaledb_functions" does not exist
timescaledb-1  | 2026-01-30 00:39:33.354 UTC [114] STATEMENT:  select pg_catalog.version()
pasarguard-1   | Traceback (most recent call last):
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 550, in _prepare_and_execute
pasarguard-1   |     self._rows = deque(await prepared_stmt.fetch(*parameters))
pasarguard-1   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 177, in fetch
pasarguard-1   |     data = await self.__bind_execute(args, 0, timeout)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 268, in __bind_execute
pasarguard-1   |     data, status, _ = await self.__do_execute(
pasarguard-1   |                       ^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 257, in __do_execute
pasarguard-1   |     return await executor(protocol)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "asyncpg/protocol/protocol.pyx", line 205, in bind_execute
pasarguard-1   | asyncpg.exceptions.InvalidSchemaNameError: schema "_timescaledb_functions" does not exist
pasarguard-1   |
pasarguard-1   | The above exception was the direct cause of the following exception:
pasarguard-1   |
pasarguard-1   | Traceback (most recent call last):
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
pasarguard-1   |     self.dialect.do_execute(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
pasarguard-1   |     cursor.execute(statement, parameters)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
pasarguard-1   |     self._adapt_connection.await_(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
pasarguard-1   |     return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
pasarguard-1   |     value = await result
pasarguard-1   |             ^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
pasarguard-1   |     self._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
pasarguard-1   |     self._adapt_connection._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
pasarguard-1   |     raise translated_error from error
pasarguard-1   | sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.Error: <class 'asyncpg.exceptions.InvalidSchemaNameError'>: schema "_timescaledb_functions" does not exist
pasarguard-1   |
pasarguard-1   | The above exception was the direct cause of the following exception:
pasarguard-1   |
pasarguard-1   | Traceback (most recent call last):
pasarguard-1   |   File "<frozen runpy>", line 198, in _run_module_as_main
pasarguard-1   |   File "<frozen runpy>", line 88, in _run_code
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/__main__.py", line 4, in <module>
pasarguard-1   |     main(prog="alembic")
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/config.py", line 1033, in main
pasarguard-1   |     CommandLine(prog=prog).main(argv=argv)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/config.py", line 1023, in main
pasarguard-1   |     self.run_cmd(cfg, options)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/config.py", line 957, in run_cmd
pasarguard-1   |     fn(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/command.py", line 483, in upgrade
pasarguard-1   |     script.run_env()
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/script/base.py", line 545, in run_env
pasarguard-1   |     util.load_python_file(self.dir, "env.py")
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
pasarguard-1   |     module = load_module_py(module_id, path)
pasarguard-1   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
pasarguard-1   |     spec.loader.exec_module(module)  # type: ignore
pasarguard-1   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "<frozen importlib._bootstrap_external>", line 999, in exec_module
pasarguard-1   |   File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
pasarguard-1   |   File "/code/app/db/migrations/env.py", line 89, in <module>
pasarguard-1   |     run_migrations_online()
pasarguard-1   |   File "/code/app/db/migrations/env.py", line 83, in run_migrations_online
pasarguard-1   |     asyncio.run(run_async_migrations())
pasarguard-1   |   File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
pasarguard-1   |     return runner.run(main)
pasarguard-1   |            ^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
pasarguard-1   |     return self._loop.run_until_complete(task)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete
pasarguard-1   |     return future.result()
pasarguard-1   |            ^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/app/db/migrations/env.py", line 74, in run_async_migrations
pasarguard-1   |     async with connectable.connect() as connection:
pasarguard-1   |                ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/base.py", line 121, in __aenter__
pasarguard-1   |     return await self.start(is_ctxmanager=True)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py", line 275, in start
pasarguard-1   |     await greenlet_spawn(self.sync_engine.connect)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
pasarguard-1   |     result = context.switch(value)
pasarguard-1   |              ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3285, in connect
pasarguard-1   |     return self._connection_cls(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 143, in __init__
pasarguard-1   |     self._dbapi_connection = engine.raw_connection()
pasarguard-1   |                              ^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3309, in raw_connection
pasarguard-1   |     return self.pool.connect()
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 447, in connect
pasarguard-1   |     return _ConnectionFairy._checkout(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1264, in _checkout
pasarguard-1   |     fairy = _ConnectionRecord.checkout(pool)
pasarguard-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 711, in checkout
pasarguard-1   |     rec = pool._do_get()
pasarguard-1   |           ^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 306, in _do_get
pasarguard-1   |     return self._create_connection()
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 388, in _create_connection
pasarguard-1   |     return _ConnectionRecord(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 673, in __init__
pasarguard-1   |     self.__connect()
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 913, in __connect
pasarguard-1   |     )._exec_w_sync_on_first_run(self.dbapi_connection, self)
pasarguard-1   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py", line 501, in _exec_w_sync_on_first_run
pasarguard-1   |     self(*args, **kw)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py", line 515, in __call__
pasarguard-1   |     fn(*args, **kw)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 2000, in go
pasarguard-1   |     return once_fn(*arg, **kw)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py", line 767, in first_connect
pasarguard-1   |     dialect.initialize(c)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py", line 3327, in initialize
pasarguard-1   |     super().initialize(connection)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 528, in initialize
pasarguard-1   |     self.server_version_info = self._get_server_version_info(
pasarguard-1   |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py", line 3597, in _get_server_version_info
pasarguard-1   |     v = connection.exec_driver_sql("select pg_catalog.version()").scalar()
pasarguard-1   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1779, in exec_driver_sql
pasarguard-1   |     ret = self._execute_context(
pasarguard-1   |           ^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
pasarguard-1   |     return self._exec_single_context(
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
pasarguard-1   |     self._handle_dbapi_exception(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
pasarguard-1   |     raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
pasarguard-1   |     self.dialect.do_execute(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
pasarguard-1   |     cursor.execute(statement, parameters)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
pasarguard-1   |     self._adapt_connection.await_(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
pasarguard-1   |     return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
pasarguard-1   |     value = await result
pasarguard-1   |             ^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
pasarguard-1   |     self._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
pasarguard-1   |     self._adapt_connection._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
pasarguard-1   |     raise translated_error from error
pasarguard-1   | sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) <class 'asyncpg.exceptions.InvalidSchemaNameError'>: schema "_timescaledb_functions" does not exist
pasarguard-1   | [SQL: select pg_catalog.version()]
pasarguard-1   | (Background on this error at: https://sqlalche.me/e/20/dbapi)
pasarguard-1   | WARNING:  2026-01-30 00:39:38,746 -
pasarguard-1   | IMPORTANT!
pasarguard-1   | You're running PasarGuard without specifying UVICORN_SSL_CERTFILE and UVICORN_SSL_KEYFILE.
pasarguard-1   | The application will only be accessible through localhost. This means that PasarGuard and subscription URLs will not be accessible externally.
pasarguard-1   |
pasarguard-1   | If you need external access, please provide the SSL files to allow the server to bind to 0.0.0.0. Alternatively, you can run the server on localhost or a Unix socket and use a reverse proxy, such as Nginx or Caddy, to handle SSL termination and provide external access.
pasarguard-1   |
pasarguard-1   | If you wish to continue without SSL, you can use SSH port forwarding to access the application from your machine. note that in this case, subscription functionality will not work.
pasarguard-1   |
pasarguard-1   | Use the following command:
pasarguard-1   |
pasarguard-1   | ssh -L 8000:localhost:8000 user@server
pasarguard-1   |
pasarguard-1   | Then, navigate to http://localhost:8000 on your computer.
pasarguard-1   |
pasarguard-1   | INFO:     2026-01-30 00:39:38,755 - Started server process [8]
pasarguard-1   | INFO:     2026-01-30 00:39:38,756 - Waiting for application startup.
timescaledb-1  | 2026-01-30 00:39:38.790 UTC [114] ERROR:  schema "_timescaledb_functions" does not exist
timescaledb-1  | 2026-01-30 00:39:38.790 UTC [114] STATEMENT:  select pg_catalog.version()
pasarguard-1   | ERROR:    2026-01-30 00:39:38,799 - Traceback (most recent call last):
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 550, in _prepare_and_execute
pasarguard-1   |     self._rows = deque(await prepared_stmt.fetch(*parameters))
pasarguard-1   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 177, in fetch
pasarguard-1   |     data = await self.__bind_execute(args, 0, timeout)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 268, in __bind_execute
pasarguard-1   |     data, status, _ = await self.__do_execute(
pasarguard-1   |                       ^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/asyncpg/prepared_stmt.py", line 257, in __do_execute
pasarguard-1   |     return await executor(protocol)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "asyncpg/protocol/protocol.pyx", line 205, in bind_execute
pasarguard-1   | asyncpg.exceptions.InvalidSchemaNameError: schema "_timescaledb_functions" does not exist
pasarguard-1   |
pasarguard-1   | The above exception was the direct cause of the following exception:
pasarguard-1   |
pasarguard-1   | Traceback (most recent call last):
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
pasarguard-1   |     self.dialect.do_execute(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
pasarguard-1   |     cursor.execute(statement, parameters)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
pasarguard-1   |     self._adapt_connection.await_(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
pasarguard-1   |     return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
pasarguard-1   |     value = await result
pasarguard-1   |             ^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
pasarguard-1   |     self._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
pasarguard-1   |     self._adapt_connection._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
pasarguard-1   |     raise translated_error from error
pasarguard-1   | sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.Error: <class 'asyncpg.exceptions.InvalidSchemaNameError'>: schema "_timescaledb_functions" does not exist
pasarguard-1   |
pasarguard-1   | The above exception was the direct cause of the following exception:
pasarguard-1   |
pasarguard-1   | Traceback (most recent call last):
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/starlette/routing.py", line 694, in lifespan
pasarguard-1   |     async with self.lifespan_context(app) as maybe_state:
pasarguard-1   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/usr/local/lib/python3.12/contextlib.py", line 210, in __aenter__
pasarguard-1   |     return await anext(self.gen)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 153, in merged_lifespan
pasarguard-1   |     async with original_context(app) as maybe_original_state:
pasarguard-1   |                ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/usr/local/lib/python3.12/contextlib.py", line 210, in __aenter__
pasarguard-1   |     return await anext(self.gen)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/app/__init__.py", line 39, in lifespan
pasarguard-1   |     await func()
pasarguard-1   |   File "/code/app/notification/client.py", line 32, in define_client
pasarguard-1   |     proxy=(await notification_settings()).proxy_url,
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/aiocache/decorators.py", line 109, in wrapper
pasarguard-1   |     return await self.decorator(f, *args, **kwargs)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/aiocache/decorators.py", line 124, in decorator
pasarguard-1   |     result = await f(*args, **kwargs)
pasarguard-1   |              ^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/app/settings/__init__.py", line 38, in notification_settings
pasarguard-1   |     db_settings = await get_settings(db)
pasarguard-1   |                   ^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/app/db/crud/settings.py", line 18, in get_settings
pasarguard-1   |     return (await db.execute(select(Settings))).scalar_one_or_none()
pasarguard-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 449, in execute
pasarguard-1   |     result = await greenlet_spawn(
pasarguard-1   |              ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
pasarguard-1   |     result = context.switch(value)
pasarguard-1   |              ^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2351, in execute
pasarguard-1   |     return self._execute_internal(
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2239, in _execute_internal
pasarguard-1   |     conn = self._connection_for_bind(bind)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2108, in _connection_for_bind
pasarguard-1   |     return trans._connection_for_bind(engine, execution_options)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "<string>", line 2, in _connection_for_bind
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
pasarguard-1   |     ret_value = fn(self, *arg, **kw)
pasarguard-1   |                 ^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1187, in _connection_for_bind
pasarguard-1   |     conn = bind.connect()
pasarguard-1   |            ^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3285, in connect
pasarguard-1   |     return self._connection_cls(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 143, in __init__
pasarguard-1   |     self._dbapi_connection = engine.raw_connection()
pasarguard-1   |                              ^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3309, in raw_connection
pasarguard-1   |     return self.pool.connect()
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 447, in connect
pasarguard-1   |     return _ConnectionFairy._checkout(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1264, in _checkout
pasarguard-1   |     fairy = _ConnectionRecord.checkout(pool)
pasarguard-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 711, in checkout
pasarguard-1   |     rec = pool._do_get()
pasarguard-1   |           ^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 177, in _do_get
pasarguard-1   |     with util.safe_reraise():
pasarguard-1   |          ^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 224, in __exit__
pasarguard-1   |     raise exc_value.with_traceback(exc_tb)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 175, in _do_get
pasarguard-1   |     return self._create_connection()
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 388, in _create_connection
pasarguard-1   |     return _ConnectionRecord(self)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 673, in __init__
pasarguard-1   |     self.__connect()
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 913, in __connect
pasarguard-1   |     )._exec_w_sync_on_first_run(self.dbapi_connection, self)
pasarguard-1   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py", line 501, in _exec_w_sync_on_first_run
pasarguard-1   |     self(*args, **kw)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py", line 515, in __call__
pasarguard-1   |     fn(*args, **kw)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 2000, in go
pasarguard-1   |     return once_fn(*arg, **kw)
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py", line 767, in first_connect
pasarguard-1   |     dialect.initialize(c)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py", line 3327, in initialize
pasarguard-1   |     super().initialize(connection)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 528, in initialize
pasarguard-1   |     self.server_version_info = self._get_server_version_info(
pasarguard-1   |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py", line 3597, in _get_server_version_info
pasarguard-1   |     v = connection.exec_driver_sql("select pg_catalog.version()").scalar()
pasarguard-1   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1779, in exec_driver_sql
pasarguard-1   |     ret = self._execute_context(
pasarguard-1   |           ^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
pasarguard-1   |     return self._exec_single_context(
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
pasarguard-1   |     self._handle_dbapi_exception(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
pasarguard-1   |     raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
pasarguard-1   |     self.dialect.do_execute(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
pasarguard-1   |     cursor.execute(statement, parameters)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
pasarguard-1   |     self._adapt_connection.await_(
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
pasarguard-1   |     return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
pasarguard-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
pasarguard-1   |     value = await result
pasarguard-1   |             ^^^^^^^^^^^^
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
pasarguard-1   |     self._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
pasarguard-1   |     self._adapt_connection._handle_exception(error)
pasarguard-1   |   File "/code/.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
pasarguard-1   |     raise translated_error from error
pasarguard-1   | sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) <class 'asyncpg.exceptions.InvalidSchemaNameError'>: schema "_timescaledb_functions" does not exist
pasarguard-1   | [SQL: select pg_catalog.version()]
pasarguard-1   | (Background on this error at: https://sqlalche.me/e/20/dbapi)
pasarguard-1   |
pasarguard-1   | ERROR:    2026-01-30 00:39:38,799 - Application startup failed. Exiting.
pasarguard-1 exited with code 3 (restarting)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions