Saplo ma gotowe stacki w katalogu, ale możesz wdrożyć dowolną aplikację - także taką, której nie ma na liście - przez git push. Możesz też składać aplikacje fullstack z kilku części w jednym Boxie.
Aplikacja spoza katalogu (Twój własny kod)
Trzy drogi, od najprostszej:
- Node.js / framework + git - stwórz aplikację typu Node.js (generic) albo dowolny framework (Next, React, Vue...), podłącz repozytorium i rób
git push. Saplo buduje i uruchamia Twój kod. - Docker - aplikacja typu Docker. Wrzucasz własny
docker-compose.yml, Saplo go uruchamia. Dowolny obraz, dowolny język. - saplo.yaml - plik w repozytorium opisuje build i start (buildpack). Patrz Plik saplo.yaml.
Django + React na jednej domenie
W katalogu wybierz Django + React (django-react). Jedna aplikacja udostępnia API pod /api/, panel Django pod /admin/ i React pod /. Odświeżenie podstrony frontendu zwraca index.html. Nie trzeba konfigurować CORS.
- Wybierz źródło
szkielet, aby dostać działający przykład z/api/health/, alborepo, aby zainstalować własny projekt. - Dla repo podaj adres Git i gałąź, tag lub commit (domyślnie
main). Repo musi być dostępne z Boxa; prywatne repo wymaga skonfigurowanego klucza Git. - Backend (domyślnie
backend) musi zawieraćmanage.pyze standardowymos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projekt.settings')orazrequirements.txt. Zależności muszą obsługiwać Django poniżej wersji 6. Ustawienia i połączenie z własną bazą przygotuj w projekcie; szkielet korzysta z SQLite. - Frontend (domyślnie
frontend) musi zawieraćpackage.jsoni zgodnypackage-lock.json. Instalacja wykonujenpm cioraz komendę builda (domyślnienpm run build). Katalog wyniku todistdla Vite lubbuilddla Create React App. Używaj ścieżek zasobów od/, a API wywołuj jako/api/....
Build jest kopiowany do puli zbieranej przez collectstatic. Gunicorn i WhiteNoise obsługują ruch na jednym porcie. Node 20 lub 22 służy wyłącznie do builda i jest instalowany osobno dla aplikacji. Python 3.11 lub 3.12 jest wybierany, jeśli dostępny w Boxie; w przeciwnym razie używany jest systemowy Python, tak jak w recepturze Django.
Ścieżki kodu, faktyczne wersje runtime i polecenie restartu znajdziesz w DJANGO-REACT-SETUP.txt. Receptura nie tworzy superusera; plik zawiera polecenie jego utworzenia. Po zmianach frontendu powtórz build, kopiowanie i collectstatic, a następnie restart. Ta receptura nie konfiguruje automatycznego wdrażania po pushu ani serwowania plików przesłanych przez użytkowników.
Inne aplikacje fullstack (frontend + backend)
Fullstack (np. Next.js + Django, Next.js + WordPress headless) to po prostu dwie aplikacje w tym samym Boxie, każda z własną subdomeną. Spinasz je zmienną środowiskową:
- Postaw backend (np. Django jako aplikacja typu Docker) - jeśli potrzebuje bazy, dopisz ją jako kontener we własnym
docker-compose.yml. - Postaw frontend (np. Next.js).
- Na frontendzie ustaw zmienną wskazującą URL backendu:
Frontend woła backend po jego publicznym URL. Dla WordPress headless to samo: stawiasz WP, a frontend (Next/Nuxt) czyta jego REST API albo GraphQL.
Fullstack przez Claude (MCP)
Powiedz Claude'owi: "postaw mi fullstack: Django z Postgresem jako backend i Next.js jako frontend, spięte". Claude wykona kroki: postawi backend jako aplikację Docker z Postgresem w docker-compose.yml, ustawi DATABASE_URL, postawi frontend i ustawi zmienną z adresem backendu. Wzorzec jest opisany w samym narzędziu MCP saplo_create_app.
Jak działają szablony katalogu (zaawansowane)
Każdy stack w katalogu to przepis - folder z dwoma plikami:
manifest.toml- deklaracja: nazwa, runtime (php/node/python), czy wystawia port, czy potrzebuje bazy/domeny, opcje konfiguracyjne (np. wybór wersji PHP), a dla baz sekcja[service].install.sh- skrypt instalacyjny uruchamiany w Boxie (jako root). Dostaje zmienneSAPLO_APP_DIR,SAPLO_DOMAIN,SAPLO_PORT,SAPLO_DB_*i buduje aplikację.
Silnik na podstawie manifestu sam ustawia nginx (statyczny / proxy na port / php-fpm), domenę, SSL i pulę zasobów. Tworzenie własnych przepisów oraz katalog społecznościowy to kierunek na kolejne wydania - jeśli chcesz dorzucić stack, napisz do nas.
localhost (frontend → backend → baza), a publicznie wystawiasz tyle subdomen, ile chcesz.