Tovább a tartalomhoz

Docker

Az ElyOS teljes mértékben támogatja a Docker-alapú fejlesztést és üzemeltetést. Ez a dokumentum részletesen bemutatja, hogyan használható a Docker az ElyOS-szel.

A Docker használata számos előnnyel jár:

  • Konzisztens környezet — minden fejlesztő és szerver ugyanazt a környezetet használja
  • Egyszerű telepítés — nincs szükség Node.js, Bun vagy PostgreSQL helyi telepítésére
  • Izolált szolgáltatások — az adatbázis és az alkalmazás külön konténerekben fut
  • Gyors indítás — egyetlen paranccsal elindítható a teljes rendszer
  • Reprodukálható build — a Docker image mindig ugyanúgy épül fel

Telepítsd a Docker-t a rendszeredre:

A Bun telepítése nem kötelező, de megkönnyíti a Docker parancsok futtatását:

Terminál
curl -fsSL https://bun.sh/install | bash

Bun nélkül is használható a Docker, csak a nyers docker compose parancsokat kell futtatni.

Terminál
git clone https://github.com/ElyOS-webOS/elyos-core
cd elyos-core

2. Környezeti változók konfigurálása

Szekció neve “2. Környezeti változók konfigurálása”

Másold le a példafájlt és töltsd ki az értékeket:

Terminál
cp .env.example .env

Varlock + Infisical használatával (ajánlott):

.env
INFISICAL_CLIENT_ID=your-machine-identity-client-id
INFISICAL_CLIENT_SECRET=your-machine-identity-client-secret

Infisical nélkül (lokális fallback mód):

.env
VARLOCK_FALLBACK=local
# ... töltsd ki az összes változót a .env.example alapján

Bun segítségével:

Terminál
bun docker:up

Bun nélkül:

Terminál
docker compose -f docker/docker-compose.yml up -d

Nyisd meg a böngészőben: http://localhost:3000

A docker/docker-compose.yml fájl három szolgáltatást definiál, amelyek sorban indulnak:

PostgreSQL 18 adatbázis egyedi image-dzsel, amely tartalmazza a postgres-json-schema extensiont.

postgres:
build:
context: postgres
dockerfile: Dockerfile
ports:
- '${POSTGRES_PORT:-5432}:5432'
volumes:
- elyos-data:/var/lib/postgresql
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-elyos} -d ${POSTGRES_DB:-elyos}']
interval: 10s
timeout: 5s
retries: 5

Jellemzők:

  • Port: 5432 (konfigurálható: POSTGRES_PORT)
  • Perzisztens adattárolás: elyos-data volume
  • Health check: 10 másodpercenként ellenőrzi az adatbázis elérhetőségét
  • Automatikus újraindítás: unless-stopped

Egyszeri inicializálás: Drizzle migrációk futtatása és seed adatok betöltése.

db-init:
command: >
sh -c 'bun --filter @elyos/database db:init ${RESET:+-- --reset}'
depends_on:
postgres:
condition: service_healthy
restart: 'no'

Jellemzők:

  • Csak akkor indul, ha a postgres szolgáltatás egészséges
  • Futtatja a bun db:init parancsot
  • Egyszeri futás: restart: no
  • Támogatja a RESET=1 környezeti változót az adatbázis teljes visszaállításához

Az ElyOS webalkalmazás (SvelteKit + Express + Socket.IO).

elyos:
ports:
- '${ELYOS_PORT:-3000}:3000'
depends_on:
db-init:
condition: service_completed_successfully
volumes:
- ../apps/web/uploads:/app/uploads
restart: unless-stopped

Jellemzők:

  • Port: 3000 (konfigurálható: ELYOS_PORT)
  • Csak akkor indul, ha a db-init sikeresen lefutott
  • Perzisztens fájltárolás: uploads mappa
  • Automatikus újraindítás: unless-stopped
  • Health check: 30 másodpercenként ellenőrzi az /api/health végpontot

A szolgáltatások sorban indulnak, biztosítva a megfelelő függőségeket:

1. postgres (indul)
2. postgres (healthy)
3. db-init (indul és lefut)
4. db-init (completed successfully)
5. elyos (indul)

A db-init konténer idempotens — biztonságosan futtatható többször is, nem duplikál adatokat (upsert logika).

Terminál
bun docker:up

Ha teljes adatbázis-visszaállításra van szükség (minden adat törlése és újraseedelés):

Terminál
RESET=1 bun docker:up

Ez ugyanazt a db-init konténert futtatja, de truncate-eli az összes táblát a seed előtt.

Bun nélkül:

Terminál
RESET=1 docker compose -f docker/docker-compose.yml up -d

A Docker-alapú fejlesztés támogatja a hot reload-ot volume mount segítségével. Ehhez módosítsd a docker-compose.yml fájlt:

elyos:
volumes:
- ../apps/web:/app/apps/web
- ../packages:/app/packages
command: bun run app:dev

Ha csak az adatbázist szeretnéd Docker-ben futtatni, és az alkalmazást lokálisan:

Terminál
bun docker:db

Ez csak a postgres szolgáltatást indítja el.

Bun nélkül:

