Saltar al contenido principal

Instalación

Necesitas tener Docker instalado en tu máquina.

Renfe Tracker se distribuye como imagen Docker. La forma recomendada de ejecutarlo es con Docker Compose, aunque también se admiten docker run y el desarrollo local sin Docker.


Opción 1 — Docker Compose (recomendado)

Docker Compose es la opción más sencilla para un despliegue permanente y siempre activo. El archivo compose gestiona los volúmenes, los reinicios automáticos y la configuración de variables de entorno en un solo lugar.

1. Obtener el archivo compose

curl -o docker-compose.yml https://raw.githubusercontent.com/JavierMonton/renfe-tracker/main/docker-compose.example.yml

2. (Opcional) Configurar variables de entorno

Abre docker-compose.yml y descomenta / rellena las opciones que necesites:

services:
app:
image: jmonton/renfe-tracker:latest
ports:
- "${PORT:-8000}:8000"
environment:
DATA_DIR: /data

# ── Alertas por correo ────────────────────────────────
# SMTP_HOST: smtp.example.com
# SMTP_PORT: 587
# SMTP_USERNAME: alerts@example.com
# SMTP_PASSWORD: your-smtp-password

# ── Alertas de Home Assistant ────────────────────────
# HA_URL: http://homeassistant.local:8123
# HA_TOKEN: your-long-lived-access-token

volumes:
- ./data:/data
restart: unless-stopped

3. Iniciar

docker compose up -d

Abre http://localhost:8000. Para usar un puerto diferente, establece PORT en un archivo .env o de forma directa:

PORT=9000 docker compose up -d

4. Detener / actualizar

# Detener
docker compose down

# Obtener la última imagen y reiniciar
docker compose pull
docker compose up -d

Los datos en ./data nunca se modifican con estos comandos.


Opción 2 — docker run

Usa esta opción si prefieres gestionar el contenedor manualmente o integrarlo en una configuración existente.

Ejecutar el contenedor

docker run -d \
--name renfe-tracker \
--restart unless-stopped \
-p 8000:8000 \
-v "$(pwd)/data:/data" \
jmonton/renfe-tracker:latest

Con variables de entorno para correo electrónico y Home Assistant:

docker run -d \
--name renfe-tracker \
--restart unless-stopped \
-p 8000:8000 \
-v "$(pwd)/data:/data" \
-e SMTP_HOST=smtp.example.com \
-e SMTP_PORT=587 \
-e SMTP_USERNAME=alerts@example.com \
-e SMTP_PASSWORD=your-password \
-e HA_URL=http://homeassistant.local:8123 \
-e HA_TOKEN=your-ha-token \
jmonton/renfe-tracker:latest

Para actualizar a una versión más reciente:

docker pull jmonton/renfe-tracker:latest
docker rm -f renfe-tracker
# vuelve a ejecutar el comando docker run anterior

Abre http://localhost:8000.


Opción 3 — Desarrollo local (sin Docker)

Útil si quieres modificar el código. Requiere uv (gestor de paquetes Python) y Node.js 18+.

Backend

# Instalar dependencias
uv sync

# Iniciar el servidor API (recarga automática al cambiar el código)
uv run uvicorn app.main:app --reload --port 8000

Frontend

En una segunda terminal:

cd frontend
npm install
npm run dev # Servidor de desarrollo Vite en http://localhost:5173
# Todas las peticiones /api se redirigen a :8000

El servidor de desarrollo Vite redirige las llamadas /api al backend FastAPI, por lo que obtienes recarga en caliente en el frontend mientras el backend gestiona los datos.

Ejecutar las pruebas

uv run pytest          # todas las pruebas (Renfe se simula, sin llamadas de red reales)
uv run pytest -v # salida detallada

Persistencia de datos

Todos los datos de la aplicación se almacenan en el directorio ./data (o donde apunte el volumen):

RutaContenido
./data/renfe_tracker.dbBase de datos SQLite (viajes, precios, notificaciones)
./data/renfe_schedule/Datos GTFS de Renfe (descargados automáticamente en la primera búsqueda)

La base de datos y los archivos GTFS sobreviven a los reinicios, reconstrucciones y actualizaciones del contenedor. Haz una copia de seguridad del directorio ./data para conservar tus viajes seguidos e historial de precios.

Propiedad de archivos

El contenedor se ejecuta como root por defecto para poder crear y escribir la base de datos al primer inicio. Si quieres que los archivos del host sean de tu usuario, establece PUID y PGID:

environment:
PUID: 1000
PGID: 1000

O después del primer inicio:

chown -R $(id -u):$(id -g) ./data