Przejdź do głównej zawartości

Wdrożenie Sellfa na Coolify

Język: 🇵🇱 Polski · 🇬🇧 English

Coolify to platforma PaaS do zarządzania aplikacjami na Twoich własnych serwerach. Dostępna w dwóch wariantach:

Coolify Self-HostedCoolify Cloud
Gdzie działa dashboard CoolifyNa Twoim VPSNa serwerach Coolify
Gdzie działa Twój sklep SellfNa Twoim VPS (tym samym co Coolify albo osobnym)Na Twoim VPS (podpiętym do Cloud dashboardu)
KosztZawsze darmowy$5/mies za 2 serwery + $3/mies za każdy dodatkowy
ZarządzaszCoolify + aplikacjami + serweramiTylko aplikacjami + serwerami (Coolify sam się aktualizuje)
Backupy, alerty, auto-updateSam ogarniaszW cenie
Dla kogoMajsterkowicze, pełna kontrola, zero stałych kosztówChcesz zarządzane Coolify ale wciąż własne dane i sprzęt

Wspólne dla obu: Twój sklep Sellf zawsze działa na VPS-ie który Ty wynajmujesz (Hetzner, DigitalOcean, Contabo itd.). Coolify Cloud nie hostuje Twoich aplikacji — hostuje tylko panel sterowania. Więc obie opcje wymagają serwera z wystarczającym RAM-em (zobacz Wymagania niżej).

Ten przewodnik pokrywa oba tryby. Wybierz jeden i podążaj za krokami tylko dla tego trybu tam gdzie się różnią.

Wybierz Coolify jeśli:

  • Masz (albo chcesz wynająć) VPS z 8 GB+ RAM. Sam build Sellfa potrzebuje ~3 GB wolnego dla bun run build na Next.js 16 z Turbopack; na 4 GB VPS Coolify + Postgres + Redis zjadają już ~1 GB, więc build pada przez OOM. Zweryfikowano 2026-05-27: 4 GB Hetzner CX22 zabija build, 8 GB Hetzner CX32 buduje się w ~8 minut i serwuje poprawnie.
  • Chcesz wszystko na własnej infrastrukturze (bez Supabase Cloud, bez Vercela)
  • OK Ci self-hostować Postgresa (i własne backupy, w trybie self-hosted Coolify)
  • Chcesz “deploy and forget” — Coolify obsługuje auto-renew TLS, automatyczne redeploy na git push, restarty kontenerów

Wybierz Coolify Cloud jeśli chcesz wszystkiego powyżej PLUS wolisz nie uruchamiać dashboardu Coolify samemu (auto-aktualizacje, backupy, alerty mailowe załatwione za Ciebie, ~$5/miesiąc).

Wybierz Coolify Self-Hosted jeśli chcesz zero powtarzających się opłat za oprogramowanie (i tak płacisz dostawcy VPS) ORAZ jesteś komfortowy z utrzymywaniem UI zarządzania Coolify samemu (docker compose pull && restart raz na miesiąc).

Nie wybieraj Coolify jeśli pasują Ci bardziej:

  • Hosting na free tier: Coolify i tak wymaga VPS-a, ~$5-10/miesiąc minimum. Zobacz DEPLOYMENT-VERCEL-NETLIFY.md — Vercel + Supabase Cloud mają darmowy plan.
  • Najmniejszy możliwy footprint: zobacz DEPLOYMENT-MIKRUS.md — sam Sellf chodzi na 35 zł/rok mikr.us bez Dockera.

Najkrótsza ścieżka — użyj instalatora StackPilot

Dział zatytułowany „Najkrótsza ścieżka — użyj instalatora StackPilot”

install-coolify.sh ze StackPilot automatyzuje cały ten przewodnik. Dwa style wywołania zależnie od tego którego wariantu Coolify używasz:

Coolify Self-Hosted (domyślnie):

Okno terminala
./apps/sellf/install-coolify.sh \
--ssh-host <alias-vps> \
--repo-path /sciezka/do/sellf

