Skip to content

Add Docker build and installation support#414

Open
echuraev wants to merge 1 commit intoReturnFI:mainfrom
echuraev:echuraev/add_docker_support
Open

Add Docker build and installation support#414
echuraev wants to merge 1 commit intoReturnFI:mainfrom
echuraev:echuraev/add_docker_support

Conversation

@echuraev
Copy link
Copy Markdown

Introduced docker configuration to build official docker image and then use it to installation on user servers.

@echuraev echuraev requested a review from ReturnFI as a code owner March 12, 2026 20:02
@echuraev
Copy link
Copy Markdown
Author

@ReturnFI Thank you for the awesome repo.

I wanted to use Blitz from docker container to have opportunity to easily install and remove it on my server. But I didn't find a way how to do that. So, I decided to try to do such configuration.

This is an initial setup. I suppose that the image should be built by the owners of the Blitz and uploaded to the DockerHub. After that users will be able to install it with the similar docker file:

services:
  mongodb:
    image: mongo:8.0
    container_name: mongodb
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - mongodb_data:/data/db

  blitz:
    image: blitz:latest
    container_name: blitz
    restart: unless-stopped
    network_mode: "host"
    cap_add:
      - NET_ADMIN   # required for WARP (wireguard) and IP limiting (iptables)
    env_file: docker/.env
    volumes:
      - blitz_data:/blitz-data
    depends_on:
      - mongodb

volumes:
  blitz_data:
  mongodb_data:

Please take a look. I'll appreciate for any feedback and help with adding docker support.

@echuraev
Copy link
Copy Markdown
Author

Also see that the same request was in issue #246.

@ReturnFI
Copy link
Copy Markdown
Owner

Thank you for your contribution.❤️

Currently, internet access in Iran is difficult, and I am unable to review your PR.
I will definitely review it after this war ends and Iran is free🕊🕊.
Thank you.❤️

@echuraev
Copy link
Copy Markdown
Author

Thank you for your answer. I completely understand the situation. Please take care of yourself and stay safe. I truly wish you and everyone around you good health, safety, and strength during this difficult time. I hope the war ends soon and that peace comes as quickly as possible.🕊️

@Xendox
Copy link
Copy Markdown

Xendox commented Mar 27, 2026

@echuraev mongodb doesn't start on CPU with no AVX support

WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!

Original Blitz panel has check function -

