Compare commits
1 Commits
main
...
codex/anal
| Author | SHA1 | Date | |
|---|---|---|---|
| 9376fae60b |
@@ -53,9 +53,3 @@ BASIC_AUTH_PASS=CHANGE_ME
|
|||||||
|
|
||||||
# ===== Polling =====
|
# ===== Polling =====
|
||||||
POLL_SECONDS=5
|
POLL_SECONDS=5
|
||||||
|
|
||||||
# ===== SSH host key verification (optional) =====
|
|
||||||
# Path to known_hosts file inside container. If present, strict host key
|
|
||||||
# checking is used. If absent, all host keys are accepted (less secure).
|
|
||||||
# Generate with: ssh-keyscan -p 22 192.168.1.1 > known_hosts
|
|
||||||
# SSH_KNOWN_HOSTS=/ssh/known_hosts
|
|
||||||
12
README.md
12
README.md
@@ -11,7 +11,7 @@ Web GUI to:
|
|||||||
|
|
||||||
## Files
|
## Files
|
||||||
- `docker-compose.yml` – stack
|
- `docker-compose.yml` – stack
|
||||||
- `.env.example` – copy to `.env` and fill in your values (**never commit `.env`!**)
|
- `.env.example` – copy to `.env` and fill values
|
||||||
- `jd-webgui/app.py` – FastAPI web app
|
- `jd-webgui/app.py` – FastAPI web app
|
||||||
- `jd-webgui/Dockerfile` – includes ffprobe
|
- `jd-webgui/Dockerfile` – includes ffprobe
|
||||||
|
|
||||||
@@ -40,16 +40,6 @@ docker compose up -d --build
|
|||||||
- If `MYJD_DEVICE` is empty, the WebGUI will automatically pick the first available device.
|
- If `MYJD_DEVICE` is empty, the WebGUI will automatically pick the first available device.
|
||||||
- Ensure the SSH user can write to `/jellyfin/Filme` (and series dir if used).
|
- Ensure the SSH user can write to `/jellyfin/Filme` (and series dir if used).
|
||||||
|
|
||||||
## Security
|
|
||||||
- **Never commit `.env`** – it contains passwords and API keys. Only `.env.example` is tracked.
|
|
||||||
- **SSH host key verification**: For secure SFTP transfers, provide a `known_hosts` file:
|
|
||||||
```bash
|
|
||||||
ssh-keyscan -p 22 192.168.1.1 > known_hosts
|
|
||||||
```
|
|
||||||
Mount it in `docker-compose.yml` and set `SSH_KNOWN_HOSTS=/ssh/known_hosts`.
|
|
||||||
Without it, any host key is accepted (MITM risk on untrusted networks).
|
|
||||||
- **Basic Auth** protects the WebGUI but transmits credentials in cleartext over HTTP. Use a reverse proxy with HTTPS (e.g. Traefik, Caddy) in production.
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
- Device not found: list devices
|
- Device not found: list devices
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -21,9 +21,11 @@ services:
|
|||||||
- jdownloader
|
- jdownloader
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
environment:
|
environment:
|
||||||
TZ: Europe/Berlin
|
TZ: Europe/Berlin
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/jd-output:/output:rw
|
- ./data/jd-output:/output:ro
|
||||||
- ./data/md5:/md5:rw
|
- ./data/md5:/md5:rw
|
||||||
- ${SSH_KEY_PATH:-/root/.ssh/id_ed25519}:/ssh/id_ed25519:ro
|
- /root/.ssh/id_ed25519:/ssh/id_ed25519:ro
|
||||||
|
|||||||
@@ -2,17 +2,19 @@ FROM python:3.12-slim
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg && rm -rf /var/lib/apt/lists/*
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends ffmpeg \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY requirements.txt .
|
RUN pip install --no-cache-dir \
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
fastapi \
|
||||||
|
uvicorn \
|
||||||
|
myjdapi \
|
||||||
|
paramiko \
|
||||||
|
python-multipart
|
||||||
|
|
||||||
RUN useradd -m -u 1000 appuser && chown appuser:appuser /app
|
COPY app.py /app/app.py
|
||||||
|
COPY static /app/static
|
||||||
USER appuser
|
|
||||||
|
|
||||||
COPY --chown=appuser:appuser app.py .
|
|
||||||
COPY --chown=appuser:appuser static ./static
|
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]
|
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]
|
||||||
|
|||||||
2042
jd-webgui/app.py
2042
jd-webgui/app.py
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
|||||||
fastapi
|
|
||||||
uvicorn
|
|
||||||
myjdapi
|
|
||||||
paramiko
|
|
||||||
python-multipart
|
|
||||||
@@ -4,19 +4,9 @@ form { background:#fff; border:1px solid #e5e5e5; border-radius:10px; padding:14
|
|||||||
.row { margin-bottom: 10px; }
|
.row { margin-bottom: 10px; }
|
||||||
input, select { padding:10px; border:1px solid #ccc; border-radius:8px; font-size:14px; width: 100%; max-width: 860px; }
|
input, select { padding:10px; border:1px solid #ccc; border-radius:8px; font-size:14px; width: 100%; max-width: 860px; }
|
||||||
button { padding:10px 14px; border:0; border-radius:8px; font-weight:600; cursor:pointer; }
|
button { padding:10px 14px; border:0; border-radius:8px; font-weight:600; cursor:pointer; }
|
||||||
button.danger { background:#b00020; color:#fff; }
|
|
||||||
progress { width: 100%; height: 12px; }
|
|
||||||
progress::-webkit-progress-bar { background:#f0f0f0; border-radius:8px; }
|
|
||||||
progress::-webkit-progress-value { background:#1b7f3a; border-radius:8px; }
|
|
||||||
progress::-moz-progress-bar { background:#1b7f3a; border-radius:8px; }
|
|
||||||
table { margin-top:16px; width:100%; border-collapse: collapse; background:#fff; border:1px solid #e5e5e5; border-radius:10px; overflow:hidden; }
|
table { margin-top:16px; width:100%; border-collapse: collapse; background:#fff; border:1px solid #e5e5e5; border-radius:10px; overflow:hidden; }
|
||||||
th, td { border-top:1px solid #eee; padding:10px; vertical-align: top; font-size:14px; }
|
th, td { border-top:1px solid #eee; padding:10px; vertical-align: top; font-size:14px; }
|
||||||
th { background:#fbfbfb; text-align:left; }
|
th { background:#fbfbfb; text-align:left; }
|
||||||
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; background:#f2f2f2; padding:2px 4px; border-radius:4px; }
|
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; background:#f2f2f2; padding:2px 4px; border-radius:4px; }
|
||||||
.hint { color:#555; font-size: 12px; margin-top: 10px; }
|
.hint { color:#555; font-size: 12px; margin-top: 10px; }
|
||||||
.error { color:#b00020; font-weight: 700; }
|
.error { color:#b00020; font-weight: 700; }
|
||||||
.success { color:#1b7f3a; font-weight: 700; }
|
|
||||||
.progress-row { display:flex; align-items:center; gap:8px; margin-top:6px; }
|
|
||||||
.progress-text { font-size:12px; color:#333; min-width:48px; }
|
|
||||||
.inline-form { margin-top:6px; }
|
|
||||||
.log-area { width:100%; max-width: 920px; padding:10px; border:1px solid #ccc; border-radius:8px; background:#fff; }
|
|
||||||
|
|||||||
Reference in New Issue
Block a user