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

VariabeleStandaardWat het doet
SECRET_KEY_BASE/data/progresswatch/progresswatch.envWordt 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_URLsqlite3:/data/progresswatch/db.sqlite3Waar 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_SSLfalseZet 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.
PORT3000De 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_LEVELinfoLogs 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.

VariabeleStandaardWat 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_URLREDIS_URL, db 0Vervangt alleen de voortgangsopslag.
SIDEKIQ_REDIS_URLREDIS_URL, db 1Vervangt alleen de wachtrij.
PROGRESS_TTL_SECONDS86400Hoe 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_PREFIXpw:progressSleutelprefix 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.

VariabeleStandaardWat het doet
MAX_TASK_TITLE_LENGTH500Langste taaktitel die bewaard blijft, in tekens
MAX_TASK_SOURCE_LENGTH200Langste taakbron die bewaard blijft
MAX_SPACE_TITLE_LENGTH200Langste ruimtenaam die bewaard blijft
MAX_VALUES_KEY_COUNT50Meeste sleutels in de values van een melding
MAX_VALUES_KEY_LENGTH100Langste sleutel in values
MAX_VALUES_STRING_LENGTH10000Langste 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.

VariabeleStandaardWat 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_SUBJECThttps://github.com/progress-watch/progresswatchEen contactadres waarop de pushdiensten je kunnen bereiken als er iets misgaat. Niemand controleert het.
PUSH_CONTENTfullfull zet de taaktitel in de melding, minimal stuurt «Task completed» en niets herkenbaars.
PUSH_RELAYhttps://progress.watchWaar 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

VariabeleStandaardWat het doet
RAILS_MAX_THREADS5Puma-threads per proces, en de grootte van zowel de database- als de Redis-verbindingspool.
WEB_CONCURRENCY0Puma-workerprocessen. Nul draait één enkel proces, wat het juiste antwoord is op een kleine machine.
SIDEKIQ_CONCURRENCY5Threads in het Sidekiq-proces. Meldingen sturen is de enige klus die er is.