Installing Postulo → Putting it on a server: gunicorn is missing, test tools installed, no scheduler #540
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#540
Loading…
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?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, following the wiki's bare-metal steps againstpyproject.tomland the Dockerfile, with a dry-runuv syncof the lock file.Related to #154.
Checked again on 2026-10-01 against
mainat0a5cad587: still present.The steps for running Postulo without Docker install the wrong set of packages and then leave out the processes a working instance needs. An operator who follows them literally gets a failing server command, the browser test stack in production, and, once the server runs, reminders that never fire and exports that are never deleted.
Installing-Postulo.md:182-186(step 1,uv sync --no-dev),Installing-Postulo.md:222-229(step 5,uv run gunicorn …and "(gunicorn is not a dependency of Postulo; install whichever server you prefer.)"),Installing-Postulo.md:236("There is no background worker to run. Nothing in Postulo currently queues work."),Installing-Postulo.md:329-334(upgrading without Docker, a bareuv sync). Againstpyproject.toml:56(server = ["gunicorn>=23.0"]),pyproject.toml:82(default-groups = ["dev", "e2e"]) anddocker/Dockerfile:89and:94(uv sync --locked --no-default-groups --extra server --extra postgres).--no-devdrops only thedevgroup;e2eis a default group too, soplaywright,pytest,pytest-base-urlandpytest-playwrightare installed and gunicorn is not (checked withuv sync --locked --no-dev --dry-run). Each lateruv runsyncs the default groups again unless given the same flags.uv run gunicorn …therefore fails. gunicorn is in fact Postulo's ownserverextra; a copy installed by hand, as the note suggests, is removed by the next exactuv sync, which is what the upgrade section runs.manage.py send_due_reminders --loop(or a cron entry) is what sends reminders, webhooks and document copies, runs synchronisations and deletes expired export archives, andmanage.py workis needed whenPOSTULO_BACKGROUND_WORKis set. Configuration documents both (Configuration.md:329-340,Configuration.md:424-427); this page contradicts it.manage.py fetch_geonamesis not mentioned; the image's entrypoint runs it on first start, so a bare-metal instance has no city table and its company map places nothing (Configuration.md:101-106).uv sync --locked --no-default-groups --extra server(plus--extra postgresfor PostgreSQL), with a sentence that every lateruv syncanduv runtakes the same flags. Drop the gunicorn note. Replace line 236 with a step that runs the scheduler (a systemd unit or a cron line formanage.py send_due_reminders),manage.py workwhen background work is on, andmanage.py fetch_geonamesonce. Make the upgrade section'suv syncrepeat the install flags.Done when
serverextra and withoutplaywrightinstalled, and name the scheduler; checked by hand, since the wiki has no tests.Corrected in the wiki (postulo.wiki ee6e8bd).