Make the listen port configurable via PORT
All checks were successful
Deploy / deploy (push) Successful in 22s
All checks were successful
Deploy / deploy (push) Successful in 22s
app.py's dev server and gunicorn both hardcoded 5000, which is awkward
locally — macOS ControlCenter already holds that port, so the app can't
bind on the dev laptop without editing source.
Both now read PORT, defaulting to 5000 so EXPOSE, the compose
`${HOST_PORT}:5000` mapping and the deployed container are unchanged.
Read at run time rather than import time so a dev harness can assign a
free port.
Also tracks .claude/launch.json with autoPort set. It doesn't actually
launch on this machine — the preview sandbox can't read files under
~/Desktop — so CLAUDE.md notes that running from a shell with an
explicit PORT is the working local path.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
95b7ce7c03
commit
f572d95bd0
4 changed files with 32 additions and 2 deletions
12
.claude/launch.json
Normal file
12
.claude/launch.json
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"version": "0.0.1",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "arr-summary",
|
||||||
|
"runtimeExecutable": "python3",
|
||||||
|
"runtimeArgs": ["app.py"],
|
||||||
|
"port": 5000,
|
||||||
|
"autoPort": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
10
CLAUDE.md
10
CLAUDE.md
|
|
@ -143,6 +143,16 @@ reload alone will silently serve the cached template. And the login
|
||||||
password comes from `LOGIN_PASSWORD`, so set it explicitly rather than
|
password comes from `LOGIN_PASSWORD`, so set it explicitly rather than
|
||||||
hunting for the real one.
|
hunting for the real one.
|
||||||
|
|
||||||
|
The listen port comes from `PORT` (default `5000`, matching `EXPOSE`,
|
||||||
|
`gunicorn.conf.py` and the `${HOST_PORT}:5000` compose mapping — change
|
||||||
|
all four together or none). Set it when running locally: macOS
|
||||||
|
`ControlCenter` already holds port 5000, so `python3 app.py` with no
|
||||||
|
`PORT` will fail to bind on the dev laptop. `.claude/launch.json` sets
|
||||||
|
`autoPort` so a dev harness can assign a free one, but note that on this
|
||||||
|
machine the preview sandbox can't read files under `~/Desktop`
|
||||||
|
("Operation not permitted"), so launching by name fails and running the
|
||||||
|
app from a shell on an explicit `PORT` is the working path.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
**Target:** Unraid server, container path `/mnt/user/appdata/greendale`
|
**Target:** Unraid server, container path `/mnt/user/appdata/greendale`
|
||||||
|
|
|
||||||
6
app.py
6
app.py
|
|
@ -1543,4 +1543,8 @@ def add_to_sonarr():
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run(host="0.0.0.0", port=5000)
|
# PORT is read at run time, not import time, so a dev harness can hand us
|
||||||
|
# a free port. Defaults to 5000 to match EXPOSE/gunicorn and the
|
||||||
|
# `${HOST_PORT}:5000` mapping in docker-compose.yml — don't change the
|
||||||
|
# default without changing all three.
|
||||||
|
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", "5000")))
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
# Gunicorn configuration
|
# Gunicorn configuration
|
||||||
|
import os
|
||||||
|
|
||||||
workers = 2 # 2 workers × 4 threads = 8 concurrent requests; fewer cold-cache workers
|
workers = 2 # 2 workers × 4 threads = 8 concurrent requests; fewer cold-cache workers
|
||||||
threads = 4
|
threads = 4
|
||||||
worker_class = "gthread"
|
worker_class = "gthread"
|
||||||
bind = "0.0.0.0:5000"
|
# Defaults to 5000 to match EXPOSE, the `${HOST_PORT}:5000` mapping in
|
||||||
|
# docker-compose.yml, and app.py's own dev-server default.
|
||||||
|
bind = "0.0.0.0:" + os.environ.get("PORT", "5000")
|
||||||
timeout = 30 # fail fast — app has its own 5s internal deadline
|
timeout = 30 # fail fast — app has its own 5s internal deadline
|
||||||
keepalive = 5
|
keepalive = 5
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue