Accounts and sign-in, and fix the read toggle

epAction's redraw closure called itself when handed a row, so Mark read
recursed until the stack blew; it now swaps that row in place. Opening an
item also marks it read, redrawn where it stands so nothing vanishes from
under the pointer on the Unread tab.

Step A of multi-user: users and sessions tables, Argon2id, a session
cookie, ipx user subcommands, and a trusted proxy header for Cloudflare
Zero Trust -- honoured only from a trusted_proxies address. The shared
token still works and is the admin. A new database starts with
admin/ipodderx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AdXho5tTkjFLeUXKbEjKBh
This commit is contained in:
2026-09-10 23:11:20 +00:00
parent ed26fa2061
commit 06f182b555
12 changed files with 876 additions and 53 deletions

View File

@@ -1,28 +1,22 @@
services:
iPodderX:
build: .
# image: ipx:latest # swap build: for image: once you have published one
ipodderx:
image: 192.168.1.130:5000/ipodderx:latest
container_name: iPodderX
restart: unless-stopped
environment:
# Unraid shares expect these; downloads land owned by nobody:users.
PUID: "99"
PGID: "100"
TZ: "America/Toronto"
# ipx=debug for verbose, or add librqbit=info to watch torrents.
IPX_LOG: "ipx=info"
ports:
- "8099:8099" # web UI
- "6881:6881/tcp" # BitTorrent peers
- "6881:6881/udp" # DHT
volumes:
- ./config:/config # config.toml, and the web token
- ./data:/data # state.db
- /mnt/user/audio/ipx:/downloads
- /mnt/fast/appdata/ipodderx:/config # config.toml, and the web token
- /mnt/user/ipodderx/:/data # state.db
- /mnt/user/ipodderx/downloads:/downloads
healthcheck:
# `ipx status` proxies through the control socket to the command worker, so this
# catches a daemon that is alive but wedged -- not just one that has died. (A
# blocked worker is a real failure mode: a torrent used to be able to cause it.)
test: ["CMD", "ipx", "status"]
interval: 30s
timeout: 5s