check_avx_support() {

Introduced docker configuration to build official docker image and then
use it to installation on user servers.
@echuraev echuraev force-pushed the echuraev/add_docker_support branch from c690508 to 1390e04 Compare April 1, 2026 06:15
@echuraev
Copy link
Copy Markdown
Author

echuraev commented Apr 1, 2026

@Xendox Thank you for your comment. Updated the PR and added check to entrypoint.sh.

@reysonk
Copy link
Copy Markdown

reysonk commented Apr 3, 2026

when trying to access the logs, such an error on the web writes "Internal Server Error"
blank "ADMIN_PASSWORD="
How can I fix this?

2026-04-03 07:47:07 +0000] [128] [INFO] 212.164.246.246:60691 - - [03/Apr/2026:07:47:07 +0000] "GET /57549926c5b464060d4740a0995f1499/login 1.1" 500 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0"
[2026-04-03 07:47:07 +0000] [128] [ERROR] Error in ASGI Framework
  + Exception Group Traceback (most recent call last):
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 81, in collapse_excgroups
  |     yield
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 192, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 799, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    |     await app(scope, receive, send, sync_spawn, call_soon)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    |     response = await call_next(request)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    |     return await call_next(request)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    |     await route.handle(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    |     response = await f(request)
    |                ^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    |     raw_response = await run_endpoint_function(
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    |     return await dependant.call(**values)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    |     return templates.TemplateResponse('login.html', {'request': request})
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    |     template = self.get_template(name)
    |                ^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    |     return self.env.get_template(name)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    |     return self._load_template(name, globals)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    |     template = self.cache.get(cache_key)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    |     return self[key]
    |            ~~~~^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    |     rv = self._mapping[key]
    |          ~~~~~~~~~~~~~^^^^^
    | TypeError: unhashable type: 'dict'
    +------------------------------------

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    await app(scope, receive, send, sync_spawn, call_soon)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    await super().__call__(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    response = await call_next(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    return await call_next(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    await route.handle(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    response = await f(request)
               ^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    return await dependant.call(**values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    return templates.TemplateResponse('login.html', {'request': request})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    template = self.get_template(name)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    return self.env.get_template(name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    return self._load_template(name, globals)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    template = self.cache.get(cache_key)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    return self[key]
           ~~~~^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    rv = self._mapping[key]
         ~~~~~~~~~~~~~^^^^^
TypeError: unhashable type: 'dict'
2026-04-03 07:47:07,016 - ERROR - Error in ASGI Framework
  + Exception Group Traceback (most recent call last):
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 81, in collapse_excgroups
  |     yield
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 192, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 799, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    |     await app(scope, receive, send, sync_spawn, call_soon)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    |     response = await call_next(request)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    |     return await call_next(request)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    |     await route.handle(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    |     response = await f(request)
    |                ^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    |     raw_response = await run_endpoint_function(
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    |     return await dependant.call(**values)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    |     return templates.TemplateResponse('login.html', {'request': request})
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    |     template = self.get_template(name)
    |                ^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    |     return self.env.get_template(name)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    |     return self._load_template(name, globals)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    |     template = self.cache.get(cache_key)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    |     return self[key]
    |            ~~~~^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    |     rv = self._mapping[key]
    |          ~~~~~~~~~~~~~^^^^^
    | TypeError: unhashable type: 'dict'
    +------------------------------------

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    await app(scope, receive, send, sync_spawn, call_soon)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    await super().__call__(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    response = await call_next(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    return await call_next(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    await route.handle(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    response = await f(request)
               ^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    return await dependant.call(**values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    return templates.TemplateResponse('login.html', {'request': request})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    template = self.get_template(name)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    return self.env.get_template(name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    return self._load_template(name, globals)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    template = self.cache.get(cache_key)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    return self[key]
           ~~~~^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    rv = self._mapping[key]
         ~~~~~~~~~~~~~^^^^^
TypeError: unhashable type: 'dict'
[2026-04-03 07:47:12 +0000] [128] [INFO] 212.164.246.246:60702 - - [03/Apr/2026:07:47:12 +0000] "GET /57549926c5b464060d4740a0995f1499/panel 1.1" 302 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0"
[2026-04-03 07:47:12 +0000] [128] [INFO] 212.164.246.246:60702 - - [03/Apr/2026:07:47:12 +0000] "GET /57549926c5b464060d4740a0995f1499/login 1.1" 500 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0"
[2026-04-03 07:47:12 +0000] [128] [ERROR] Error in ASGI Framework
  + Exception Group Traceback (most recent call last):
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 81, in collapse_excgroups
  |     yield
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 192, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 799, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    |     await app(scope, receive, send, sync_spawn, call_soon)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    |     response = await call_next(request)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    |     return await call_next(request)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    |     await route.handle(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    |     response = await f(request)
    |                ^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    |     raw_response = await run_endpoint_function(
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    |     return await dependant.call(**values)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    |     return templates.TemplateResponse('login.html', {'request': request})
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    |     template = self.get_template(name)
    |                ^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    |     return self.env.get_template(name)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    |     return self._load_template(name, globals)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    |     template = self.cache.get(cache_key)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    |     return self[key]
    |            ~~~~^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    |     rv = self._mapping[key]
    |          ~~~~~~~~~~~~~^^^^^
    | TypeError: unhashable type: 'dict'
    +------------------------------------

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    await app(scope, receive, send, sync_spawn, call_soon)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    await super().__call__(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    response = await call_next(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    return await call_next(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    await route.handle(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    response = await f(request)
               ^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    return await dependant.call(**values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    return templates.TemplateResponse('login.html', {'request': request})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    template = self.get_template(name)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    return self.env.get_template(name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    return self._load_template(name, globals)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    template = self.cache.get(cache_key)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    return self[key]
           ~~~~^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    rv = self._mapping[key]
         ~~~~~~~~~~~~~^^^^^
TypeError: unhashable type: 'dict'
2026-04-03 07:47:12,625 - ERROR - Error in ASGI Framework
  + Exception Group Traceback (most recent call last):
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 81, in collapse_excgroups
  |     yield
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 192, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 799, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    |     await app(scope, receive, send, sync_spawn, call_soon)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    |     response = await call_next(request)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |   File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    |     self.gen.throw(value)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    |     return await call_next(request)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    |     raise app_exc from app_exc.__cause__ or app_exc.__context__
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    |     await route.handle(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    |     await self.app(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    |     response = await f(request)
    |                ^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    |     raw_response = await run_endpoint_function(
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    |     return await dependant.call(**values)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    |     return templates.TemplateResponse('login.html', {'request': request})
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    |     template = self.get_template(name)
    |                ^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    |     return self.env.get_template(name)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    |     return self._load_template(name, globals)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    |     template = self.cache.get(cache_key)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    |     return self[key]
    |            ~~~~^^^^^
    |   File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    |     rv = self._mapping[key]
    |          ~~~~~~~~~~~~~^^^^^
    | TypeError: unhashable type: 'dict'
    +------------------------------------

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/asyncio/task_group.py", line 28, in _handle
    await app(scope, receive, send, sync_spawn, call_soon)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/hypercorn/app_wrappers.py", line 34, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/applications.py", line 1160, in __call__
    await super().__call__(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/applications.py", line 90, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/request.py", line 8, in dispatch
    response = await call_next(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 191, in __call__
    with recv_stream, send_stream, collapse_excgroups():
  File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 193, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/middleware/auth.py", line 29, in dispatch
    return await call_next(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 168, in call_next
    raise app_exc from app_exc.__cause__ or app_exc.__context__
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 660, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 680, in app
    await route.handle(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 119, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 105, in app
    response = await f(request)
               ^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 431, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/fastapi/routing.py", line 313, in run_endpoint_function
    return await dependant.call(**values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/core/scripts/webpanel/routers/login/login.py", line 15, in login
    return templates.TemplateResponse('login.html', {'request': request})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 148, in TemplateResponse
    template = self.get_template(name)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/starlette/templating.py", line 115, in get_template
    return self.env.get_template(name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 1016, in get_template
    return self._load_template(name, globals)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/environment.py", line 964, in _load_template
    template = self.cache.get(cache_key)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 477, in get
    return self[key]
           ~~~~^^^^^
  File "/etc/hysteria/hysteria2_venv/lib/python3.12/site-packages/jinja2/utils.py", line 515, in __getitem__
    rv = self._mapping[key]
         ~~~~~~~~~~~~~^^^^^
TypeError: unhashable type: 'dict'

@echuraev
Copy link
Copy Markdown
Author

@reysonk Sorry for the delay in the responce, I was busy. Based on the looks that you have provided it looks like the problem is not in the docker container, but the problem with versions of Python packages. So, I'm not sure that is should be fixed in this PR. Maybe a new one should be created.

Do you have the same problem in bare installation with install.sh or only with docker?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants