Configurar o Progress Watch com variáveis de ambiente

Tudo é uma variável de ambiente. Não há ficheiros de configuração para editar nem credenciais cifradas cozidas na imagem, por isso o mesmo contentor corre num NAS em casa e na nuvem.

Geral

VariávelPredefiniçãoO que faz
SECRET_KEY_BASE/data/progresswatch/progresswatch.envGerada no primeiro arranque e guardada no volume, por isso deixe-a por definir. Defina-a você onde não houver volume, ou onde vários contentores tenham de a partilhar.
DATABASE_URLsqlite3:/data/progresswatch/db.sqlite3Onde vivem os espaços e a estrutura das tarefas. O ficheiro predefinido é o que o volume do Docker guarda; aponte para postgresql://… numa instalação na nuvem. O progresso em si nunca é escrito aqui.
FORCE_SSLfalsePonha true quando algo à frente terminar o TLS. Também comanda o assume_ssl, por isso deixá-lo desligado mantém a aplicação utilizável por HTTP simples em vez de reencaminhar para um certificado que não tem.
PORT3000O porto a que o Puma se liga dentro do contentor. O docker-compose.yml publica-o no 7979, porque um serviço que se deixa a correr durante semanas não devia ocupar o porto que os seus servidores de desenvolvimento querem.
RAILS_LOG_LEVELinfoOs registos vão para stdout e mais lado nenhum. Isto é quantos.
RATE_LIMIT_PER_HOUR—Quantos espaços e tarefas um endereço pode criar por hora. Por definir significa sem limite, que é a resposta certa para um servidor a que só você chega. Reportar progresso nunca é limitado.

Atrás de um proxy, RATE_LIMIT_PER_HOUR vale tanto quanto o endereço que a aplicação vê. O Rails lê o X-Forwarded-For e confia nele vindo de gamas privadas, que é o que um proxy inverso no mesmo anfitrião envia — mas se o cabeçalho não chegar, cada pedido parece um só cliente e o limite tranca toda a gente de uma vez em vez de ninguém.

Redis

O Redis guarda duas coisas sem relação: o progresso atual de cada tarefa, e a fila do Sidekiq. Por omissão são duas bases de dados lógicas de um servidor, e qualquer uma pode passar para a sua própria instância.

VariávelPredefiniçãoO que faz
REDIS_URL—O servidor usado para ambos os papéis, dividido em db 0 para o progresso e db 1 para a fila. Sem definir, a imagem corre o seu próprio Redis dentro do contentor e grava instantâneos no volume.
PROGRESS_REDIS_URLREDIS_URL, db 0Substitui apenas o armazenamento do progresso.
SIDEKIQ_REDIS_URLREDIS_URL, db 1Substitui apenas a fila.
PROGRESS_TTL_SECONDS86400Quanto tempo uma tarefa mantém o seu progresso sem ser escrita. Cada relatório renova-o, por isso isto é na verdade quanto tempo uma tarefa abandonada fica no ecrã.
PROGRESS_KEY_PREFIXpw:progressPrefixo das chaves do armazenamento do progresso, para poder partilhar uma base de dados com outra coisa.

Limites

O texto que passa um limite é cortado nele, ficando reticências como último carácter. Um objeto values com mais chaves, ou com uma chave mais longa, é recusado com 400. Estes valores por omissão são para um servidor próprio; o progress.watch mantém cada um mais baixo.

VariávelPredefiniçãoO que faz
MAX_TASK_TITLE_LENGTH500Título de tarefa mais longo guardado, em caracteres
MAX_TASK_SOURCE_LENGTH200Origem de tarefa mais longa guardada
MAX_SPACE_TITLE_LENGTH200Nome de espaço mais longo guardado
MAX_VALUES_KEY_COUNT50Máximo de chaves nos values de um relatório
MAX_VALUES_KEY_LENGTH100Chave mais longa em values
MAX_VALUES_STRING_LENGTH10000Cadeia mais longa em values, incluindo uma linha de log

Notificações

As duas chaves por definir significam que a funcionalidade não existe: sem botão num espaço, e nada guardado sobre ninguém. Não há nada para registar na Apple nem na Google — quem fez o navegador é quem opera o serviço de push. Gere um par uma vez e não o rode; as subscrições existentes estão presas a ele e os navegadores não são avisados.

VariávelPredefiniçãoO que faz
VAPID_PUBLIC_KEY—A metade pública do par que assina cada push. Entregue ao navegador quando este subscreve.
VAPID_PRIVATE_KEY—A metade privada. Nunca sai do servidor.
VAPID_SUBJECThttps://github.com/progress-watch/progresswatchUm endereço de contacto a que os serviços de push podem chegar se algo correr mal. Ninguém o verifica.
PUSH_CONTENTfullfull põe o título da tarefa na notificação, minimal envia «Task completed» e nada identificável.
PUSH_RELAYhttps://progress.watchPara onde é enviada uma notificação para a app iOS para ser assinada e entregue à Apple: só quem publica a app tem a chave que a Apple pede, por isso um servidor auto-alojado não a consegue entregar sozinho. O relay vê o dispositivo e o texto da notificação, nunca um UUID de espaço, e nada é enviado até alguém ativar as notificações na app. PUSH_CONTENT=minimal deixa de fora os títulos das tarefas. false desliga-o, e a app deixa então de oferecer notificações neste servidor.

Dimensionar os processos

VariávelPredefiniçãoO que faz
RAILS_MAX_THREADS5Threads do Puma por processo, e o tamanho tanto do conjunto de ligações à base de dados como ao Redis.
WEB_CONCURRENCY0Processos worker do Puma. Zero corre um único processo, que é a resposta certa numa máquina pequena.
SIDEKIQ_CONCURRENCY5Threads no processo do Sidekiq. Enviar notificações é o único trabalho que existe.