deployment fixes
This commit is contained in:
+11
-1
@@ -24,13 +24,23 @@ SMTP_TIMEOUT=30
|
|||||||
SSH_HOST=media-server.example.com
|
SSH_HOST=media-server.example.com
|
||||||
SSH_USERNAME=username
|
SSH_USERNAME=username
|
||||||
SSH_PORT=22
|
SSH_PORT=22
|
||||||
SSH_KEY_FILENAME=/home/username/.ssh/id_rsa
|
# In Docker Compose, mount your private key at ./secrets/ssh/id_ed25519
|
||||||
|
# and set this path to /root/.ssh/id_ed25519 inside the backend container.
|
||||||
|
SSH_KEY_FILENAME=/root/.ssh/id_ed25519
|
||||||
|
SSH_KEY_NAME=id_rsa
|
||||||
# SSH_PASSWORD=optional-password-or-key-passphrase
|
# SSH_PASSWORD=optional-password-or-key-passphrase
|
||||||
REMOTE_MEDIA_ROOT=/mnt/media
|
REMOTE_MEDIA_ROOT=/mnt/media
|
||||||
# Optional fallback prefix when REMOTE_MEDIA_ROOT mapping is not enough.
|
# Optional fallback prefix when REMOTE_MEDIA_ROOT mapping is not enough.
|
||||||
# Example: Jellyfin gives /media/... but SSH host requires /srv/media/...
|
# Example: Jellyfin gives /media/... but SSH host requires /srv/media/...
|
||||||
REMOTE_PATH_PREFIX=
|
REMOTE_PATH_PREFIX=
|
||||||
|
|
||||||
|
|
||||||
|
# For deployment with traefik
|
||||||
|
APP_NAME=management
|
||||||
|
APP_HOST=management.example.com
|
||||||
|
CERT_RESOLVER=lets-encrypt
|
||||||
|
APP_PORT=5173
|
||||||
|
|
||||||
# Authentik / OIDC
|
# Authentik / OIDC
|
||||||
# Backend validates every API request with a Bearer JWT.
|
# Backend validates every API request with a Bearer JWT.
|
||||||
AUTH_ENABLED=true
|
AUTH_ENABLED=true
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ env/
|
|||||||
*.log
|
*.log
|
||||||
tmp/
|
tmp/
|
||||||
|
|
||||||
|
# SSH secrets used by docker compose
|
||||||
|
secrets/ssh/
|
||||||
|
|
||||||
# Frontend
|
# Frontend
|
||||||
frontend/node_modules/
|
frontend/node_modules/
|
||||||
frontend/dist/
|
frontend/dist/
|
||||||
|
|||||||
@@ -83,7 +83,9 @@ LOG_LEVEL=INFO
|
|||||||
SSH_HOST=media-server.example.com
|
SSH_HOST=media-server.example.com
|
||||||
SSH_USERNAME=username
|
SSH_USERNAME=username
|
||||||
SSH_PORT=22
|
SSH_PORT=22
|
||||||
SSH_KEY_FILENAME=/home/username/.ssh/id_rsa
|
# In Docker Compose, mount your private key at ./secrets/ssh/id_ed25519
|
||||||
|
# and your host key file at ./secrets/ssh/known_hosts.
|
||||||
|
SSH_KEY_FILENAME=/root/.ssh/id_ed25519
|
||||||
SSH_PASSWORD=
|
SSH_PASSWORD=
|
||||||
|
|
||||||
REMOTE_MEDIA_ROOT=/srv/media
|
REMOTE_MEDIA_ROOT=/srv/media
|
||||||
|
|||||||
+3
-1
@@ -71,7 +71,9 @@ OIDC_CLOCK_SKEW_SECONDS=30
|
|||||||
SSH_HOST=media-server.example.com
|
SSH_HOST=media-server.example.com
|
||||||
SSH_USERNAME=username
|
SSH_USERNAME=username
|
||||||
SSH_PORT=22
|
SSH_PORT=22
|
||||||
SSH_KEY_FILENAME=/home/username/.ssh/id_rsa
|
# In Docker Compose, mount your private key at ./secrets/ssh/id_ed25519
|
||||||
|
# and your host key file at ./secrets/ssh/known_hosts.
|
||||||
|
SSH_KEY_FILENAME=/root/.ssh/id_ed25519
|
||||||
SSH_PASSWORD=
|
SSH_PASSWORD=
|
||||||
|
|
||||||
REMOTE_MEDIA_ROOT=/srv/media
|
REMOTE_MEDIA_ROOT=/srv/media
|
||||||
|
|||||||
@@ -9,10 +9,12 @@ services:
|
|||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
AUTH_ENABLED: "false"
|
AUTH_ENABLED: "false"
|
||||||
|
SSH_KEY_FILENAME: /root/.ssh/id_rsa
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
volumes:
|
volumes:
|
||||||
- ./backend:/app/backend
|
- ./backend:/app/backend
|
||||||
|
- ./secrets/ssh/:/root/.ssh/
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ services:
|
|||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
AUTH_ENABLED: "true"
|
AUTH_ENABLED: "true"
|
||||||
|
SSH_KEY_FILENAME: /root/.ssh/${SSH_KEY_NAME}
|
||||||
|
volumes:
|
||||||
|
- ./secrets/ssh:/root/.ssh:ro
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
expose:
|
expose:
|
||||||
- "8000"
|
- "8000"
|
||||||
@@ -40,6 +43,12 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
backend:
|
backend:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${APP_NAME}.rule=Host(`${APP_HOST}`)"
|
||||||
|
- "traefik.http.routers.${APP_NAME}.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.${APP_NAME}.tls.certresolver=${CERT_RESOLVER}"
|
||||||
|
- "traefik.http.services.${APP_NAME}.loadbalancer.server.port=${APP_PORT}"
|
||||||
ports:
|
ports:
|
||||||
- "8080:80"
|
- "8080:80"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ Phase 1: Jellyfin media index, SSH-based remote filesystem inspection, server mo
|
|||||||
- Provide a dashboard tab with a compact Jellyfin media library overview and server resource overview.
|
- Provide a dashboard tab with a compact Jellyfin media library overview and server resource overview.
|
||||||
- Support OIDC login in the frontend using an OIDC client library, with backend JWT validation for protected API requests.
|
- Support OIDC login in the frontend using an OIDC client library, with backend JWT validation for protected API requests.
|
||||||
- Provide Docker Compose deployment files at the repository root for production and local development.
|
- Provide Docker Compose deployment files at the repository root for production and local development.
|
||||||
|
- Backend Docker deployment should mount a private SSH key and a known_hosts file into the container rather than baking them into the image.
|
||||||
- Show Jellyfin media counts for movies, series, and series episodes on the dashboard.
|
- Show Jellyfin media counts for movies, series, and series episodes on the dashboard.
|
||||||
- Show dashboard session activity from Jellyfin, including both currently playing sessions and logged-in idle sessions.
|
- Show dashboard session activity from Jellyfin, including both currently playing sessions and logged-in idle sessions.
|
||||||
- Activity rows should include user, media title (or `(idle)`), playback state (`playing`/`paused`/`idle`), and whether transcoding is active.
|
- Activity rows should include user, media title (or `(idle)`), playback state (`playing`/`paused`/`idle`), and whether transcoding is active.
|
||||||
@@ -168,3 +169,4 @@ Phase 1: Jellyfin media index, SSH-based remote filesystem inspection, server mo
|
|||||||
- 2026-05-03: Confirmed the shared session table should keep the compact overall status summary line above the rows.
|
- 2026-05-03: Confirmed the shared session table should keep the compact overall status summary line above the rows.
|
||||||
- 2026-05-03: Updated the dashboard monitoring cards to show 10-minute averages with high/low subtext instead of only the latest sample.
|
- 2026-05-03: Updated the dashboard monitoring cards to show 10-minute averages with high/low subtext instead of only the latest sample.
|
||||||
- 2026-05-03: Added OIDC/JWT auth support plus root-level Docker Compose deployment files for production and dev workflows.
|
- 2026-05-03: Added OIDC/JWT auth support plus root-level Docker Compose deployment files for production and dev workflows.
|
||||||
|
- 2026-05-04: Backend Docker Compose now mounts `./secrets/ssh/id_ed25519` and `./secrets/ssh/known_hosts` into `/root/.ssh` so Paramiko can use a private key and strict host-key checking without baking secrets into the image.
|
||||||
|
|||||||
Reference in New Issue
Block a user