Skrypt instaluje Coolify na targecie (jeśli go nie ma), rejestruje admina, generuje token API, tworzy aplikację, ustawia zmienne, aplikuje migracje bazy i tworzy webhook Stripe. Łączny czas: ~12 minut na świeżym VPS, ~7 minut jeśli Coolify już działa.

Coolify Cloud:

Okno terminala
./apps/sellf/install-coolify.sh \
--coolify-cloud \
--coolify-token <twoj-token-api> \
--server-uuid <uuid-serwera-juz-dodanego-do-cloud> \
--repo-path /sciezka/do/sellf

Dla Cloud zrobiłeś już jednorazową konfigurację w Coolify Cloud (rejestracja, dodanie serwera, wygenerowanie tokenu API). Skrypt tworzy tylko projekt + aplikację + zmienne + webhook Stripe przeciwko https://app.coolify.io/api/v1/.... Łączny czas: ~7 minut.

Zweryfikowano na Hetzner CX32 (8 GB RAM) 2026-05-27.

Jeśli wolisz ręczny flow (albo wdrażasz bez root SSH na VPS), użyj kroków poniżej.

Jeśli nie masz jeszcze Coolify na VPS, zainstaluj na Debian/Ubuntu:

Okno terminala
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash

Po instalacji otwórz http://<ip-twojego-vps>:8000 i przejdź przez pierwszy kreator (admin email + hasło). Kreator automatycznie doda host VPS jako Twój pierwszy “serwer”.

Pełna dokumentacja Coolify: https://coolify.io/docs/installation

Tryb B: Coolify Cloud (zarejestruj się + podłącz serwer)

Dział zatytułowany „Tryb B: Coolify Cloud (zarejestruj się + podłącz serwer)”
  1. Zarejestruj się na https://app.coolify.io
  2. Wybierz plan ($5/miesiąc za 2 serwery wystarczy na jednego Sellfa + zapas)
  3. W dashboardzie Cloud kliknij Servers → New Server
  4. Coolify da Ci publiczny klucz SSH. Dodaj go do ~/.ssh/authorized_keys na swoim VPS-ie (Coolify Cloud musi mieć SSH do VPS-a żeby wdrażać tam aplikacje)
  5. Wpisz IP swojego VPS-a w formularzu i kliknij Validate
  6. Po walidacji serwer jest gotowy do wdrożeń

Dla reszty przewodnika URL dashboardu Coolify to https://app.coolify.io (Cloud) zamiast http://<ip-twojego-vps>:8000 (Self-Hosted). Wszystkie inne kroki działają identycznie — to samo UI, to samo API.

W dashboardzie Coolify:

  1. Projects → New Project → nazwij sellf
  2. W projekcie New Resource → Public Repository
  3. Wklej:
    • Git Repository: https://github.com/jurczykpawel/sellf
    • Branch: main
    • Build Pack: Docker Compose
    • Compose File Location: docker-compose.fullstack.yml
  4. Kliknij Continue

Coolify odczyta plik compose i poprosi o zmienne z niego. Wypełnij:

Okno terminala
echo "POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '=+/' | cut -c1-24)"
echo "JWT_SECRET=$(openssl rand -base64 32)"
echo "ANON_KEY=<wygeneruj przez narzędzie podpisu JWT Supabase, zobacz Krok 3.1>"
echo "SERVICE_ROLE_KEY=<to samo>"
echo "CHECKOUT_BINDING_SECRET=$(openssl rand -base64 32)"
echo "APP_ENCRYPTION_KEY=$(openssl rand -base64 32)"
echo "LOGINWALL_SECRET=$(openssl rand -hex 32)"

Samodzielnie hostowane Supabase wymaga ANON_KEY i SERVICE_ROLE_KEY podpisanych Twoim JWT_SECRET. Użyj online narzędzia Supabase: https://supabase.com/docs/guides/self-hosting#api-keys (strona ma wbudowany generator). Albo uruchom lokalnie:

