Plik saplo.yaml to manifest aplikacji Saplo. Opisuje cały deployment: stack, build, start, zmienne środowiskowe, domeny i zasoby. Musi znajdować się w głównym katalogu projektu (obok package.json, manage.py lub Dockerfile).
Wygeneruj go automatycznie przez saplo init (wizard) lub stwórz ręcznie wg poniższej dokumentacji.
Minimalna konfiguracja
Tylko trzy pola są wymagane. Reszta ma wartości domyślne per stack.
Pełna struktura
Referencja pól
version
| Typ | Wymagane | Wartości |
|---|---|---|
| integer | tak | 1 |
Wersja formatu saplo.yaml. Zawsze 1 w aktualnej wersji Saplo. Pozwala na przyszłe migracje formatu bez łamania kompatybilności wstecznej.
name
| Typ | Wymagane | Pattern |
|---|---|---|
| string | tak | ^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$ |
Slug aplikacji. Tylko małe litery, cyfry i myślniki. Maks 64 znaki. Nie może zaczynać ani kończyć się myślnikiem. Musi być unikalny w ramach konta. Slug jest używany jako nazwa subdomeny <name>.saploapp.pl.
stack
| Typ | Wymagane |
|---|---|
| string | tak |
Stack technologiczny aplikacji. Determinuje, który builder zostanie użyty przy deploymencie.
| Wartość | Opis | Runtime |
|---|---|---|
| nextjs | Next.js (SSR/SSG/ISR) | Node.js |
| react | React/Vite - static SPA serwowany przez nginx | Node.js (tylko build) |
| vue | Vue 3 + Vite - static SPA serwowany przez nginx | Node.js (tylko build) |
| nuxt | Nuxt 3 SSR | Node.js |
| sveltekit | SvelteKit SSR | Node.js |
| angular | Angular - static SPA serwowany przez nginx | Node.js (tylko build) |
| django | Python Django + gunicorn + supervisord | Python |
| static | HTML/CSS/JS - nginx, zero Node.js | brak |
| docker | Własny Dockerfile lub docker-compose.yml | Docker |
| node | Dowolna apka Node.js (Express, Fastify itp.) | Node.js |
| astro | Astro SSG/SSR | Node.js |
app_id
| Typ | Wymagane | Zakres |
|---|---|---|
| integer | nie | > 0 |
ID aplikacji w panelu Saplo. Generowane automatycznie przez saplo init i saplo deploy. Nie edytuj ręcznie.
runtime
Wersje runtime. Dla stacków Node.js podaj node, dla Django podaj python.
| Pole | Typ | Przykłady |
|---|---|---|
| node | string | "22", "20", "18" |
| python | string | "3.13", "3.12", "3.11" |
Domyślne wartości per stack:
| Stack | Domyślny runtime |
|---|---|
| nextjs, react, vue, nuxt, sveltekit, angular, node, astro | node: "22" |
| django | python: "3.13" |
| static | (brak) |
| docker | (brak - runtime w Dockerfile) |
build
Konfiguracja procesu budowania aplikacji.
build.install
Komenda instalacji zależności. Wykonywana jako pierwsza w fazie build.
build.command
Komenda budowania. Wykonywana po install, przed start.
build.output
Katalog z wynikiem buildu. Saplo kopiuje ten katalog i tworzy atomowy symlink /var/www/current - nginx nigdy nie widzi starego kodu.
Dla django i node pomiń to pole - cały katalog projektu jest deployowany.
build.cache
Lista katalogów cachowanych między buildami. Skraca czas instalacji z kilku minut do kilkunastu sekund.
Domyślne wartości build per stack:
| Stack | install | command | output |
|---|---|---|---|
| nextjs | npm ci | npm run build | .next |
| react | npm ci | npm run build | dist |
| vue | npm ci | npm run build | dist |
| nuxt | npm ci | npm run build | .output |
| sveltekit | npm ci | npm run build | build |
| angular | npm ci | npm run build | (auto) |
| astro | npm ci | npm run build | dist |
| node | npm ci | (brak) | (cały projekt) |
| django | pip install -r requirements.txt | python manage.py collectstatic --noinput | (cały projekt) |
| static | (brak) | (brak) | dist |
| docker | (Docker build) | (brak) | (obraz Docker) |
start
Konfiguracja uruchamiania aplikacji.
start.command
Komenda startująca serwer. Dla static sites (React, Vue, Angular, Astro SSG, static) nie podawaj - nginx serwuje pliki statyczne bez Node.js.
start.port
Port na którym nasłuchuje aplikacja. Saplo mapuje ten port przez NPM (nginx) na zewnątrz jako HTTPS :443.
| Stack | Domyślny port |
|---|---|
| nextjs, nuxt, sveltekit, node | 3000 |
| django | 8000 |
| docker | 8080 |
| react, vue, angular, astro, static | 80 |
start.healthcheck
Ścieżka HTTP GET do sprawdzenia gotowości aplikacji. Saplo odpytuje http://localhost:<port><healthcheck> po uruchomieniu. Oczekuje odpowiedzi HTTP 2xx, 301 lub 302 w ciągu 60 sekund. Brak odpowiedzi = auto-rollback do poprzedniej wersji.
start.workers
Liczba procesów roboczych. Dotyczy głównie Gunicorna dla Django. Dla Node.js użyj opcji --cluster bezpośrednio w komendzie.
env
Zmienne środowiskowe dostępne w czasie build i runtime. Obsługuje dwa tryby: plaintext i referencja do sekretu.
saplo.yaml. Plik trafia do repozytorium git. Hasła, klucze API i tokeny ustaw przez saplo env set NAZWA="wartość", a w saplo.yaml wpisz tylko "@secret" jako placeholder.
Zmienne ustawione przez saplo env set mają wyższy priorytet niż plaintext z saplo.yaml.
packages
Pakiety systemowe instalowane w kontenerze LXC przed fazami build i start. Saplo wykrywa menadżer pakietów (Alpine: apk, Debian/Ubuntu: apt).
services
Usługi uruchamiane obok aplikacji (np. Redis jako cache lub broker Celery).
services jest częścią schematu saplo.yaml, ale silnik wdrożeń jeszcze go nie uruchamia. Redis będzie dostępny jako add-on Saplo Redis - do tego czasu użyj zewnętrznego serwera Redis (zmienna env).
| Nazwa | Port | Opis |
|---|---|---|
| redis | 6379 | Redis 7, używany jako cache i message broker (Celery) |
processes
Tryb wieloprocesowy. Zamiast start.command definiuje kilka nazwanych procesów. Przydatne gdy aplikacja wymaga jednocześnie serwera web i workera (np. Celery).
processes jest częścią schematu, ale silnik wdrożeń jeszcze go nie uruchamia. Na razie użyj start.command dla pojedynczego procesu - workery (Celery beat/worker) będą wspierane wkrótce.
processes i start.command jednocześnie. Przy użyciu processes pole start.command jest ignorowane.
domains
Niestandardowe domeny dla aplikacji. Subdomena <name>.saploapp.pl jest zawsze dodawana automatycznie.
Saplo automatycznie tworzy proxy host w NPM, wydaje certyfikat SSL (Let's Encrypt) i konfiguruje przekierowanie HTTP na HTTPS.
Wymagane rekordy DNS u Twojego dostawcy domeny:
hooks
Komendy wykonywane automatycznie w określonych momentach procesu deploymentu.
hooks.pre_build
Komenda wykonywana po build.install, przed build.command. Działa w kontenerze LXC z załadowanymi zmiennymi środowiskowymi. Typowe zastosowania: migracje bazy danych, generowanie plików konfiguracyjnych.
hooks.post_deploy
Komenda wykonywana po pomyślnym healthchecku nowego deploymentu. Typowe zastosowania: notyfikacje Slack/Discord, czyszczenie cache CDN.
branches
Konfiguracja gałęziowania git.
Zmień na master lub inną gałąź jeśli Twoje repo tego wymaga:
resources
Nadpisuje zasoby przydzielone przez plan. Wymaga odpowiedniego add-onu w panelu Saplo.
| Pole | Typ | Min | Opis |
|---|---|---|---|
| ram_mb | integer | 128 | RAM w MB |
| ssd_gb | integer | 1 | Dysk SSD w GB |
Kompletne przykłady per stack
Next.js (SSR standalone)
Django (REST API + Celery)
Django z WeasyPrint (pakiety systemowe)
Docker Compose (multi-service)
Jeżeli w korzeniu projektu znajduje się docker-compose.yml (lub docker-compose.yaml, compose.yml, compose.yaml), Saplo automatycznie używa trybu docker compose. Saplo zapisuje zmienne z env: do pliku .env przed docker compose up, więc ${ZMIENNA} jest dostępne jako podstawienie w docker-compose.yml.
Static site
Walidacja konfiguracji
Sprawdź poprawność saplo.yaml przed deploymentem:
Najczęstsze błędy
| Błąd | Przyczyna | Rozwiązanie |
|---|---|---|
| Missing required field: version | Brakuje version: 1 | Dodaj version: 1 na początku |
| Invalid stack | Nieprawidłowa wartość stack | Użyj jednej z: nextjs, react, vue, nuxt, sveltekit, angular, django, static, docker, node, astro |
| Field "name" must be a lowercase slug | Wielkie litery lub spacje w name | Użyj tylko a-z, 0-9, - |
| saplo.yaml must be a YAML object | Pusty plik lub błędna składnia YAML | Sprawdź wcięcia i cudzysłowy |