Terminál
docker compose -f docker/docker-compose.yml up -d postgres
Terminál
# Konténerek indítása (háttérben)
bun docker:up
# vagy
docker compose -f docker/docker-compose.yml up -d
# Konténerek leállítása
bun docker:down
# vagy
docker compose -f docker/docker-compose.yml down
# Konténer naplók követése
bun docker:logs
# vagy
docker compose -f docker/docker-compose.yml logs -f
# Csak PostgreSQL indítása
bun docker:db
# vagy
docker compose -f docker/docker-compose.yml up -d postgres
Terminál
# Futó konténerek listázása
docker ps
# Összes konténer listázása (leállítottak is)
docker ps -a
# Konténer naplók megtekintése
docker logs elyos-app
docker logs elyos-postgres
docker logs elyos-db-init
Terminál
# ElyOS konténerbe belépés
docker exec -it elyos-app sh
# PostgreSQL konténerbe belépés
docker exec -it elyos-postgres psql -U elyos -d elyos
Terminál
# Konténerek és hálózat törlése
docker compose -f docker/docker-compose.yml down
# Konténerek, hálózat és volume-ok törlése (adatbázis adatok is)
docker compose -f docker/docker-compose.yml down -v
# Image-ek törlése
docker rmi elyos-elyos elyos-postgres

A docker/Dockerfile egy optimalizált multi-stage build-et használ három fázissal:

FROM oven/bun:1 AS deps
WORKDIR /app
COPY package.json bun.lock ./
COPY apps/web/package.json ./apps/web/
# ... workspace package.json fájlok
RUN bun install --frozen-lockfile

Jellemzők:

  • Csak a package.json és bun.lock fájlokat másolja
  • Cache-elhető réteg — ha a függőségek nem változnak, ez a réteg cache-ből jön
  • Frozen lockfile — reprodukálható build
FROM oven/bun:1 AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY apps/web ./apps/web
COPY packages/database ./packages/database
# ... forráskód másolása
ENV NODE_ENV=production
RUN bun run app:build

Jellemzők:

  • Függőségek másolása a deps fázisból
  • Forráskód másolása
  • SvelteKit build futtatása (adapter-node kimenet)
FROM oven/bun:1-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \
adduser -S elyos -u 1001 -G nodejs
COPY --from=builder --chown=elyos:nodejs /app/apps/web/build ./apps/web/build
RUN bun install --production --frozen-lockfile
RUN bun add -g varlock
USER elyos
CMD ["varlock", "run", "--", "bun", "run", "apps/web/server.js"]

Jellemzők:

  • Alpine Linux alapú image — minimális méret
  • Nem-root felhasználó — biztonság
  • Csak production függőségek
  • Varlock globális telepítése — secrets management
  • Health check — /api/health végpont ellenőrzése
Terminál
docker build -f docker/Dockerfile -t elyos/core:latest .
Terminál
docker build \
-f docker/Dockerfile \
-t elyos/core:latest \
--build-arg NODE_ENV=production \
.
Terminál
docker buildx build \
-f docker/Dockerfile \
-t elyos/core:latest \
--platform linux/amd64,linux/arm64 \
.

A Docker Compose automatikusan betölti a gyökér .env fájlt. Az alábbi változók konfigurálhatók:

VáltozóAlapértelmezettLeírás
ELYOS_PORT3000ElyOS alkalmazás portja
POSTGRES_PORT5432PostgreSQL portja
POSTGRES_USERelyosPostgreSQL felhasználónév
POSTGRES_PASSWORDelyos123PostgreSQL jelszó
POSTGRES_DBelyosPostgreSQL adatbázis neve
INFISICAL_CLIENT_ID-Infisical Machine Identity Client ID
INFISICAL_CLIENT_SECRET-Infisical Machine Identity Client Secret
VARLOCK_FALLBACK-Varlock fallback mód (local)
RESET-Adatbázis reset (1 = teljes reset)

Probléma: A konténer azonnal leáll indítás után.

Megoldás:

  1. Ellenőrizd a naplókat:

    Terminál
    docker logs elyos-app
  2. Ellenőrizd a környezeti változókat:

    Terminál
    docker exec elyos-app env
  3. Ellenőrizd a health check-et:

    Terminál
    docker inspect elyos-app | grep -A 10 Health

Probléma: ECONNREFUSED vagy Connection refused hiba.

Megoldás:

  1. Ellenőrizd, hogy a postgres konténer fut-e:

    Terminál
    docker ps | grep postgres
  2. Ellenőrizd a DATABASE_URL környezeti változót:

    Terminál
    # Helyes formátum:
    postgresql://elyos:elyos123@postgres:5432/elyos
  3. Várj, amíg a postgres konténer egészséges lesz:

    Terminál
    docker compose -f docker/docker-compose.yml ps

Probléma: Bind for 0.0.0.0:3000 failed: port is already allocated.

Megoldás:

  1. Változtasd meg a portot a .env fájlban:

    Terminál
    ELYOS_PORT=3001
  2. Vagy állítsd le a másik szolgáltatást:

    Terminál
    lsof -ti:3000 | xargs kill -9

Probléma: Permission denied hiba a uploads mappában.

Megoldás:

  1. Ellenőrizd a mappa jogosultságait:

    Terminál
    ls -la apps/web/uploads
  2. Állítsd be a megfelelő jogosultságokat:

    Terminál
    chmod -R 755 apps/web/uploads

Probléma: failed to solve: failed to compute cache key hiba.

Megoldás:

  1. Töröld a Docker cache-t:

    Terminál
    docker builder prune -a
  2. Build újra:

    Terminál
    docker build -f docker/Dockerfile -t elyos/core:latest .

Probléma: Varlock failed to fetch secrets hiba.

Megoldás:

  1. Ellenőrizd az Infisical credentials-t:

    Terminál
    echo $INFISICAL_CLIENT_ID
    echo $INFISICAL_CLIENT_SECRET
  2. Vagy használd a lokális fallback módot:

    Terminál
    VARLOCK_FALLBACK=local bun docker:up