Okno terminala
JWT_SECRET="<twoja wartość z góry>"
# anon key:
docker run --rm -i node:20-alpine sh -c "npm i -g jsonwebtoken-cli && jwt encode --secret '$JWT_SECRET' '{\"role\": \"anon\", \"iss\": \"supabase\"}'"
# service_role key:
docker run --rm -i node:20-alpine sh -c "npm i -g jsonwebtoken-cli && jwt encode --secret '$JWT_SECRET' '{\"role\": \"service_role\", \"iss\": \"supabase\"}'"
POSTGRES_PASSWORD=<z kroku 3>
JWT_SECRET=<z kroku 3>
ANON_KEY=<z kroku 3.1>
SERVICE_ROLE_KEY=<z kroku 3.1>
SUPABASE_URL=http://kong:8000 # wewnętrzna sieć Docker
SUPABASE_ANON_KEY=<to samo co ANON_KEY>
SUPABASE_SERVICE_ROLE_KEY=<to samo co SERVICE_ROLE_KEY>
SITE_URL=https://<twoja-domena-coolify-app>
STRIPE_SECRET_KEY=sk_test_… # albo sk_live_… dla produkcji
STRIPE_PUBLISHABLE_KEY=pk_test_…
# STRIPE_WEBHOOK_SECRET — zostaw puste; zarejestrujesz webhook z panelu
# admina w Kroku 5, signing secret wyląduje w bazie.
CHECKOUT_BINDING_SECRET=<z kroku 3>
APP_ENCRYPTION_KEY=<z kroku 3>
LOGINWALL_SECRET=<z kroku 3>
TRUSTED_PROXY=true

Kliknij Deploy w Coolify. Pierwszy deploy trwa 5-10 minut (buduje bundle Next.js Sellfa i pobiera obrazy Supabase). Coolify pokazuje live logi builda.

Bez osobnego kroku migracjidocker-compose.fullstack.yml montuje ./supabase/migrations do kontenera Postgresa w /docker-entrypoint-initdb.d, więc migracje uruchamiają się automatycznie przy pierwszym boocie. To główny powód dla którego Coolify jest bliżej prawdziwego one-click niż Vercel/Netlify.

Krok 5 — Rejestracja + webhook Stripe (1 min, 1 klik)

Dział zatytułowany „Krok 5 — Rejestracja + webhook Stripe (1 min, 1 klik)”

Po deployu Twoja aplikacja jest pod https://<twoja-coolify-domena>.

  1. Otwórz URL → zarejestruj się emailem → kliknij magic link ze skrzynki. Pierwszy zarejestrowany użytkownik automatycznie staje się adminem.
  2. W panelu admina otwórz Settings → Payments (albo /dashboard/settings).
  3. Karta API keys: wklej Stripe Publishable Key i Secret Key. Zapisywane zaszyfrowane w bazie Supabase.
  4. Karta Stripe Webhook: kliknij Register webhook. Sellf woła Stripe za Ciebie — tworzy endpoint wskazujący na https://<twoja-domena>/api/webhooks/stripe, subskrybuje potrzebne eventy i zapisuje signing secret zaszyfrowany w stripe_configurations. Bez wizyt w Stripe Dashboard, bez env-var dance.

Env-config alt: Jeśli wolisz trzymać sekrety w env varach Coolify (np. dla redeployów z CI), użyj legacy flow — stwórz webhook ręcznie na https://dashboard.stripe.com/test/webhooks, wklej whsec_… do STRIPE_WEBHOOK_SECRET w Coolify, restart. Ten sam efekt.

W dashboardzie Coolify:

  1. Otwórz aplikację Sellf
  2. Domains → Add Domain → wpisz własną domenę (np. sklep.example.com)
  3. Ustaw rekord A swojej DNS na IP VPS Coolify
  4. Coolify auto-provisionuje cert Let’s Encrypt w ~30 sekund

