eduMFA
eduMFA copied to clipboard
docker compose fails with database errors: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) index ix_token_serial already exists
Top-level intent
Running eduMFA via docker compose, as stated in the docs, fails.
Steps to reproduce
- Create a new directory and change to it
- Create a
config.cfg
file according to this documentation - Create a docker-compose.yml fle following the documentation.
- Run
docker compose up
Expected outcome
I would have expected the documentation example to just work.
Actual outcome
This is the full log. The errors regarding EDUMFA_LOGCONFIG
can be solved by setting it properly in the configuration file (see #359).
docker compose up
[+] Running 3/3
✔ Network docker-compose_default Created 0.0s
✔ Volume "docker-compose_edumfa_data" Created 0.0s
✔ Container docker-compose-edumfa-1 Created 0.1s
Attaching to edumfa-1
edumfa-1 | Can not import grpc modules.
edumfa-1 |
edumfa-1 | _ __ __ ______
edumfa-1 | | | | \/ | ____/\
edumfa-1 | ___ __| |_ _| \ / | |__ / \
edumfa-1 | / _ \/ _` | | | | |\/| | __/ /\ \
edumfa-1 | | __/ (_| | |_| | | | | | / ____ \
edumfa-1 | \___|\__,_|\__,_|_| |_|_|/_/ \_\ v2.3.0
edumfa-1 |
edumfa-1 | Could not use EDUMFA_LOGCONFIG: expected '<document start>', but found '<scalar>'
edumfa-1 | in "<unicode string>", line 4, column 1:
edumfa-1 | keys=detail
edumfa-1 | ^
edumfa-1 | Encryption key written to /etc/edumfa/enckey
edumfa-1 | The file permission of /etc/edumfa/enckey was set to 400!
edumfa-1 | Please ensure, that it is owned by the right user.
edumfa-1 | Can not import grpc modules.
edumfa-1 |
edumfa-1 | _ __ __ ______
edumfa-1 | | | | \/ | ____/\
edumfa-1 | ___ __| |_ _| \ / | |__ / \
edumfa-1 | / _ \/ _` | | | | |\/| | __/ /\ \
edumfa-1 | | __/ (_| | |_| | | | | | / ____ \
edumfa-1 | \___|\__,_|\__,_|_| |_|_|/_/ \_\ v2.3.0
edumfa-1 |
edumfa-1 | Could not use EDUMFA_LOGCONFIG: expected '<document start>', but found '<scalar>'
edumfa-1 | in "<unicode string>", line 4, column 1:
edumfa-1 | keys=detail
edumfa-1 | ^
edumfa-1 | Signing keys written to /etc/edumfa/private.pem and /etc/edumfa/public.pem
edumfa-1 | The file permission of /etc/edumfa/private.pem was set to 400!
edumfa-1 | Please ensure, that it is owned by the right user.
edumfa-1 | Creating DB
edumfa-1 | Can not import grpc modules.
edumfa-1 |
edumfa-1 | _ __ __ ______
edumfa-1 | | | | \/ | ____/\
edumfa-1 | ___ __| |_ _| \ / | |__ / \
edumfa-1 | / _ \/ _` | | | | |\/| | __/ /\ \
edumfa-1 | | __/ (_| | |_| | | | | | / ____ \
edumfa-1 | \___|\__,_|\__,_|_| |_|_|/_/ \_\ v2.3.0
edumfa-1 |
edumfa-1 | Could not use EDUMFA_LOGCONFIG: expected '<document start>', but found '<scalar>'
edumfa-1 | in "<unicode string>", line 4, column 1:
edumfa-1 | keys=detail
edumfa-1 | ^
edumfa-1 | <SQLAlchemy sqlite:////etc/edumfa/data.sqlite>
edumfa-1 | Upgrading Database
edumfa-1 | Can not import grpc modules.
edumfa-1 | Could not use EDUMFA_LOGCONFIG: expected '<document start>', but found '<scalar>'
edumfa-1 | in "<unicode string>", line 4, column 1:
edumfa-1 | keys=detail
edumfa-1 | ^
edumfa-1 |
edumfa-1 | _ __ __ ______
edumfa-1 | | | | \/ | ____/\
edumfa-1 | ___ __| |_ _| \ / | |__ / \
edumfa-1 | / _ \/ _` | | | | |\/| | __/ /\ \
edumfa-1 | | __/ (_| | |_| | | | | | / ____ \
edumfa-1 | \___|\__,_|\__,_|_| |_|_|/_/ \_\ v2.3.0
edumfa-1 |
edumfa-1 | Running online
edumfa-1 | ----------------------------------
edumfa-1 | Migrating the Token information...
edumfa-1 | ----------------------------------
edumfa-1 | Traceback (most recent call last):
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
edumfa-1 | self.dialect.do_execute(
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
edumfa-1 | cursor.execute(statement, parameters)
edumfa-1 | sqlite3.OperationalError: index ix_token_serial already exists
edumfa-1 |
edumfa-1 | The above exception was the direct cause of the following exception:
edumfa-1 |
edumfa-1 | Traceback (most recent call last):
edumfa-1 | File "/usr/local/bin/edumfa-manage", line 8, in <module>
edumfa-1 | sys.exit(cli())
edumfa-1 | ^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
edumfa-1 | return self.main(*args, **kwargs)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1078, in main
edumfa-1 | rv = self.invoke(ctx)
edumfa-1 | ^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
edumfa-1 | return _process_result(sub_ctx.command.invoke(sub_ctx))
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
edumfa-1 | return _process_result(sub_ctx.command.invoke(sub_ctx))
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
edumfa-1 | return ctx.invoke(self.callback, **ctx.params)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
edumfa-1 | return __callback(*args, **kwargs)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/decorators.py", line 33, in new_func
edumfa-1 | return f(get_current_context(), *args, **kwargs)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 386, in decorator
edumfa-1 | return ctx.invoke(f, *args, **kwargs)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
edumfa-1 | return __callback(*args, **kwargs)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/flask_migrate/cli.py", line 154, in upgrade
edumfa-1 | _upgrade(directory, revision, sql, tag, x_arg)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/flask_migrate/__init__.py", line 111, in wrapped
edumfa-1 | f(*args, **kwargs)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/flask_migrate/__init__.py", line 200, in upgrade
edumfa-1 | command.upgrade(config, revision, sql=sql, tag=tag)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/command.py", line 406, in upgrade
edumfa-1 | script.run_env()
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/script/base.py", line 586, in run_env
edumfa-1 | util.load_python_file(self.dir, "env.py")
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
edumfa-1 | module = load_module_py(module_id, path)
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
edumfa-1 | spec.loader.exec_module(module) # type: ignore
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "<frozen importlib._bootstrap_external>", line 995, in exec_module
edumfa-1 | File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
edumfa-1 | File "/usr/local/lib/edumfa/migrations/env.py", line 110, in <module>
edumfa-1 | run_migrations_online()
edumfa-1 | File "/usr/local/lib/edumfa/migrations/env.py", line 100, in run_migrations_online
edumfa-1 | context.run_migrations()
edumfa-1 | File "<string>", line 8, in run_migrations
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/environment.py", line 946, in run_migrations
edumfa-1 | self.get_context().run_migrations(**kw)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/alembic/runtime/migration.py", line 628, in run_migrations
edumfa-1 | step.migration_fn(**kw)
edumfa-1 | File "/usr/local/lib/edumfa/migrations/versions/4f32a4e1bf33_.py", line 503, in upgrade
edumfa-1 | create_update_token_table()
edumfa-1 | File "/usr/local/lib/edumfa/migrations/versions/4f32a4e1bf33_.py", line 253, in create_update_token_table
edumfa-1 | Token.__table__.create(bind)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/schema.py", line 1284, in create
edumfa-1 | bind._run_ddl_visitor(ddl.SchemaGenerator, self, checkfirst=checkfirst)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2459, in _run_ddl_visitor
edumfa-1 | visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py", line 664, in traverse_single
edumfa-1 | return meth(obj, **kw)
edumfa-1 | ^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py", line 960, in visit_table
edumfa-1 | self.traverse_single(index, create_ok=True)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py", line 664, in traverse_single
edumfa-1 | return meth(obj, **kw)
edumfa-1 | ^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py", line 997, in visit_index
edumfa-1 | CreateIndex(index)._invoke_with(self.connection)
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py", line 314, in _invoke_with
edumfa-1 | return bind.execute(self)
edumfa-1 | ^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1418, in execute
edumfa-1 | return meth(
edumfa-1 | ^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py", line 180, in _execute_on_connection
edumfa-1 | return connection._execute_ddl(
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1529, in _execute_ddl
edumfa-1 | ret = self._execute_context(
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
edumfa-1 | return self._exec_single_context(
edumfa-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
edumfa-1 | self._handle_dbapi_exception(
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2355, in _handle_dbapi_exception
edumfa-1 | raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
edumfa-1 | self.dialect.do_execute(
edumfa-1 | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
edumfa-1 | cursor.execute(statement, parameters)
edumfa-1 | sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) index ix_token_serial already exists
edumfa-1 | [SQL: CREATE UNIQUE INDEX ix_token_serial ON token (serial)]
edumfa-1 | (Background on this error at: https://sqlalche.me/e/20/e3q8)
edumfa-1 exited with code 1
Configuration
-
eduMFA version: tested with
latest
and some other tags from https://github.com/eduMFA/eduMFA/pkgs/container/edumfa - Installation method: docker compose
- Operating system: openSUSE Tumbleweed using Podman 5.2