Installation & Deployment

Deploy OpenJornada on your own infrastructure in minutes.

1. Prerequisites

Required software

  • Docker 20.10+ y Docker Compose v2+
  • Git para clonar repositorios
  • Opcionalmente: Docker Swarm para produccion

Minimum resources

ComponentDevelopmentProduction
CPU2 cores4+ cores
RAM4 GB8+ GB
Disco20 GB50+ GB

2. System architecture

OpenJornada is composed of the following services:

API (FastAPI)

Backend REST API with Python

ghcr.io/openjornada/openjornada-api

Admin (Next.js)

Administration panel

ghcr.io/openjornada/openjornada-admin

Webapp (React + Vite)

Employee application

ghcr.io/openjornada/openjornada-trabajadores

MongoDB

Database

mongo:7-jammy
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│                   INTERNET                      │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
                        │
                        ā–¼
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│              Caddy (Reverse Proxy)              │
│         SSL automatico + Load Balancing         │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
        │               │               │
        ā–¼               ā–¼               ā–¼
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”   ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”   ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│   Admin   │   │  Webapp   │   │    API    │
│  :3000    │   │   :80     │   │   :8000   │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜   ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜   ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
                                        │
                                        ā–¼
                              ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
                              │    MongoDB    │
                              │    :27017     │
                              ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜

3. Docker Compose (development)

Quick start

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

# Configurar variables
cp .env.example .env
# Editar .env con tu configuracion

# Iniciar servicios
docker-compose up -d

# Ver logs
docker-compose logs -f

Basic docker-compose.yml

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 (production)

Initialize 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

Update services

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

# Forzar actualizacion
docker service update --force openjornada_api

# Rollback si hay problemas
docker service rollback openjornada_api

Alta disponibilidad

For high availability, use multiple replicas of web services. MongoDB requires a replica set configuration for HA.

5. Environment variables

API (openjornada-api)

VariableDescriptionExample
MONGODB_URLURL de conexion MongoDBmongodb://user:pass@host:27017
SECRET_KEYClave para JWT (min 32 chars)your-secret-key-min-32-characters
SMTP_HOSTServidor SMTPsmtp.gmail.com
SMTP_PORTPuerto SMTP587
SMTP_USERUsuario SMTPnoreply@empresa.com
SMTP_PASSWORDContrasena SMTPapp-password

Admin Panel

VariableDescription
NEXT_PUBLIC_API_URLURL de la API
NEXT_PUBLIC_APP_NAMENombre de la aplicacion
NEXT_PUBLIC_APP_LOGORuta del logo

Webapp (Employees)

VariableDescription
VITE_API_URLURL de la API
VITE_API_USERNAMEUsuario API para auth JWT
VITE_API_PASSWORDContrasena API para auth JWT
VITE_APP_NAMENombre de la app

6. SSL configuration

We use Caddy as a reverse proxy. It automatically obtains SSL certificates from Let's Encrypt.

Example Caddyfile

# 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 Automatico

Caddy automatically obtains and renews SSL certificates. Just make sure your domain points to the server's IP.

7. MongoDB

Recommended configuration

# 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

CLI connection

# 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. Create first user

After deployment, create the first administrator user using the API CLI.

Create admin user

# 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 pedira una contrasena

# Verificar que se creo
python -m api.manage_api_users list

Other useful commands

# Ver usuarios
python -m api.manage_api_users list

# Cambiar contrasena
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

Once the admin user is created, access the administration panel and create your first company and employees.

Install OpenJornada - Docker, Kubernetes & Self-Hosted