# Deploy na Render.com — krok po kroku Cel: postawić apkę online tak, żebyś mógł ją otworzyć z telefonu pod stałym adresem (np. `https://dywanowy-bazar.onrender.com/editor`) i dodać "Do ekranu głównego" jako PWA. > **Koszt:** $0. Free Plan na Render wystarczy do pracy z ~400 dywanami. Aplikacja zasypia po 15 min bezczynności i budzi się ~30 s przy pierwszym otwarciu — to normalne dla planu free. --- ## 1. Wypchnij aktualny kod do GitHub W terminalu PowerShell, w katalogu projektu: ```powershell git add . git commit -m "PWA + auth + render.yaml + mobile fixes" git push origin main ``` Jeśli `git push` woła o login, zaloguj się przez GitHub CLI: ```powershell gh auth login ``` --- ## 2. Zaloguj się na Render 1. Otwórz https://dashboard.render.com/ 2. Zaloguj kontem GitHub (Sign up → Continue with GitHub) 3. Pozwól Renderowi czytać Twoje repo `DamianMalenta/dywanowy-bazar` --- ## 3. Stwórz Web Service z `render.yaml` (1-click) 1. Render Dashboard → **New +** → **Blueprint** 2. Wybierz repo `DamianMalenta/dywanowy-bazar` 3. Render zobaczy plik `render.yaml` w roocie i sam: - utworzy serwis `dywanowy-bazar` - ustawi region Frankfurt - ustawi build command `npm install --omit=dev` - ustawi start command `node server.js` - poprosi o uzupełnienie 3 sekretów (poniżej) **Alternatywa ręczna (gdyby coś nie pyknęło):** - New + → **Web Service** → wybierz repo - Runtime: **Node** - Build Command: `npm install --omit=dev` - Start Command: `node server.js` - Region: **Frankfurt** - Plan: **Free** - Health Check Path: `/health` --- ## 4. Wpisz sekrety w panelu Render Przejdź do utworzonej usługi → **Environment** → **Add Environment Variable** i wprowadź: | Klucz | Wartość | Skąd? | |---|---|---| | `APP_PASSWORD` | wymyśl np. `Truskawka2026!` | hasło dostępu do całej apki w przeglądarce | | `OPENAI_API_KEY` | `sk-proj-...` | z Twojego `.env` (linia `OPENAI_API_KEY=`) | | `BASELINKER_API_TOKEN` | `5021348-5047759-...` | z Twojego `.env` (linia `BASELINKER_API_TOKEN=`) | Pozostałe zmienne (BASELINKER_INVENTORY_ID, EUR_TO_PLN, itd.) są już zapięte automatycznie przez `render.yaml`. Jeśli kiedyś zmienisz np. kurs EUR, edytuj `render.yaml` i pushuj — Render auto-deploy zaktualizuje. Po zapisaniu sekretów Render zrobi **Manual Deploy** → poczekaj ~2 minuty. **Indeks wyszukiwania po EAN / Artikelnummer** — buduje się automatycznie przy deployu (`npm run build:tara-index` w `buildCommand` w `render.yaml`, ~70 s). Plik `data/tara-index.json` jest w `.gitignore` i powstaje na dysku instancji przy każdym deployu. Ręcznie: `npm run build:tara-index` lokalnie (np. do testów). --- ## 5. Sprawdź czy żyje W przeglądarce otwórz: ``` https://dywanowy-bazar.onrender.com/health ``` Powinno zwrócić: ```json { "ok": true, "service": "dywanowy-bazar-importer", "suppliers": ["tara-carpet.com"] } ``` **Bez** popupu o hasło — bo `/health` nie jest chronione (Render musi to pingować). Następnie: ``` https://dywanowy-bazar.onrender.com/editor ``` Przeglądarka pokaże popup logowania: - **Username:** dowolny (zostaw `admin`) - **Password:** to co wpisałeś jako `APP_PASSWORD` --- ## 6. Zainstaluj jako apkę na telefonie (PWA) ### Android (Chrome/Edge) 1. Otwórz `https://dywanowy-bazar.onrender.com/editor` (zaloguj się) 2. Menu (3 kropki) → **Dodaj do ekranu głównego** lub **Zainstaluj aplikację** 3. Apka pojawi się jako ikona na pulpicie z nazwą **Dywany** 4. Działa fullscreen, bez paska adresu ### iOS (Safari) 1. Otwórz adres w **Safari** (nie Chrome — Apple wymaga Safari dla PWA) 2. Przycisk **Udostępnij** (kwadrat ze strzałką w górę) → **Dodaj do ekranu początkowego** 3. Ikona na home screen → po stuknięciu otwiera apkę bez paska Safari > Po pierwszym wpisaniu hasła Safari/Chrome zapamięta credentialsy i nie będzie pytał za każdym razem. --- ## 7. Aktualizacje kodu Każdy `git push origin main` z laptopa = Render auto-deploy. Po ~2 min nowa wersja jest live. Service Worker w przeglądarce sam pobierze nową wersję CSS/JS przy następnym otwarciu apki. Jeśli zmieniłeś coś w PWA shell (CSS/JS) i chcesz wymusić odświeżenie ikony / cache: - W telefonie usuń apkę z home screen, otwórz w przeglądarce, przeinstaluj. - Albo bump `CACHE_NAME` w `public/service-worker.js` (np. v1 → v2) i pushuj. --- ## 8. Custom domain (opcjonalnie, na potem) Render Free pozwala podpiąć własną domenę: - Settings → Custom Domains → Add → wpisz np. `dywany.twojadomena.pl` - Render da Ci rekord CNAME do dodania w panelu domeny - HTTPS jest automatyczne (Let's Encrypt) --- ## 9. Co jeśli apka "śpi" Free Plan usypia po 15 min bezczynności. Pierwsze otwarcie po przerwie trwa ~30 s zanim Render ją obudzi. Rozwiązania: 1. **Zostaw tak** — przy okazjonalnym wystawianiu produktów to nie problem. 2. **Cron-job-org darmowy keepalive** — co 10 min puka w `/health`, apka nigdy nie zaśnie. Zarejestruj się na https://cron-job.org, dodaj zadanie GET na `https://dywanowy-bazar.onrender.com/health` co 10 min. 3. **Płatny plan Starter ($7/mies)** — bez zasypiania. Polecam #1 + #2 (oba darmowe). --- ## 10. Rollback awaryjny Jeśli po deployu coś się posypie: - Render Dashboard → twoja usługa → **Deploys** → wybierz poprzedni zielony deploy → **Redeploy** W ciągu ~30 s wracasz do wcześniejszej wersji.