Configurar Progress Watch con variables de entorno

Todo es una variable de entorno. No hay archivos de configuración que editar ni credenciales cifradas metidas en la imagen, así que el mismo contenedor corre en un NAS de casa y en la nube.

General

VariablePor defectoQué hace
SECRET_KEY_BASE/data/progresswatch/progresswatch.envSe genera en el primer arranque y se guarda en el volumen, así que déjala sin definir. Defínela tú donde no haya volumen o donde varios contenedores tengan que compartirla.
DATABASE_URLsqlite3:/data/progresswatch/db.sqlite3Dónde viven los espacios y la estructura de las tareas. El archivo por defecto es lo que guarda el volumen de Docker; apúntala a postgresql://… para un despliegue en la nube. El progreso en sí nunca se escribe aquí.
FORCE_SSLfalsePonla a true cuando algo delante termine el TLS. También controla assume_ssl, así que dejarla apagada mantiene la aplicación usable por HTTP simple en vez de redirigir a un certificado que no tienes.
PORT3000El puerto al que Puma se enlaza dentro del contenedor. docker-compose.yml lo publica en el 7979, porque un servicio que dejas corriendo durante semanas no debería ocupar el puerto que quieren tus propios servidores de desarrollo.
RAILS_LOG_LEVELinfoLos logs van a stdout y a ningún otro sitio. Esto es cuánto de ellos.
RATE_LIMIT_PER_HOUR—Cuántos espacios y tareas puede crear una dirección por hora. Sin poner significa sin límite, que es la respuesta correcta para un servidor al que solo llegas tú. Reportar progreso nunca se limita.

Detrás de un proxy, RATE_LIMIT_PER_HOUR vale tanto como la dirección que ve la aplicación. Rails lee X-Forwarded-For y se fía de él desde rangos privados, que es lo que envía un proxy inverso en el mismo host; pero si la cabecera no llega, cada petición parece un solo cliente y el límite deja fuera a todos a la vez en lugar de a nadie.

Redis

Redis guarda dos cosas sin relación: el progreso actual de cada tarea y la cola de Sidekiq. Por defecto son dos bases de datos lógicas de un mismo servidor, y cualquiera de las dos puede moverse a su propia instancia.

VariablePor defectoQué hace
REDIS_URL—El servidor usado para ambos papeles, repartido en db 0 para el progreso y db 1 para la cola. Sin definir, la imagen ejecuta su propio Redis dentro del contenedor y guarda instantáneas en el volumen.
PROGRESS_REDIS_URLREDIS_URL, db 0Sustituye solo el almacén de progreso.
SIDEKIQ_REDIS_URLREDIS_URL, db 1Sustituye solo la cola.
PROGRESS_TTL_SECONDS86400Cuánto conserva una tarea su progreso sin que se escriba en ella. Cada reporte lo refresca, así que esto es en realidad cuánto tiempo sigue en pantalla una tarea abandonada.
PROGRESS_KEY_PREFIXpw:progressPrefijo de clave del almacén de progreso, para que pueda compartir base de datos con otra cosa.

Límites

El texto que pasa de un límite se recorta a él, con puntos suspensivos como último carácter. Un objeto values con más claves, o con una clave más larga, se rechaza con 400. Estos valores por defecto son para un servidor propio; progress.watch mantiene cada uno más bajo.

VariablePor defectoQué hace
MAX_TASK_TITLE_LENGTH500Título de tarea más largo que se guarda, en caracteres
MAX_TASK_SOURCE_LENGTH200Origen de tarea más largo que se guarda
MAX_SPACE_TITLE_LENGTH200Nombre de espacio más largo que se guarda
MAX_VALUES_KEY_COUNT50Máximo de claves en los values de un informe
MAX_VALUES_KEY_LENGTH100Clave más larga en values
MAX_VALUES_STRING_LENGTH10000Cadena más larga en values, incluida una línea de log

Notificaciones

Las dos claves sin poner significa que la función no existe: ni botón en un espacio, ni nada guardado sobre nadie. No hay nada que registrar con Apple ni con Google: quien hizo el navegador opera el servicio de push. Genera un par una vez y no lo rotes; las suscripciones existentes están atadas a él y a los navegadores no se les avisa.

VariablePor defectoQué hace
VAPID_PUBLIC_KEY—La mitad pública del par que firma cada push. Se le entrega al navegador cuando se suscribe.
VAPID_PRIVATE_KEY—La mitad privada. No sale nunca del servidor.
VAPID_SUBJECThttps://github.com/progress-watch/progresswatchUna dirección de contacto a la que los servicios de push pueden acudir si algo va mal. Nadie la verifica.
PUSH_CONTENTfullfull pone el título de la tarea en la notificación, minimal envía «Task completed» y nada identificativo.
PUSH_RELAYhttps://progress.watchAdónde se envía una notificación para la app de iOS para que se firme y se entregue a Apple: solo quien publica la app tiene la clave que pide Apple, así que un servidor autoalojado no puede entregarla por sí mismo. El relay ve el dispositivo y el texto de la notificación, nunca un UUID de espacio, y no se envía nada hasta que alguien activa las notificaciones en la app. PUSH_CONTENT=minimal deja fuera los títulos de las tareas. false lo desactiva, y entonces la app no ofrece notificaciones en este servidor.

Dimensionar los procesos

VariablePor defectoQué hace
RAILS_MAX_THREADS5Hilos de Puma por proceso, y el tamaño tanto del pool de conexiones a la base de datos como del de Redis.
WEB_CONCURRENCY0Procesos worker de Puma. Cero ejecuta un solo proceso, que es la respuesta correcta en una máquina pequeña.
SIDEKIQ_CONCURRENCY5Hilos del proceso Sidekiq. Enviar notificaciones es el único trabajo que hay.