Instalación y Despliegue

Despliega OpenJornada en tu propia infraestructura en minutos.

1. Requisitos previos

Software necesario

  • Docker 20.10+ y Docker Compose v2+
  • Git para clonar repositorios
  • Opcionalmente: Docker Swarm para producción

Recursos mínimos

ComponenteDesarrolloProducción
CPU2 cores4+ cores
RAM4 GB8+ GB
Disco20 GB50+ GB

2. Arquitectura del sistema

OpenJornada está compuesto por los siguientes servicios:

API (FastAPI)

Backend REST API con Python

ghcr.io/openjornada/openjornada-api

Admin (Next.js)

Panel de administración

ghcr.io/openjornada/openjornada-admin

Webapp (React + Vite)

Aplicación para trabajadores

ghcr.io/openjornada/openjornada-trabajadores

MongoDB

Base de datos

mongo:7-jammy
┌─────────────────────────────────────────────────┐
│                   INTERNET                      │
└─────────────────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────┐
│              Caddy (Reverse Proxy)              │
│         SSL automático + Load Balancing         │
└─────────────────────────────────────────────────┘
        │               │               │
        ▼               ▼               ▼
┌───────────┐   ┌───────────┐   ┌───────────┐
│   Admin   │   │  Webapp   │   │    API    │
│  :3000    │   │   :80     │   │   :8000   │
└───────────┘   └───────────┘   └───────────┘
                                        │
                                        ▼
                              ┌───────────────┐
                              │    MongoDB    │
                              │    :27017     │
                              └───────────────┘

3. Docker Compose (desarrollo)

Inicio rápido

# Clonar repositorio
git clone https://github.com/openjornada/openjornada-api.git
cd openjornada-api

# Configurar variables
cp .env.example .env
# Editar .env con tu configuración

# Iniciar servicios
docker-compose up -d

# Ver logs
docker-compose logs -f

docker-compose.yml básico

version: '3.8'

services:
  mongodb:
    image: mongo:7-jammy
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: changeme123
    volumes:
      - mongodb_data:/data/db
    ports:
      - "27017:27017"

  api:
    image: ghcr.io/openjornada/openjornada-api:latest
    environment:
      - MONGODB_URL=mongodb://admin:changeme123@mongodb:27017
      - SECRET_KEY=your-secret-key-here
    ports:
      - "8000:8000"
    depends_on:
      - mongodb

  admin:
    image: ghcr.io/openjornada/openjornada-admin:latest
    environment:
      - NEXT_PUBLIC_API_URL=http://localhost:8000
    ports:
      - "3001:3000"

  webapp:
    image: ghcr.io/openjornada/openjornada-trabajadores:latest
    environment:
      - VITE_API_URL=http://localhost:8000
      - VITE_API_USERNAME=admin
      - VITE_API_PASSWORD=your-password
    ports:
      - "5173:80"

volumes:
  mongodb_data:

4. Docker Swarm (producción)

Inicializar Swarm

# Inicializar Swarm (solo primera vez)
docker swarm init

# Crear red overlay
docker network create --driver overlay --attachable frontend

# Desplegar stack
docker stack deploy -c docker-compose.swarm.yml openjornada

# Ver servicios
docker stack services openjornada

# Ver logs de un servicio
docker service logs openjornada_api -f

Actualizar servicios

# Actualizar imagen de un servicio
docker service update --image ghcr.io/openjornada/openjornada-api:1.0.5 openjornada_api

# Forzar actualización
docker service update --force openjornada_api

# Rollback si hay problemas
docker service rollback openjornada_api

Alta disponibilidad

Para alta disponibilidad, usa múltiples réplicas de los servicios web. MongoDB requiere configuración de replica set para HA.

5. Variables de entorno

API (openjornada-api)

VariableDescripciónEjemplo
MONGODB_URLURL de conexión MongoDBmongodb://user:pass@host:27017
SECRET_KEYClave para JWT (mín 32 chars)your-secret-key-min-32-characters
SMTP_HOSTServidor SMTPsmtp.gmail.com
SMTP_PORTPuerto SMTP587
SMTP_USERUsuario SMTPnoreply@empresa.com
SMTP_PASSWORDContraseña SMTPapp-password

Admin Panel

VariableDescripción
NEXT_PUBLIC_API_URLURL de la API
NEXT_PUBLIC_APP_NAMENombre de la aplicación
NEXT_PUBLIC_APP_LOGORuta del logo

Webapp (Trabajadores)

VariableDescripción
VITE_API_URLURL de la API
VITE_API_USERNAMEUsuario API para auth JWT
VITE_API_PASSWORDContraseña API para auth JWT
VITE_APP_NAMENombre de la app

6. Configuración SSL

Usamos Caddy como reverse proxy. Obtiene certificados SSL automáticamente de Let's Encrypt.

Caddyfile de ejemplo

# Dominio principal
app.tuempresa.com {
    # Admin panel
    handle /admin* {
        reverse_proxy admin:3000
    }

    # API
    handle /api* {
        reverse_proxy api:8000
    }

    # Webapp (default)
    handle {
        reverse_proxy webapp:80
    }
}

# Redirect www a non-www
www.tuempresa.com {
    redir https://app.tuempresa.com{uri} permanent
}

SSL Automático

Caddy obtiene y renueva certificados SSL automáticamente. Solo asegúrate de que tu dominio apunte a la IP del servidor.

7. MongoDB

Configuración recomendada

# docker-compose.yml
mongodb:
  image: mongo:7-jammy
  environment:
    MONGO_INITDB_ROOT_USERNAME: admin
    MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
    MONGO_INITDB_DATABASE: openjornada
  volumes:
    - mongodb_data:/data/db
    - mongodb_config:/data/configdb
  deploy:
    placement:
      constraints:
        - node.role == manager

Conexión desde CLI

# Conectar a MongoDB
docker exec -it openjornada_mongodb mongosh

# Autenticar
use admin
db.auth("admin", "password")

# Ver bases de datos
show dbs

# Usar base de datos
use openjornada

# Ver colecciones
show collections

8. Crear primer usuario

Después de desplegar, crea el primer usuario administrador usando el CLI de la API.

Crear usuario admin

# Acceder al contenedor de la API
docker exec -it openjornada_api bash

# Crear usuario administrador
python -m api.manage_api_users create admin admin@empresa.com admin

# Se te pedirá una contraseña

# Verificar que se creó
python -m api.manage_api_users list

Otros comandos útiles

# Ver usuarios
python -m api.manage_api_users list

# Cambiar contraseña
python -m api.manage_api_users password admin

# Cambiar rol
python -m api.manage_api_users role admin tracker

# Activar/desactivar usuario
python -m api.manage_api_users toggle admin

Siguiente paso

Una vez creado el usuario admin, accede al panel de administración y crea tu primera empresa y trabajadores.