Progress Watch instellen via omgevingsvariabelen
Alles is een omgevingsvariabele. Er zijn geen configuratiebestanden om te bewerken en geen versleutelde inloggegevens in de image gebakken, dus dezelfde container draait op een NAS thuis en in de cloud.
Algemeen
| Variabele | Standaard | Wat het doet |
|---|---|---|
SECRET_KEY_BASE | /data/progresswatch/progresswatch.env | Wordt bij de eerste start gegenereerd en op het volume bewaard, dus laat hem leeg. Stel hem zelf in waar geen volume is, of waar meerdere containers hem moeten delen. |
DATABASE_URL | sqlite3:/data/progresswatch/db.sqlite3 | Waar ruimtes en taakstructuur leven. Het standaardbestand is wat het Docker-volume bevat; wijs naar postgresql://… voor een cloudinstallatie. De voortgang zelf wordt hier nooit geschreven. |
FORCE_SSL | false | Zet op true wanneer iets ervoor de TLS afhandelt. Het stuurt ook assume_ssl aan, dus uit laten houdt de app bruikbaar via gewoon HTTP in plaats van door te sturen naar een certificaat dat je niet hebt. |
PORT | 3000 | De poort waarop Puma binnen de container luistert. docker-compose.yml publiceert hem op 7979, omdat een dienst die je wekenlang laat draaien niet de poort hoort te bezetten die je eigen ontwikkelservers willen. |
RAILS_LOG_LEVEL | info | Logs gaan naar stdout en nergens anders heen. Dit is hoeveel ervan. |
RATE_LIMIT_PER_HOUR | — | Hoeveel ruimtes en taken één adres per uur mag aanmaken. Niet gezet betekent geen limiet, wat het juiste antwoord is voor een server die alleen jij kunt bereiken. Voortgang rapporteren wordt nooit beperkt. |
Achter een proxy is RATE_LIMIT_PER_HOUR niet beter dan het adres dat de app ziet. Rails leest X-Forwarded-For en vertrouwt die vanuit privébereiken, wat een reverse proxy op dezelfde host stuurt — maar als de header niet aankomt, lijkt elk verzoek op één client en sluit de limiet iedereen tegelijk buiten in plaats van niemand.
Redis
Redis houdt twee ongerelateerde dingen bij: de huidige voortgang van elke taak, en de Sidekiq-wachtrij. Dat zijn standaard twee logische databases van één server, en beide kunnen naar een eigen instantie verhuizen.
| Variabele | Standaard | Wat het doet |
|---|---|---|
REDIS_URL | — | De server voor beide rollen, verdeeld over db 0 voor voortgang en db 1 voor de wachtrij. Leeg gelaten draait de image een eigen Redis in de container en schrijft er snapshots van naar het volume. |
PROGRESS_REDIS_URL | REDIS_URL, db 0 | Vervangt alleen de voortgangsopslag. |
SIDEKIQ_REDIS_URL | REDIS_URL, db 1 | Vervangt alleen de wachtrij. |
PROGRESS_TTL_SECONDS | 86400 | Hoe lang een taak haar voortgang houdt zonder beschreven te worden. Elke rapportage vernieuwt dat, dus dit is eigenlijk hoe lang een verlaten taak in beeld blijft. |
PROGRESS_KEY_PREFIX | pw:progress | Sleutelprefix voor de voortgangsopslag, zodat die een database met iets anders kan delen. |
Limieten
Tekst voorbij een limiet wordt daarop afgekapt, met een beletselteken als laatste teken. Een values-object met meer sleutels, of een langere sleutel, wordt in plaats daarvan met 400 geweigerd. Deze standaardwaarden zijn voor een eigen server; progress.watch houdt ze elk lager.
| Variabele | Standaard | Wat het doet |
|---|---|---|
MAX_TASK_TITLE_LENGTH | 500 | Langste taaktitel die bewaard blijft, in tekens |
MAX_TASK_SOURCE_LENGTH | 200 | Langste taakbron die bewaard blijft |
MAX_SPACE_TITLE_LENGTH | 200 | Langste ruimtenaam die bewaard blijft |
MAX_VALUES_KEY_COUNT | 50 | Meeste sleutels in de values van een melding |
MAX_VALUES_KEY_LENGTH | 100 | Langste sleutel in values |
MAX_VALUES_STRING_LENGTH | 10000 | Langste tekenreeks in values, een logregel inbegrepen |
Meldingen
Beide sleutels leeg betekent dat de functie niet bestaat: geen knop op een ruimte, en niets opgeslagen over wie dan ook. Er valt niets te registreren bij Apple of Google — wie de browser maakte, draait de pushdienst. Genereer één keer een paar en roteer het niet; bestaande abonnementen zijn eraan gebonden en browsers worden niet ingelicht.
| Variabele | Standaard | Wat het doet |
|---|---|---|
VAPID_PUBLIC_KEY | — | Publieke helft van het paar dat elke push ondertekent. Wordt aan de browser gegeven wanneer die zich abonneert. |
VAPID_PRIVATE_KEY | — | Private helft. Verlaat de server nooit. |
VAPID_SUBJECT | https://github.com/progress-watch/progresswatch | Een contactadres waarop de pushdiensten je kunnen bereiken als er iets misgaat. Niemand controleert het. |
PUSH_CONTENT | full | full zet de taaktitel in de melding, minimal stuurt «Task completed» en niets herkenbaars. |
PUSH_RELAY | https://progress.watch | Waar een melding voor de iOS-app naartoe gaat om ondertekend en aan Apple overhandigd te worden: alleen de uitgever van de app heeft de sleutel waar Apple om vraagt, dus een zelf gehoste server kan er zelf geen afleveren. De relay ziet het apparaat en de tekst van de melding, nooit een ruimte-UUID, en er wordt niets verstuurd voordat iemand meldingen aanzet in de app. PUSH_CONTENT=minimal houdt taaktitels erbuiten. false zet het uit, en de app biedt dan geen meldingen aan op deze server. |
Processen dimensioneren
| Variabele | Standaard | Wat het doet |
|---|---|---|
RAILS_MAX_THREADS | 5 | Puma-threads per proces, en de grootte van zowel de database- als de Redis-verbindingspool. |
WEB_CONCURRENCY | 0 | Puma-workerprocessen. Nul draait één enkel proces, wat het juiste antwoord is op een kleine machine. |
SIDEKIQ_CONCURRENCY | 5 | Threads in het Sidekiq-proces. Meldingen sturen is de enige klus die er is. |