mirror of
https://github.com/chr0nzz/traefik-manager.git
synced 2026-05-09 05:35:22 +02:00
[GH-ISSUE #24] Bug: [Errno 13] Permission denied: '/app' on native Linux install (LXC) #24
Labels
No labels
bug
bug
bug
feature request
pull-request
question
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/traefik-manager#24
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @counterf on GitHub (Apr 16, 2026).
Original GitHub issue: https://github.com/chr0nzz/traefik-manager/issues/24
Originally assigned to: @chr0nzz on GitHub.
I am trying to install traefik-manager on an existing traefik LXC machine.
Apr 16 14:31:17 traefik-internal gunicorn[57839]: [2026-04-16 14:31:17 -0400] [57839] [INFO] Starting gunicorn 25.3.0 Apr 16 14:31:17 traefik-internal gunicorn[57839]: [2026-04-16 14:31:17 -0400] [57839] [INFO] Listening at: http://0.0.0.0:5000 (57839) Apr 16 14:31:17 traefik-internal gunicorn[57839]: [2026-04-16 14:31:17 -0400] [57839] [INFO] Using worker: sync Apr 16 14:31:17 traefik-internal gunicorn[57840]: [2026-04-16 14:31:17 -0400] [57840] [INFO] Booting worker with pid: 57840 Apr 16 14:31:17 traefik-internal gunicorn[57839]: [2026-04-16 14:31:17 -0400] [57839] [INFO] Control socket listening at /opt/traefik-manager/.gunicorn/gunicor> Apr 16 14:31:17 traefik-internal gunicorn[57840]: [2026-04-16 14:31:17 -0400] [57840] [ERROR] Exception in worker process Apr 16 14:31:17 traefik-internal gunicorn[57840]: Traceback (most recent call last): Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 713, in spawn_worker Apr 16 14:31:17 traefik-internal gunicorn[57840]: worker.init_process() Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/workers/base.py", line 136, in init_p> Apr 16 14:31:17 traefik-internal gunicorn[57840]: self.load_wsgi() Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/workers/base.py", line 148, in load_w> Apr 16 14:31:17 traefik-internal gunicorn[57840]: self.wsgi = self.app.wsgi() Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 66, in wsgi Apr 16 14:31:17 traefik-internal gunicorn[57840]: self.callable = self.load() Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 57, in load Apr 16 14:31:17 traefik-internal gunicorn[57840]: return self.load_wsgiapp() Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsg> Apr 16 14:31:17 traefik-internal gunicorn[57840]: return util.import_app(self.app_uri) Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/util.py", line 377, in import_app Apr 16 14:31:17 traefik-internal gunicorn[57840]: mod = importlib.import_module(module) Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module Apr 16 14:31:17 traefik-internal gunicorn[57840]: return _bootstrap._gcd_import(name[level:], package, level) Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap>", line 1206, in _gcd_import Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap>", line 1178, in _find_and_load Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap>", line 690, in _load_unlocked Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap_external>", line 940, in exec_module Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/app.py", line 47, in <module> Apr 16 14:31:17 traefik-internal gunicorn[57840]: app.secret_key = _load_or_create_secret_key() Apr 16 14:31:17 traefik-internal gunicorn[57840]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "/opt/traefik-manager/app.py", line 42, in _load_or_create_secret_key Apr 16 14:31:17 traefik-internal gunicorn[57840]: os.makedirs(os.path.dirname(_SECRET_KEY_PATH), exist_ok=True) Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen os>", line 215, in makedirs Apr 16 14:31:17 traefik-internal gunicorn[57840]: File "<frozen os>", line 225, in makedirs ...skipping... Apr 16 14:47:20 traefik-internal gunicorn[59295]: self.callable = self.load() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 57, in load Apr 16 14:47:20 traefik-internal gunicorn[59295]: return self.load_wsgiapp() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsg> Apr 16 14:47:20 traefik-internal gunicorn[59295]: return util.import_app(self.app_uri) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/util.py", line 377, in import_app Apr 16 14:47:20 traefik-internal gunicorn[59295]: mod = importlib.import_module(module) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module Apr 16 14:47:20 traefik-internal gunicorn[59295]: return _bootstrap._gcd_import(name[level:], package, level) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1206, in _gcd_import Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1178, in _find_and_load Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 690, in _load_unlocked Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap_external>", line 940, in exec_module Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/app.py", line 47, in <module> Apr 16 14:47:20 traefik-internal gunicorn[59295]: app.secret_key = _load_or_create_secret_key() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/app.py", line 42, in _load_or_create_secret_key Apr 16 14:47:20 traefik-internal gunicorn[59295]: os.makedirs(os.path.dirname(_SECRET_KEY_PATH), exist_ok=True) Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen os>", line 215, in makedirs Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen os>", line 225, in makedirs Apr 16 14:47:20 traefik-internal gunicorn[59295]: PermissionError: [Errno 13] Permission denied: '/app' Apr 16 14:47:20 traefik-internal gunicorn[59295]: [Errno 13] Permission denied: '/app' Apr 16 14:47:20 traefik-internal gunicorn[59295]: [2026-04-16 14:47:20 -0400] [59295] [INFO] Worker exiting (pid: 59295) Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [INFO] Control socket listening at /opt/traefik-manager/.gunicorn/gunicor> Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Worker (pid:59295) exited with code 3. Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Shutting down: Master Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Reason: Worker failed to boot. Apr 16 14:47:20 traefik-internal systemd[1]: traefik-manager.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED Apr 16 14:47:20 traefik-internal systemd[1]: traefik-manager.service: Failed with result 'exit-code'. ...skipping... Apr 16 14:47:20 traefik-internal gunicorn[59295]: self.callable = self.load() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 57, in load Apr 16 14:47:20 traefik-internal gunicorn[59295]: return self.load_wsgiapp() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsg> Apr 16 14:47:20 traefik-internal gunicorn[59295]: return util.import_app(self.app_uri) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/venv/lib/python3.11/site-packages/gunicorn/util.py", line 377, in import_app Apr 16 14:47:20 traefik-internal gunicorn[59295]: mod = importlib.import_module(module) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module Apr 16 14:47:20 traefik-internal gunicorn[59295]: return _bootstrap._gcd_import(name[level:], package, level) Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1206, in _gcd_import Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1178, in _find_and_load Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 690, in _load_unlocked Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap_external>", line 940, in exec_module Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/app.py", line 47, in <module> Apr 16 14:47:20 traefik-internal gunicorn[59295]: app.secret_key = _load_or_create_secret_key() Apr 16 14:47:20 traefik-internal gunicorn[59295]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "/opt/traefik-manager/app.py", line 42, in _load_or_create_secret_key Apr 16 14:47:20 traefik-internal gunicorn[59295]: os.makedirs(os.path.dirname(_SECRET_KEY_PATH), exist_ok=True) Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen os>", line 215, in makedirs Apr 16 14:47:20 traefik-internal gunicorn[59295]: File "<frozen os>", line 225, in makedirs Apr 16 14:47:20 traefik-internal gunicorn[59295]: PermissionError: [Errno 13] Permission denied: '/app' Apr 16 14:47:20 traefik-internal gunicorn[59295]: [Errno 13] Permission denied: '/app' Apr 16 14:47:20 traefik-internal gunicorn[59295]: [2026-04-16 14:47:20 -0400] [59295] [INFO] Worker exiting (pid: 59295) Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [INFO] Control socket listening at /opt/traefik-manager/.gunicorn/gunicor> Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Worker (pid:59295) exited with code 3. Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Shutting down: Master Apr 16 14:47:20 traefik-internal gunicorn[59294]: [2026-04-16 14:47:20 -0400] [59294] [ERROR] Reason: Worker failed to boot. Apr 16 14:47:20 traefik-internal systemd[1]: traefik-manager.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED Apr 16 14:47:20 traefik-internal systemd[1]: traefik-manager.service: Failed with result 'exit-code'.This is how I got it installed:
`▸ What would you like to install?
Choose an option
1) Traefik + Traefik Manager (full stack)
2) Traefik Manager only
Choice [1]: 2
────────────────────────────────────────
Deployment method
1) Docker
2) Linux service (systemd)
Choice [1]: 2
▸ Checking dependencies
✔ curl found
✔ git found
✔ Python 3.11.2 found
✔ systemd found
▸ Traefik Manager - Linux Service Setup
Press Enter to accept defaults shown in brackets.
Install directory [/opt/traefik-manager]:
Data directory [/var/lib/traefik-manager]: /opt/traefik-manager/data
Port [5000]:
────────────────────────────────────────
-- Service User --
Create a dedicated system user (traefik-manager)? (y/n) [y]: y
────────────────────────────────────────
-- Dynamic Config --
ℹ Single file is simpler. Directory (one .yml per service) is easier at scale.
Dynamic config layout
1) Single file (dynamic.yml)
2) Directory - one .yml file per service
Choice [1]: 2
Path to Traefik dynamic config directory [/etc/traefik/conf.d]: /etc/traefik/dynamic/
────────────────────────────────────────
-- Optional Mounts --
ℹ Expose extra Traefik data to Traefik Manager for richer visibility.
Mount SSL certs (acme.json)? (y/n) [y]: y
Path to acme.json [/etc/traefik/acme.json]:
Mount access logs? (y/n) [y]: y
Path to Traefik access log [/var/log/traefik/access.log]: /var/log/traefik-access.log
Mount Traefik static config (traefik.yml)? (y/n) [n]: y
Path to traefik.yml [/etc/traefik/traefik.yml]:
▸ Installing Traefik Manager
⚠ /opt/traefik-manager already exists. Pulling latest changes.
Already up to date.
✔ Repository cloned to /opt/traefik-manager
✔ Python dependencies installed
✔ Data directories created at /opt/traefik-manager/data
✔ System user traefik-manager created
✔ systemd unit written to /etc/systemd/system/traefik-manager.service
Created symlink /etc/systemd/system/multi-user.target.wants/traefik-manager.service → /etc/systemd/system/traefik-manager.service.
✔ Service enabled and started
▸ Waiting for Traefik Manager to generate temporary password
⚠ Could not retrieve temporary password. Check: sudo journalctl -u traefik-manager`
@counterf commented on GitHub (Apr 16, 2026):
I changed the user in the /etc/systemd/system/traefik-manager.service to root and no issues now. I think there is some compatibility issue with lxc containers proxmox.
@chr0nzz commented on GitHub (Apr 16, 2026):
Thanks for the detailed report! This was a bug in the startup code - the Flask session secret key path was hardcoded to /app/config/.secret_key (a Docker-internal path) instead of being derived from SETTINGS_PATH like everything else. So on a native Linux install it tried to create /app/ and hit a permission error.
Fixed in the upcoming v0.12.0 release, out tomorrow. In the meantime you can work around it by setting SECRET_KEY= in your systemd unit's [Service] section - that bypasses the file entirely.
@chr0nzz commented on GitHub (Apr 17, 2026):
new update out and fixes this issue, if you don't want to run as root you can reinstall it.