Instalace přes Docker Compose

Provoz přes Docker Compose je doporučený, nejrychlejší a nejstabilnější způsob nasazení LockMyCal na vlastním virtuálním nebo dedikovaném serveru (VPS).

Important

LockMyCal zatím nemá veřejně publikovaný Docker image – image si sestavíte sami ze zdrojového kódu. Docker Compose to udělá automaticky přímo z repozitáře (github.com/lockmycal/lockmycal, veřejný repozitář se připravuje).


Systémové požadavky

  • OS: Linux (Ubuntu 22.04+, Debian 12+, Rocky Linux nebo macOS)
  • Docker: Engine 24.0+ a Docker Compose v2+
  • Hardware: Minimálně 1 GB RAM (doporučeno 2 GB) a 1 vCPU
  • Doména / DNS: Nastavený A/AAAA záznam směřující na vaši veřejnou IP adresu (např. calendar.vasedomena.cz)

1. Příprava adresáře a konfigurace .env

Vytvořte adresář pro LockMyCal a připravte konfigurační soubor .env:

mkdir -p /opt/lockmycal && cd /opt/lockmycal

Vygenerujte bezpečné klíče:

# Vygenerování klíče pro webové sessions (64 znaků)
openssl rand -base64 64 | tr -d '\n'

# Vygenerování klíče pro šifrování OAuth tokenů ke kalendářům (48 znaků)
openssl rand -base64 48 | tr -d '\n'

Vytvořte soubor .env:

# ==========================================
# POVINNÉ BEZPEČNOSTNÍ NASTAVENÍ
# ==========================================
SECRET_KEY_BASE=vlozte_vygenerovany_64_znakovy_klic
DATA_ENCRYPTION_KEY=vlozte_vygenerovany_48_znakovy_klic
PHX_HOST=calendar.vasedomena.cz

# ==========================================
# DATABÁZOVÉ NASTAVENÍ (PostgreSQL)
# ==========================================
POSTGRES_USER=lockmycal
POSTGRES_PASSWORD=zvolte_silne_databazove_heslo   # povinné
POSTGRES_DB=lockmycal_prod
DATABASE_URL=postgres://lockmycal:zvolte_silne_databazove_heslo@db:5432/lockmycal_prod

# ==========================================
# APLIKAČNÍ NASTAVENÍ
# ==========================================
APP_NAME="LockMyCal"
PORT=4000
LISTEN_IP=0.0.0.0
REGISTRATION_ENABLED=true

# ==========================================
# E-MAILOVÉ NOTIFIKACE (SMTP)
# ==========================================
EMAIL_ADAPTER=smtp
EMAIL_FROM_ADDRESS="rezervace@vasedomena.cz"
EMAIL_FROM_NAME="LockMyCal Rezervace"
SMTP_HOST=smtp.vasedomena.cz
SMTP_PORT=587
SMTP_USERNAME=rezervace@vasedomena.cz
SMTP_PASSWORD=smtp_heslo

2. Vytvoření souboru docker-compose.yml

Vytvořte ve stejné složce soubor docker-compose.yml:

services:
  app:
    build:
      # Docker si repozitář stáhne sám; za # je větev nebo tag verze
      context: https://github.com/lockmycal/lockmycal.git#${LOCKMYCAL_VERSION:-main}
      dockerfile: Dockerfile.docker
    image: lockmycal:${LOCKMYCAL_VERSION:-main}
    container_name: lockmycal-app
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "127.0.0.1:4000:4000"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - app_data:/app/data

  db:
    image: postgres:17-alpine
    container_name: lockmycal-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-lockmycal}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB:-lockmycal_prod}
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-lockmycal} -d ${POSTGRES_DB:-lockmycal_prod}"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  pgdata:
  app_data:

3. Spuštění a inicializace

Spusťte kontejnery:

docker compose up -d --build

Note

Hodnoty v .env se čtou doslova – ${VAR} ani $(příkaz) se nerozbalí. Proměnné lze uložit i do souboru /app/data/.env ve svazku aplikace, který aplikace načte při startu (databázové klíče POSTGRES_USER, POSTGRES_DB, DATABASE_URL, DATABASE_HOST a DATABASE_PORT se z něj nečtou).

Sledujte start a proběhnutí migrací:

docker compose logs -f app

Important

První registrace Administrátora: První uživatel, který se po startu zaregistruje v prázdné databázi přes webové rozhraní, se automaticky stává hlavním administrátorem. Jakmile je vytvořen alespoň jeden účet, tato automatická brána se trvale uzavře.


4. Správa administrátora přes CLI / RPC

Pokud potřebujete povýšit existujícího uživatele na administrátora dodatečně, spusťte:

docker compose exec app bin/tymeslot rpc 'Tymeslot.Release.promote_admin("uzivatel@vasedomena.cz")'

Pro odebrání administrátorských práv:

docker compose exec app bin/tymeslot rpc 'Tymeslot.Release.demote_admin("uzivatel@vasedomena.cz")'

5. Konfigurace reverzní proxy (Nginx)

Pro zajištění HTTPS a SSL certifikátů (např. přes Let's Encrypt / Certbot) přidejte konfiguraci do Nginxu:

server {
    listen 80;
    server_name calendar.vasedomena.cz;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name calendar.vasedomena.cz;

    ssl_certificate /etc/letsencrypt/live/calendar.vasedomena.cz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/calendar.vasedomena.cz/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}