Pre-checks
Deployment Method
Docker
Steps to Reproduce
1、切换到v1.8.2分支
2、编译 docker-compose build
3、运行 docker-compose up
Expected vs Actual Behavior
不能正常启动服务
Logs / Screenshots
frontend-1 | 2026/04/16 14:48:39 [notice] 1#1: start worker process 43
frontend-1 | 2026/04/16 14:48:39 [notice] 1#1: start worker process 44
backend-1 | [entrypoint] Tables created/verified
backend-1 | [entrypoint] Column patches applied
backend-1 | [entrypoint] Step 2: Running alembic migrations...
postgres-1 | 2026-04-16 14:48:40.983 UTC [41] ERROR: column "username" does not exist at character 149
postgres-1 | 2026-04-16 14:48:40.983 UTC [41] STATEMENT:
postgres-1 | INSERT INTO participants (id, type, ref_id, display_name, avatar_url)
postgres-1 | SELECT gen_random_uuid(), 'user', id, COALESCE(display_name, username), avatar_url
postgres-1 | FROM users
postgres-1 | ON CONFLICT DO NOTHING
postgres-1 |
backend-1 |
backend-1 | ========================================================================
backend-1 | [entrypoint] WARNING: Alembic migration FAILED (exit code 1)
backend-1 | ========================================================================
backend-1 |
backend-1 | INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
backend-1 | INFO [alembic.runtime.migration] Will assume transactional DDL.
backend-1 | INFO [alembic.runtime.migration] Running upgrade -> add_quota_fields, Add usage quota fields to users, agents, and tenants tables.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_quota_fields -> add_agent_tool_source, Add source and installed_by_agent_id to agent_tools
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_agent_tool_source -> add_chat_sessions, Add chat_sessions table and update existing chat_messages conversation_ids.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_chat_sessions -> add_invitation_codes, Add invitation_codes table.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_invitation_codes -> add_participants, Add participants table, extend chat_sessions and chat_messages, migrate messages data, drop messages table.
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 526, in _prepare_and_execute
backend-1 | prepared_stmt, attributes = await adapt_connection._prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 773, in _prepare
backend-1 | prepared_stmt = await self._connection.prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 638, in prepare
backend-1 | return await self._prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 657, in _prepare
backend-1 | stmt = await self._get_statement(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 443, in _get_statement
backend-1 | statement = await self._protocol.prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "asyncpg/protocol/protocol.pyx", line 165, in prepare
backend-1 | asyncpg.exceptions.UndefinedColumnError: column "username" does not exist
backend-1 |
backend-1 | The above exception was the direct cause of the following exception:
backend-1 |
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
backend-1 | self.dialect.do_execute(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
backend-1 | cursor.execute(statement, parameters)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
backend-1 | self.adapt_connection.await(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
backend-1 | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
backend-1 | value = await result
backend-1 | ^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
backend-1 | self._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
backend-1 | self._adapt_connection._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
backend-1 | raise translated_error from error
backend-1 | sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.ProgrammingError: <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist
backend-1 |
backend-1 | The above exception was the direct cause of the following exception:
backend-1 |
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/bin/alembic", line 8, in
backend-1 | sys.exit(main())
backend-1 | ^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1047, in main
backend-1 | CommandLine(prog=prog).main(argv=argv)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1037, in main
backend-1 | self.run_cmd(cfg, options)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 971, in run_cmd
backend-1 | fn(
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/command.py", line 483, in upgrade
backend-1 | script.run_env()
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/script/base.py", line 545, in run_env
backend-1 | util.load_python_file(self.dir, "env.py")
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
backend-1 | module = load_module_py(module_id, path)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
backend-1 | spec.loader.exec_module(module) # type: ignore
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "", line 999, in exec_module
backend-1 | File "", line 488, in _call_with_frames_removed
backend-1 | File "/app/alembic/env.py", line 85, in
backend-1 | run_migrations_online()
backend-1 | File "/app/alembic/env.py", line 79, in run_migrations_online
backend-1 | asyncio.run(run_async_migrations())
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
backend-1 | return runner.run(main)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
backend-1 | return self._loop.run_until_complete(task)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete
backend-1 | return future.result()
backend-1 | ^^^^^^^^^^^^^^^
backend-1 | File "/app/alembic/env.py", line 73, in run_async_migrations
backend-1 | await connection.run_sync(do_run_migrations)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py", line 888, in run_sync
backend-1 | return await greenlet_spawn(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
backend-1 | result = context.switch(value)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/app/alembic/env.py", line 62, in do_run_migrations
backend-1 | context.run_migrations()
backend-1 | File "", line 8, in run_migrations
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/environment.py", line 969, in run_migrations
backend-1 | self.get_context().run_migrations(**kw)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/migration.py", line 626, in run_migrations
backend-1 | step.migration_fn(**kw)
backend-1 | File "/app/alembic/versions/add_participants.py", line 33, in upgrade
backend-1 | conn.execute(sa.text("""
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
backend-1 | return meth(
backend-1 | ^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
backend-1 | return connection._execute_clauseelement(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
backend-1 | ret = self._execute_context(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
backend-1 | return self._exec_single_context(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
backend-1 | self._handle_dbapi_exception(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
backend-1 | raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
backend-1 | self.dialect.do_execute(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
backend-1 | cursor.execute(statement, parameters)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
backend-1 | self.adapt_connection.await(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
backend-1 | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
backend-1 | value = await result
backend-1 | ^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
backend-1 | self._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
backend-1 | self._adapt_connection._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
backend-1 | raise translated_error from error
backend-1 | sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist
backend-1 | [SQL:
backend-1 | INSERT INTO participants (id, type, ref_id, display_name, avatar_url)
backend-1 | SELECT gen_random_uuid(), 'user', id, COALESCE(display_name, username), avatar_url
backend-1 | FROM users
backend-1 | ON CONFLICT DO NOTHING
backend-1 | ]
backend-1 | (Background on this error at: https://sqlalche.me/e/20/f405)
backend-1 |
backend-1 | ------------------------------------------------------------------------
backend-1 | The database schema may be INCOMPLETE. Some features will NOT work.
backend-1 | Common causes:
backend-1 | - Migration cycle detected (pull latest code to fix)
backend-1 | - Database connection issue
backend-1 | - Incompatible migration state
backend-1 |
backend-1 | To fix: pull the latest code and restart the backend.
backend-1 | Docker: git pull && docker compose restart backend
backend-1 | Source: git pull && alembic upgrade head
backend-1 | ------------------------------------------------------------------------
backend-1 |
backend-1 | [entrypoint] Continuing startup despite migration failure...
backend-1 | [entrypoint] Step 3: Starting uvicorn...
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/bin/uvicorn", line 8, in
backend-1 | sys.exit(main())
backend-1 | ^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1485, in call
backend-1 | return self.main(*args, **kwargs)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1406, in main
backend-1 | rv = self.invoke(ctx)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1269, in invoke
backend-1 | return ctx.invoke(self.callback, **ctx.params)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 824, in invoke
backend-1 | return callback(*args, **kwargs)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/main.py", line 433, in main
backend-1 | run(
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/main.py", line 606, in run
backend-1 | server.run()
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 75, in run
backend-1 | return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
backend-1 | return runner.run(main)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
backend-1 | return self._loop.run_until_complete(task)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 79, in serve
backend-1 | await self._serve(sockets)
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 86, in _serve
backend-1 | config.load()
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/config.py", line 441, in load
backend-1 | self.loaded_app = import_from_string(self.app)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/importer.py", line 19, in import_from_string
backend-1 | module = importlib.import_module(module_str)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/importlib/init.py", line 90, in import_module
backend-1 | return _bootstrap._gcd_import(name[level:], package, level)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "", line 1387, in _gcd_import
backend-1 | File "", line 1360, in _find_and_load
backend-1 | File "", line 1331, in _find_and_load_unlocked
backend-1 | File "", line 935, in _load_unlocked
backend-1 | File "", line 999, in exec_module
backend-1 | File "", line 488, in _call_with_frames_removed
backend-1 | File "/app/app/main.py", line 293, in
backend-1 | from app.api.wecom import router as wecom_router
backend-1 | File "/app/app/api/wecom.py", line 35, in
backend-1 | from app.services.auth_provider import auth_provider_registry
backend-1 | ImportError: cannot import name 'auth_provider_registry' from 'app.services.auth_provider' (/app/app/services/auth_provider.py)
backend-1 exited with code 0
backend-1 | [entrypoint] Tables created/verified
backend-1 | [entrypoint] Column patches applied
backend-1 | [entrypoint] Step 2: Running alembic migrations...
Pre-checks
Deployment Method
Docker
Steps to Reproduce
1、切换到v1.8.2分支
2、编译 docker-compose build
3、运行 docker-compose up
Expected vs Actual Behavior
不能正常启动服务
Logs / Screenshots
frontend-1 | 2026/04/16 14:48:39 [notice] 1#1: start worker process 43
frontend-1 | 2026/04/16 14:48:39 [notice] 1#1: start worker process 44
backend-1 | [entrypoint] Tables created/verified
backend-1 | [entrypoint] Column patches applied
backend-1 | [entrypoint] Step 2: Running alembic migrations...
postgres-1 | 2026-04-16 14:48:40.983 UTC [41] ERROR: column "username" does not exist at character 149
postgres-1 | 2026-04-16 14:48:40.983 UTC [41] STATEMENT:
postgres-1 | INSERT INTO participants (id, type, ref_id, display_name, avatar_url)
postgres-1 | SELECT gen_random_uuid(), 'user', id, COALESCE(display_name, username), avatar_url
postgres-1 | FROM users
postgres-1 | ON CONFLICT DO NOTHING
postgres-1 |
backend-1 |
backend-1 | ========================================================================
backend-1 | [entrypoint] WARNING: Alembic migration FAILED (exit code 1)
backend-1 | ========================================================================
backend-1 |
backend-1 | INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
backend-1 | INFO [alembic.runtime.migration] Will assume transactional DDL.
backend-1 | INFO [alembic.runtime.migration] Running upgrade -> add_quota_fields, Add usage quota fields to users, agents, and tenants tables.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_quota_fields -> add_agent_tool_source, Add source and installed_by_agent_id to agent_tools
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_agent_tool_source -> add_chat_sessions, Add chat_sessions table and update existing chat_messages conversation_ids.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_chat_sessions -> add_invitation_codes, Add invitation_codes table.
backend-1 | INFO [alembic.runtime.migration] Running upgrade add_invitation_codes -> add_participants, Add participants table, extend chat_sessions and chat_messages, migrate messages data, drop messages table.
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 526, in _prepare_and_execute
backend-1 | prepared_stmt, attributes = await adapt_connection._prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 773, in _prepare
backend-1 | prepared_stmt = await self._connection.prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 638, in prepare
backend-1 | return await self._prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 657, in _prepare
backend-1 | stmt = await self._get_statement(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 443, in _get_statement
backend-1 | statement = await self._protocol.prepare(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "asyncpg/protocol/protocol.pyx", line 165, in prepare
backend-1 | asyncpg.exceptions.UndefinedColumnError: column "username" does not exist
backend-1 |
backend-1 | The above exception was the direct cause of the following exception:
backend-1 |
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
backend-1 | self.dialect.do_execute(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
backend-1 | cursor.execute(statement, parameters)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
backend-1 | self.adapt_connection.await(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
backend-1 | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
backend-1 | value = await result
backend-1 | ^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
backend-1 | self._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
backend-1 | self._adapt_connection._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
backend-1 | raise translated_error from error
backend-1 | sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.ProgrammingError: <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist
backend-1 |
backend-1 | The above exception was the direct cause of the following exception:
backend-1 |
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/bin/alembic", line 8, in
backend-1 | sys.exit(main())
backend-1 | ^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1047, in main
backend-1 | CommandLine(prog=prog).main(argv=argv)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1037, in main
backend-1 | self.run_cmd(cfg, options)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 971, in run_cmd
backend-1 | fn(
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/command.py", line 483, in upgrade
backend-1 | script.run_env()
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/script/base.py", line 545, in run_env
backend-1 | util.load_python_file(self.dir, "env.py")
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
backend-1 | module = load_module_py(module_id, path)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
backend-1 | spec.loader.exec_module(module) # type: ignore
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "", line 999, in exec_module
backend-1 | File "", line 488, in _call_with_frames_removed
backend-1 | File "/app/alembic/env.py", line 85, in
backend-1 | run_migrations_online()
backend-1 | File "/app/alembic/env.py", line 79, in run_migrations_online
backend-1 | asyncio.run(run_async_migrations())
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
backend-1 | return runner.run(main)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
backend-1 | return self._loop.run_until_complete(task)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete
backend-1 | return future.result()
backend-1 | ^^^^^^^^^^^^^^^
backend-1 | File "/app/alembic/env.py", line 73, in run_async_migrations
backend-1 | await connection.run_sync(do_run_migrations)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py", line 888, in run_sync
backend-1 | return await greenlet_spawn(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
backend-1 | result = context.switch(value)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/app/alembic/env.py", line 62, in do_run_migrations
backend-1 | context.run_migrations()
backend-1 | File "", line 8, in run_migrations
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/environment.py", line 969, in run_migrations
backend-1 | self.get_context().run_migrations(**kw)
backend-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/migration.py", line 626, in run_migrations
backend-1 | step.migration_fn(**kw)
backend-1 | File "/app/alembic/versions/add_participants.py", line 33, in upgrade
backend-1 | conn.execute(sa.text("""
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
backend-1 | return meth(
backend-1 | ^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
backend-1 | return connection._execute_clauseelement(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
backend-1 | ret = self._execute_context(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
backend-1 | return self._exec_single_context(
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
backend-1 | self._handle_dbapi_exception(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
backend-1 | raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
backend-1 | self.dialect.do_execute(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
backend-1 | cursor.execute(statement, parameters)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
backend-1 | self.adapt_connection.await(
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
backend-1 | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
backend-1 | value = await result
backend-1 | ^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
backend-1 | self._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
backend-1 | self._adapt_connection._handle_exception(error)
backend-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
backend-1 | raise translated_error from error
backend-1 | sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist
backend-1 | [SQL:
backend-1 | INSERT INTO participants (id, type, ref_id, display_name, avatar_url)
backend-1 | SELECT gen_random_uuid(), 'user', id, COALESCE(display_name, username), avatar_url
backend-1 | FROM users
backend-1 | ON CONFLICT DO NOTHING
backend-1 | ]
backend-1 | (Background on this error at: https://sqlalche.me/e/20/f405)
backend-1 |
backend-1 | ------------------------------------------------------------------------
backend-1 | The database schema may be INCOMPLETE. Some features will NOT work.
backend-1 | Common causes:
backend-1 | - Migration cycle detected (pull latest code to fix)
backend-1 | - Database connection issue
backend-1 | - Incompatible migration state
backend-1 |
backend-1 | To fix: pull the latest code and restart the backend.
backend-1 | Docker: git pull && docker compose restart backend
backend-1 | Source: git pull && alembic upgrade head
backend-1 | ------------------------------------------------------------------------
backend-1 |
backend-1 | [entrypoint] Continuing startup despite migration failure...
backend-1 | [entrypoint] Step 3: Starting uvicorn...
backend-1 | Traceback (most recent call last):
backend-1 | File "/usr/local/bin/uvicorn", line 8, in
backend-1 | sys.exit(main())
backend-1 | ^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1485, in call
backend-1 | return self.main(*args, **kwargs)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1406, in main
backend-1 | rv = self.invoke(ctx)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1269, in invoke
backend-1 | return ctx.invoke(self.callback, **ctx.params)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 824, in invoke
backend-1 | return callback(*args, **kwargs)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/main.py", line 433, in main
backend-1 | run(
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/main.py", line 606, in run
backend-1 | server.run()
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 75, in run
backend-1 | return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
backend-1 | return runner.run(main)
backend-1 | ^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
backend-1 | return self._loop.run_until_complete(task)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 79, in serve
backend-1 | await self._serve(sockets)
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/server.py", line 86, in _serve
backend-1 | config.load()
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/config.py", line 441, in load
backend-1 | self.loaded_app = import_from_string(self.app)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/site-packages/uvicorn/importer.py", line 19, in import_from_string
backend-1 | module = importlib.import_module(module_str)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "/usr/local/lib/python3.12/importlib/init.py", line 90, in import_module
backend-1 | return _bootstrap._gcd_import(name[level:], package, level)
backend-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1 | File "", line 1387, in _gcd_import
backend-1 | File "", line 1360, in _find_and_load
backend-1 | File "", line 1331, in _find_and_load_unlocked
backend-1 | File "", line 935, in _load_unlocked
backend-1 | File "", line 999, in exec_module
backend-1 | File "", line 488, in _call_with_frames_removed
backend-1 | File "/app/app/main.py", line 293, in
backend-1 | from app.api.wecom import router as wecom_router
backend-1 | File "/app/app/api/wecom.py", line 35, in
backend-1 | from app.services.auth_provider import auth_provider_registry
backend-1 | ImportError: cannot import name 'auth_provider_registry' from 'app.services.auth_provider' (/app/app/services/auth_provider.py)
backend-1 exited with code 0
backend-1 | [entrypoint] Tables created/verified
backend-1 | [entrypoint] Column patches applied
backend-1 | [entrypoint] Step 2: Running alembic migrations...