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
| Variable | Por defecto | Qué hace |
|---|---|---|
SECRET_KEY_BASE | /data/progresswatch/progresswatch.env | Se 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_URL | sqlite3:/data/progresswatch/db.sqlite3 | Dó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_SSL | false | Ponla 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. |
PORT | 3000 | El 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_LEVEL | info | Los 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.
| Variable | Por defecto | Qué 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_URL | REDIS_URL, db 0 | Sustituye solo el almacén de progreso. |
SIDEKIQ_REDIS_URL | REDIS_URL, db 1 | Sustituye solo la cola. |
PROGRESS_TTL_SECONDS | 86400 | Cuá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_PREFIX | pw:progress | Prefijo 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.
| Variable | Por defecto | Qué hace |
|---|---|---|
MAX_TASK_TITLE_LENGTH | 500 | Título de tarea más largo que se guarda, en caracteres |
MAX_TASK_SOURCE_LENGTH | 200 | Origen de tarea más largo que se guarda |
MAX_SPACE_TITLE_LENGTH | 200 | Nombre de espacio más largo que se guarda |
MAX_VALUES_KEY_COUNT | 50 | Máximo de claves en los values de un informe |
MAX_VALUES_KEY_LENGTH | 100 | Clave más larga en values |
MAX_VALUES_STRING_LENGTH | 10000 | Cadena 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.
| Variable | Por defecto | Qué 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_SUBJECT | https://github.com/progress-watch/progresswatch | Una dirección de contacto a la que los servicios de push pueden acudir si algo va mal. Nadie la verifica. |
PUSH_CONTENT | full | full pone el título de la tarea en la notificación, minimal envía «Task completed» y nada identificativo. |
PUSH_RELAY | https://progress.watch | Adó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
| Variable | Por defecto | Qué hace |
|---|---|---|
RAILS_MAX_THREADS | 5 | Hilos de Puma por proceso, y el tamaño tanto del pool de conexiones a la base de datos como del de Redis. |
WEB_CONCURRENCY | 0 | Procesos worker de Puma. Cero ejecuta un solo proceso, que es la respuesta correcta en una máquina pequeña. |
SIDEKIQ_CONCURRENCY | 5 | Hilos del proceso Sidekiq. Enviar notificaciones es el único trabajo que hay. |