Zaktualizuj SITE_URL żeby pasowała do nowej domeny, restartuj.

Coolify nie widzi do wewnątrz Twojego Supabase Sellfa. Skonfiguruj własne backupy:

Okno terminala
# W dashboardzie Coolify → projekt → Backups
# ALBO przez cron na VPS-ie:
0 3 * * * docker exec sellf-db pg_dumpall -U postgres > /backups/sellf-$(date +%F).sql

Dla backupów offsite kompatybilnych z S3, zobacz vault/brands/_shared/infra/INDEX.md dla wzorca backup-host-restic.sh.

W dashboardzie Coolify:

  1. Otwórz aplikację Sellf
  2. Deployments → Redeploy — pobiera najnowsze main z GitHuba, przebudowuje
  3. Migracje w nowszych wersjach Sellfa uruchamiają się automatycznie przy restarcie kontenera (idempotentne)

Jeśli chcesz auto-deploy przy każdym git push do main, włącz Webhooks → GitHub w ustawieniach projektu Coolify.

Objaw: Coolify pokazuje deploy jako “in progress” ale kontener builda znika bez błędu w UI logach. dmesg na hoście pokazuje:

Out of memory: Killed process <pid> (bun) total-vm:76GB ...

Przyczyna: Next.js 16 + Turbopack + bun run build szczytuje ~3 GB residentnej pamięci, a usługi Coolify + Postgres + Redis już używają ~1 GB. 4 GB VPS się nie mieści.

Fix: aktualizuj do 8 GB+ (Hetzner CX32, Contabo VPS 200, Linode g6-standard-2 itd.) i redeploy. Albo zbuduj obraz gdzie indziej i pozwól Coolify tylko go pobrać (zobacz “Build server” w ustawieniach Coolify).

Objaw: kontener sellf-db ciągle restartuje, logi mówią FATAL: password authentication failed.

Przyczyna: zmienna POSTGRES_PASSWORD została zmieniona po pierwszym boocie. Katalog danych Postgresa został zainicjalizowany ze starym hasłem; nowe nie autoryzuje.

Fix: zatrzymaj stack, docker volume rm sellf_postgres_data, redeploy. Niszczy wszystkie dane — upewnij się że masz backup jeśli jesteś po pierwszym deployu.

Przyczyna: brakuje albo nieprawidłowy plik supabase/kong.yml w repo. Compose montuje go tylko-do-odczytu.

Fix: sprawdź że plik istnieje pod ścieżką jakiej oczekuje docker-compose.fullstack.yml (./supabase/kong.yml).

Darmowy plan Coolify pozwala na N zasobów na serwer. Sprawdź stronę cennika Coolify — jeśli przekroczyłeś, albo usuń nieużywane zasoby albo aktualizuj.

Ten sam problem co w przewodniku Vercel/Netlify — zmienna STRIPE_WEBHOOK_SECRET nie pasuje do signing secret w dashboardzie Stripe. Skopiuj ponownie i zrestartuj kontener.


Czemu to nie jest jeszcze opublikowane jako “Coolify Template”

Dział zatytułowany „Czemu to nie jest jeszcze opublikowane jako “Coolify Template””

Coolify wspiera szablony one-click z marketplace. Sellf jeszcze takiego nie ma bo:

  • Plik compose fullstack używa obrazów Supabase wymagających kluczy podpisanych JWT (Krok 3.1) — format szablonu Coolify nie wspiera natywnie “wygeneruj ten JWT, podpisz tamtą inną wygenerowaną wartością.” Wciąż potrzebowałbyś ręcznego kroku JWT.
  • Self-Hosted Supabase to ruchomy cel (wersje auth/realtime/storage się zmieniają). Compose fullstack jest przypięty do znanych-dobrych wersji; szablon wymagałby utrzymania.

Jeśli ktoś chce wnieść szablon Coolify zawierający init container podpisujący JWT, byłby mile widziany — otwórz issue.