Cómo instalar Endurain en Docker - Rastreador fitness autohospedado

Self-hosted Fitness Tracking

Endurain: Servicio de seguimiento fitness autohospedado

Alternativa privada a Strava con control total de datos, integración Strava/Garmin y despliegue mediante Docker



Vídeo tutorial en YouTube

Mira el vídeo completo sobre cómo instalar y usar Endurain: Servicio de seguimiento fitness autohospedado en el canal GENBYTE:

¿Qué es Endurain: Servicio de seguimiento fitness autohospedado?

Endurain es un servicio de seguimiento de actividad física diseñado para autohospedarse, ofreciendo a los usuarios control total sobre sus datos y entorno de alojamiento. Funciona como alternativa a Strava centrada en la privacidad y la personalización. El proyecto está desarrollado en Python (FastAPI) para el backend y Vue.js 3 con TypeScript para el frontend, utilizando PostgreSQL como base de datos y Redis para caché y limitación de tasa. La distribución oficial se realiza mediante imágenes Docker y un archivo docker-compose.yml.example que define los servicios necesarios: backend, frontend, base de datos PostgreSQL, Redis y Jaeger para observabilidad. El repositorio principal se encuentra en Codeberg (https://codeberg.org/endurain-project/endurain), mientras que GitHub actúa como espejo de solo lectura. La licencia es AGPL-3.0.

Control total de datos de entrenamiento con integración nativa a Strava y Garmin Connect, importación de archivos GPX/TCX/FIT y despliegue simplificado mediante Docker Compose.

Características principales

Autohospedado y privado

Los datos permanecen en la infraestructura del usuario sin depender de servicios de terceros para el almacenamiento principal.

Integración con Strava y Garmin Connect

Sincronización automática de actividades desde Strava y Garmin Connect mediante librerías oficiales (stravalib, python-garminconnect).

Importación manual de archivos

Soporte para carga manual de actividades en formatos .gpx, .tcx y .fit usando gpxpy, tcxreader y fitdecode.

Frontend moderno

Interfaz construida con Vue.js 3, TypeScript, Tailwind CSS y componentes shadcn-vue, gestión de estado con Pinia y TanStack Query.

Backend robusto

API REST con FastAPI, ORM SQLAlchemy, migraciones Alembic, notificaciones vía Apprise y trazabilidad básica con Jaeger.

Configuración por variables de entorno

Todos los parámetros sensibles y de comportamiento se definen en un archivo .env, facilitando la personalización sin modificar código.

Soporte multiidioma

Traducción gestionada a través de Codeberg Translate, con posibilidad de contribuir nuevos idiomas.

Demostración pública

Instancia de prueba en https://demo.endurain.com (usuario: admin, contraseña: admin) que se reinicia diariamente a medianoche (zona horaria Europe/Lisbon).

Requisitos del sistema

  • Docker Engine y Docker Compose (v2 recomendado)
  • Servidor con arquitectura compatible con las imágenes oficiales (linux/amd64, linux/arm64)
  • Mínimo 2 GB de RAM recomendados para PostgreSQL, Redis y servicios de aplicación
  • Espacio en disco para persistencia de base de datos y archivos subidos (volumen LOCAL_PATH, por defecto /var/opt/endurain)
  • Dominio o subdominio con certificado TLS válido para acceso HTTPS (requerido para OAuth con Strava/Garmin)
  • Puertos 80/443 disponibles para el proxy inverso (Traefik, Nginx, Caddy u otro) que termine TLS y reenvíe al contenedor frontend/backend

Instalación con Docker Compose

Clonar el repositorio y preparar entorno

Clonar desde Codeberg (repositorio principal) y copiar el archivo de ejemplo de variables de entorno.

git clone https://codeberg.org/endurain-project/endurain.git cd endurain cp .env.example .env

Editar variables obligatorias en .env

Establecer contraseñas fuertes, clave secreta, clave Fernet, zona horaria, dominio público y activar BEHIND_PROXY=true si se usa proxy inverso. Las variables DB_PASSWORD, POSTGRES_PASSWORD, SECRET_KEY, FERNET_KEY, TZ, ENDURAIN_HOST y BEHIND_PROXY son obligatorias para arrancar.

# Ejemplo de valores mínimos a modificar en .env DB_PASSWORD=contraseña_segura POSTGRES_PASSWORD=contraseña_segura SECRET_KEY=clave_secreta_larga_aleatoria FERNET_KEY=clave_fernet_32_bytes_base64 TZ=Europe/Madrid ENDURAIN_HOST=https://endurain.tudominio.com BEHIND_PROXY=true

Levantar la pila con Docker Compose

Usar el archivo docker-compose.yml.example como base (renombrar a docker-compose.yml) y lanzar los contenedores en segundo plano.

cp docker-compose.yml.example docker-compose.yml docker compose up -d

Verificar estado de los servicios

Comprobar que todos los contenedores están healthy y revisar logs del backend para confirmar migraciones de base de datos.

docker compose ps docker compose logs -f backend

Acceder al proyecto

Acceso local tras despliegue

Una vez el proxy inverso termine TLS y reenvíe tráfico al puerto 8080 del contenedor frontend (configuración por defecto), la interfaz web estará disponible en el ENDURAIN_HOST definido en .env (ej. https://endurain.tudominio.com).

Demostración pública

Disponible en https://demo.endurain.com con credenciales admin / admin. El entorno se reinicia cada día a medianoche (Europe/Lisbon); no almacenar datos importantes.

Casos de uso

  • Deportistas que desean mantener el historial de entrenamientos en su propia infraestructura sin ceder datos a plataformas comerciales.
  • Equipos o clubes que necesitan una instancia privada para compartir actividades entre miembros con control de acceso propio.
  • Desarrolladores e investigadores que requieren una base de código abierta (AGPL-3.0) para extender funcionalidades de análisis de datos deportivos.
  • Usuarios preocupados por privacidad que prefieren sincronizar sus dispositivos Garmin o cuenta Strava a un servicio propio antes que a la nube del proveedor.

Configuración avanzada

Configuración de correo electrónico (recuperación de contraseña)

Definir variables SMTP en .env para habilitar envío de emails. Requiere host, puerto, usuario, contraseña, tipo de seguridad (starttls) y opcionalmente remitente verificado (SMTP_FROM).

SMTP_HOST=smtp.proveedor.com SMTP_PORT=587 SMTP_USERNAME=usuario@dominio.com SMTP_PASSWORD=contraseña_app SMTP_SECURE=true SMTP_SECURE_TYPE=starttls # Opcional si el proveedor exige remitente verificado distinto al usuario SMTP # SMTP_FROM=remitente@verificado.com

Permitir esquemas de redirección personalizados (OAuth móvil)

Añadir esquemas URI permitidos para el parámetro redirect en flujos OAuth iniciados desde navegador del sistema (apps móviles). Por defecto solo 'endurain'.

ALLOWED_REDIRECT_SCHEMES=endurain,gadgetbridge,miapp

Lista de permitidos SSRF para proveedores de identidad internos

Habilitar resolución de hosts privados (Authentik, Pocket ID, Keycloak, etc.) solo para descubrimiento OIDC y JWKS. Requiere hostnames exactos o rangos CIDR; no se aceptan comodines.

SSRF_ALLOWED_HOSTS=auth.interno.ejemplo.com,10.10.0.0/24,fd00::/64

Orígenes adicionales en Content-Security-Policy (connect-src)

Necesario cuando Endurain está detrás de un proxy de autenticación directa (forward-auth) que redirige llamadas API a su propio dominio para validación de sesión.

CSP_ADDITIONAL_CONNECT_SRC=https://auth.ejemplo.com

Timeouts de sesión

Activar expiración por inactividad y vida máxima absoluta de sesión. Valores en horas.

SESSION_IDLE_TIMEOUT_ENABLED=true SESSION_IDLE_TIMEOUT_HOURS=1 SESSION_ABSOLUTE_TIMEOUT_HOURS=24

Desactivar limitación de tasa (solo desarrollo)

Por defecto RATE_LIMIT_ENABLED=true. Poner a false para entornos de pruebas sin Redis o sin necesidad de rate limiting.

RATE_LIMIT_ENABLED=false

Gestión y mantenimiento

Actualizar a nueva versión

Obtener últimos cambios del repositorio principal (Codeberg), reconstruir imágenes y recrear contenedores. Las migraciones de base de datos se aplican automáticamente al arrancar el backend.

cd endurain git pull docker compose pull docker compose up -d --build

Copias de seguridad de la base de datos

Realizar dump de PostgreSQL desde el contenedor de base de datos. Almacenar en ubicación externa o volumen separado.

docker compose exec -T db pg_dump -U endurain endurain > backup_$(date +%F).sql

Restaurar base de datos desde copia

Detener backend para evitar conexiones, restaurar dump y volver a levantar servicios.

docker compose stop backend docker compose exec -T db psql -U endurain -d endurain < backup_2025-01-15.sql docker compose start backend

Consultar logs de aplicación

Revisar logs del backend, frontend, base de datos o Redis para diagnóstico.

docker compose logs -f backend # O servicio específico: docker compose logs -f frontend

Limpiar recursos Docker no utilizados

Eliminar imágenes antiguas, redes y volúmenes huérfanos tras actualizaciones frecuentes.

docker system prune -a --volumes

Stack técnico

  • Python 3.11+ (FastAPI, SQLAlchemy, Alembic, Apprise, stravalib, python-garminconnect, gpxpy, tcxreader, fitdecode)
  • Vue.js 3 con TypeScript, Tailwind CSS, shadcn-vue, Pinia, TanStack Query
  • PostgreSQL 15+ (datos principales)
  • Redis 7+ (caché, rate limiting, almacenamiento de sesiones de seguridad)
  • Jaeger (trazabilidad distribuida básica)
  • Docker / Docker Compose (despliegue y orquestación)
  • Proxy inverso externo (Traefik, Nginx, Caddy) para terminación TLS

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Comentarios

Entradas populares de este blog

Cómo Instalar y configurar SERVIDOR VPN WIREGUARD en MIKROTIK 🔐 #VPN #Wireguard #Mikrotik #RouterOS

Cómo instalar y configurar DSM SYNOLOGY 7.2.2 en PC | Guía completa, instalación, RAID 1, SMB

Cómo INSTALAR y CONFIGURAR OpenVPN en MIKROTIK. Guía completa paso a paso.