- Imie, tytul artykulu i powod odrzucenia oraz {{name}} w kampaniach
escapowane w HTML maili; limit dlugosci imienia.
- Kredyty promowania zuzywane i dopisywane warunkowym UPDATE, ITN blokuje
wiersz zamowienia; zakup i kredyt tylko na aktywny plan/pakiet.
- Strumien powiadomien na krotkim (60 s) tokenie ?ticket= pobieranym przez
POST /api/notifications/stream-token; token sesji nie jest przyjmowany z adresu.
- Przyblizona lokalizacja jako srodek kratki 300 m zamiast odwracalnego
przesuniecia liczonego z id.
- Propozycja spotkania respektuje blokade i moderacje, bez e-maila w nazwie.
- Zglaszajacy dostaje samo potwierdzenie; zgloszenia tylko opublikowanych
ogloszen; nie zapisujemy rozmowy przyslanej przez przegladarke.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- realip: IP klienta z X-Real-IP ustawianego przez nginx hosta, zaufanie tylko
z sieci prywatnych; limitowany jest wylacznie ruch przez nginx hosta.
- Limity na IP: logowanie/hasla 10/min, akcje wysylajace mail/SMS 3/min,
tlumaczenia 120/min, cale API 30/s; 429 jako JSON z komunikatem.
- Wspolne ustawienia proxy w nginx/api-proxy.conf.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- security-headers.conf: nosniff, X-Frame-Options, Referrer-Policy, HSTS,
Permissions-Policy i minimalny CSP; dolaczany w kazdym location z add_header,
bez dublowania naglowkow Spring Security na /api/.
- docker-compose.prod.yml: APP_JWT_SECRET bez wartosci domyslnej - brak zmiennej
zatrzymuje wdrozenie zamiast startu z jawnym sekretem.
- Obraz frontendu budowany przez npm ci z package-lock.json.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- JwtAuthFilter bierze role i stan konta z bazy: blokada, usuniecie konta
i odebranie roli admina dzialaja od razu. Zmiana i reset hasla koncza
dotychczasowe sesje (sessionsValidFrom); zmiana hasla zwraca nowy token.
- Publiczne odpowiedzi ogloszen bez ownerEmail/contactEmail; inne oferty
sprzedajacego z GET /api/listings/{id}/seller-listings.
- Publiczny formularz reklamowy nie zmienia zgod ani nazwy istniejacego leada.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ITN: XML w base64 (pole transactions), bezpieczny parser (bez XXE), podpis
ze stalej listy pol, zgodnosc ServiceID, kwoty i waluty, idempotencja,
podpisana odpowiedz XML CONFIRMED/NOTCONFIRMED.
- Start transakcji podpisanym formularzem POST ze strony /platnosc/:orderId
zamiast linku GET z podpisem w adresie; tytul przelewu w ASCII.
- Losowy OrderID (UUID) zamiast Math.random.
- Adres ITN do wpisania w panelu AutoPay widoczny w panelu admina.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Zdjecia ogloszen tylko jako data URL JPEG/PNG/WebP; podglad OG serwuje
wylacznie te typy z nosniff i CSP sandbox, bez przekierowania na dowolny URL.
- Zakup promowania bez skonfigurowanej bramki AutoPay zwraca 503; automatyczne
potwierdzanie tylko przy APP_PAYMENTS_AUTO_CONFIRM (lokalnie).
- ITN uznaje platnosc tylko przy jawnym statusie SUCCESS i zgodnej kwocie.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Panel na /firmy-i-uslugi mial 9 klikalnych przyciskow bez akcji oraz
zaszyte dane cudzej firmy ("4.8 (96 opinii)", "12 lat na rynku",
"230+ zrealizowanych projektow"). Teraz nic nie jest klikalne, liczby
zastapily podpisy pol, a na okladce jest plakietka "Podglad".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Lista ostatnio sprawdzonych lokalizacji zyla w localStorage, wiec ginela
przy zmianie urzadzenia. Teraz jest polem ustawien konta
(user_settings.price_history_markets), a wpisy z przegladarki
przenosimy raz przy pierwszym wejsciu.
To historia przegladania, nie alerty - nic z niej nie wysyla powiadomien.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Outbox byl budowany, ale nic go nie przetwarzalo - kampania wchodzila
w status SENDING i tak zostawala. CampaignSender co minute bierze
kampanie gotowe do wyslania i wysyla je porcjami po 25, pilnujac
dziennego limitu kampanii.
Tuz przed wyslaniem kazdy odbiorca jest sprawdzany ponownie (zgoda
mogla zostac cofnieta po zbudowaniu outboxu) - taki dostaje OPTED_OUT.
Kazda wiadomosc ma link rezygnacji. Bez skonfigurowanej skrzynki
kolejka czeka, zamiast spalic sie na bledach.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Usuwa wszystkie kampanie i ich kolejki odbiorcow, zeby stare kampanie
zawieszone w statusie SENDING nie ruszyly po wdrozeniu wysylki.
Leady, zgody marketingowe i grupy docelowe zostaja nietkniete.
Domyslnie proba na sucho (ROLLBACK), zapis tylko z -v apply=1 -
tak samo jak scripts/cleanup-test-data.sql.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SchemaFixer wykonuje SQL w skladni PostgreSQL (split_part, DO $$,
to_regclass), wiec kazdy @SpringBootTest wywracal sie przy starcie na
testowym H2. Teraz runner sprawdza rodzaj bazy i na innej niz PostgreSQL
nic nie robi - w testach schemat i tak tworzy Hibernate z encji.
mvn test: 22 testy, 0 bledow (bylo 3 bledy).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Oba klucze byly globalne dla przegladarki, wiec na wspolnym komputerze
jedno konto widzialo, czego szukalo drugie, i nadpisywalo mu uklad
kafelkow. Teraz oba siedza pod accountProfile:<id>:*.
Zapis do historii czeka na zakonczenie wczytywania konta - wczesniej
oferta otwarta zaraz po wejsciu trafiala do historii "goscia".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- /jak-sprzedawac: zamiast Google, Facebook Marketplace, "ponad 500 grup"
i newslettera "do tysiecy subskrybentow" - lista ofert, mapa, podglad
linku w komunikatorach (OgController) i platne wyroznienie.
- "Dodaj do 30 zdjec i film" -> 8 zdjec, tyle przyjmuje backend; wideo nie ma.
- "Pomocny asystent AI" -> poradniki, wycena i kontakt z obsluga.
- Zdania o "tysiacach kupujacych/czytelnikow/klientow" przepisane bez
twierdzen o skali (10 miejsc).
- Ustawienia: przelaczniki maili, ktorych nikt nie wysyla (zapisane
wyszukiwania, alerty, nowosci), nieaktywne z wyjasnieniem.
- "Zweryfikowana firma" -> "Adres e-mail potwierdzony" - bo tym to jest.
- Poradniki: "Powiazane oferty" prowadza do zapowiadanych wynikow,
pasek "Popularne" do poradnikow, a nie do list ofert.
- Kafelek 360 na stronie glownej bez plakietki "Wkrotce" - spacer dziala.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dotad front po kazdej zmianie dyktowal serwerowi cala liste ulubionych.
Zalogowanie sie na innym urzadzeniu wysylalo "mam zero ulubionych"
i kasowalo zapisy, przez co wlasciciel ogloszenia tracil licznik zapisan.
Teraz: GET /api/listings/favorites zwraca ulubione konta, dodanie
i usuniecie ida pojedynczo (POST/DELETE /{id}/favorite), a wpisy z
przegladarki dopisuje jednorazowy /favorites/import. Endpoint
/favorites/sync usuniety razem z jego jedynym wywolaniem.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nowa tabela meetings i /api/meetings. Termin proponuje jedna ze stron
rozmowy o ogloszeniu, druga potwierdza albo odrzuca; odwolac moze kazda
ze stron. Kalendarz konta pokazuje oba rodzaje wpisow - umowione
ogladania i wlasne notatki - i jest ten sam na kazdym urzadzeniu.
Powiadomienia: wpis w watku i dzwonek przy kazdej zmianie, e-mail
wylacznie przy potwierdzeniu terminu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nowa tabela saved_searches i /api/saved-searches (lista, dodanie,
usuniecie, jednorazowy import wpisow z localStorage). Front czyta liste
z serwera, wiec wyszukiwania sa te same na kazdym urzadzeniu i przezywaja
wyczyszczenie danych strony. Bez powiadomien. Skrypt czyszczacy usuwa
wpisy skasowanych kont.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Wycena trafia do AccountShell, jak pozostale narzedzia: gosc widzi sama
strone, zalogowany takze lewe menu konta. Test nie zakladal juz menu
i dlatego nie przechodzil.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- AI Dopasowanie, "Zobacz kupujacych", kafelek 360 i Konto Premium:
nieaktywne z plakietka "Wkrotce" zamiast przyciskow bez akcji.
- Pomoc: jeden adres info@polskalokalnie.pl i prawdziwy numer
+48 453 193 605 jako linki mailto/tel, czat na zywo usuniety,
FAQ z prawdziwymi odpowiedziami zamiast jednego zdania.
- Poradniki: dzialajaca wyszukiwarka (?szukaj= w adresie), szybkie
poradniki linkuja do rozdzialow, martwe strzalki karuzeli usuniete.
- Mapa: "Szukaj na biezacej mapie" zaweza liste do widocznych ofert
(?obszar= w adresie).
- Porownanie: wybrane oferty w adresie (?oferty=), "Udostepnij
porownanie" kopiuje link.
- Kafelek miast prowadzi na mape, karuzela opinii bez atrap strzalek.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nowa strona /negocjacje/:listingId porownuje cene ogloszenia sprzedazy
z cenami transakcyjnymi NBP i GUS oraz srednia ogloszen w dzielnicy
i miescie. Przedzial: od wartosci wg cen transakcyjnych do polowy
nadwyzki ceny ofertowej. W ogloszeniu przycisk "Ile moge utargowac?".
Usuniety fikcyjny model negocjacji i tabela cen za m2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Numer raportu mial zerowy prawy margines i wychodzil poza krawedz strony.
Nazwa serwisu w PDF-ach pisana jak w logo: "Polska Lokalnie".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Kroki kreatora maja wlasne trasy (/wycena/szczegoly, /wycena/stan,
/wycena/wynik), a szkic formularza przetrwa F5. Pusty wynik wskazuje
brakujace dane linkami do kroku, "Co dalej?" prowadzi do prawdziwych stron.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Stawka bazowa za m2 pochodzila z tabeli opisanej jako "SonarHome 2026"
i zmyslonych mnoznikow dzielnic. Teraz korzysta z /api/price-history:
- najnowsza cena transakcyjna mieszkan NBP dla miasta i rynku, potem GUS
(dane najwyzej 3-letnie), a bez nich srednia cen ofertowych z ogloszen;
- korekta dzielnicy liczona z ogloszen (min. 3 w dzielnicy i 5 w miescie);
- domy: srednia z ogloszen domow, gdy sa co najmniej 3, inaczej ceny
mieszkan z korekta modelu - opisane przy wyniku;
- zrodlo stawki w podgladzie, zalozeniach i raporcie PDF;
- brak danych dla lokalizacji to komunikat zamiast wymyslonej kwoty.
Korekty modelu (stan, pietro, rok budowy, udogodnienia) bez zmian.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Strona /historia-cen pokazywala pusty wykres (wczesniej zmyslony). Teraz:
Ceny ofertowe z ogloszen:
- Tabela price_snapshots: codzienny zapis srednich cen za m2 z opublikowanych
ogloszen per miasto i dzielnica, typ (mieszkanie/dom) i rynek. Zapis co noc
(02:30) i przy starcie, gdy brakuje dzisiejszego. Historii sprzed pierwszego
zapisu nie odtwarzamy.
Ceny transakcyjne ze zrodel publicznych (porownanie, cale miasto, mieszkania):
- NBP: plik ceny_mieszkan.xlsx (baza BaRN) - 17 miast, rynek pierwotny
i wtorny, od III kw. 2006. Odczyt XLSX bez nowych zaleznosci.
- GUS: API Banku Danych Lokalnych (temat P3794) - miasta na prawach powiatu,
kwartalnie od 2010, z opoznieniem ok. roku.
- Import raz w tygodniu i przy starcie, gdy dane sa starsze niz tydzien;
blad zrodla nie kasuje poprzednich danych.
- GET /api/price-history (publiczny): historia, biezaca srednia z ogloszen,
od kiedy zbieramy dane oraz serie NBP i GUS.
Frontend:
- Okresy "Ostatnie 5 lat" (domyslny), "Od 2006 (NBP)", "2026 do dzis";
trzy serie z legenda, dymek ze wszystkimi zrodlami, statystyki i wnioski
z prawdziwych liczb, porownanie cen ofertowych z NBP i GUS oraz roznica
i srednia, gdy zrodla sie roznia. Ceny w "Porownaj lokalizacje".
- Poprawione dopasowanie lokalizacji ("Warszawa" otwierala "Warszawa,
Mokotów"), usuniete resztki zmyslonych cen i opcja "Lokal uzytkowy".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Maile:
- Logo jest zalacznikiem inline (cid:) zamiast obrazka z adresu serwisu.
Wczesniej w mailach z lokalnego srodowiska (i w programach blokujacych
obrazki z zewnatrz) w miejscu logo byla ikona bledu. Usuniety tekst
zastepczy, ktory dublowal napis "Polska Lokalnie".
Naglowek:
- Menu nie nachodzi na logo ani panel przy zadnej szerokosci 1110-1920 px.
Ponizej 1560 px "Ulubione" to samo serce (nazwa w dymku), mniejsze odstepy
i przycisk "Dodaj ogloszenie" bez sztywnej szerokosci; w 1101-1270 px
mniejszy napis logo i tekst przycisku.
Logowanie i rejestracja (standard routingu):
- Kazdy krok ma wlasny adres: /logowanie, /logowanie/nie-pamietam-hasla,
/rejestracja, /rejestracja/osoba-prywatna, /rejestracja/firma,
/rejestracja/sprawdz-poczte. Dzialaja F5, Wstecz/Dalej i nowa karta,
formularz czysci sie takze przy Wstecz/Dalej, a cel powrotu po
zalogowaniu nie ginie przy przejsciach miedzy krokami.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Rejestracja (/logowanie):
- Formularz rejestracji (osoba prywatna i firma) zawsze zaczyna sie pusty.
Logowanie i rejestracja dzielily pola e-mail i hasla, wiec dane wpisane
albo podstawione przez przegladarke przy logowaniu trafialy do nowego konta.
- "Powtorz haslo" ma wlasny przelacznik widocznosci; wczesniej oko przy
"Haslo" odslanialo oba pola, a ikona przy "Powtorz haslo" nie reagowala.
- Przycisk oka ma normalny obszar klikniecia (mial zerowy rozmiar).
Kod SMS:
- Okno potwierdzania numeru odlicza czas od SMS-a z rejestracji, a odmowa
serwera ("Kolejny mozesz zamowic za N s") odlicza czas w dol zamiast
pokazywac stala liczbe sekund. To samo w ustawieniach konta.
Panel admina:
- "Wysylka kampanii e-mail aktywna" -> "Wysylka e-maili aktywna" z opisem:
przelacznik blokuje wszystkie e-maile (aktywacja, reset hasla,
powiadomienia), nie tylko kampanie. Podobny opis przy SMS.
Wiadomosci:
- Puste pole pisania bez "Napisz wiadomosc do ...".
- Naglowek rozmowy "Nazwa - opis" zamiast sklejonego tekstu.
- Na liscie rozmow jedna miniatura ogloszenia zamiast dwoch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Obok "Ulubione" i dzwonka powiadomien - dla kazdego zalogowanego konta,
takze administratora - ikona prowadzaca do /wiadomosci z plakietka liczby
nieprzeczytanych, na wzor Gieldy Komunalnej.
Licznik nieprzeczytanych wydzielony do useMessagesUnreadCount, wspolnego
dla menu konta i paska gornego; odswieza sie co 25 s i po zmianie strony.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dotad rozmowy z kupujacymi istnialy tylko w przegladarce nadawcy: nic nie
trafialo na serwer, "odczytano" i odpowiedz sprzedajacego byly symulowane
timerem. Wzorem Gieldy Komunalnej:
Backend (/api/conversations):
- Conversation: jeden watek na pare (ogloszenie, kupujacy), sprzedajacy to
wlasciciel ogloszenia; tytul ogloszenia zapisany na wypadek jego usuniecia.
Wiadomosci w istniejacej tabeli messages z nowa kolumna conversation_id,
wiec rozmowa z administracja (conversation_id = null) dziala bez zmian.
- start/list/get/reply, blokada (UserBlock, w obu kierunkach), ukrycie
rozmowy u siebie (nowa wiadomosc przywraca ja obu stronom). Dostep tylko
dla stron rozmowy, filtr niedozwolonych slow jak w reszcie serwisu.
- Po zatwierdzeniu transakcji odbiorca dostaje powiadomienie w serwisie
i - jesli ma wlaczone powiadomienia o wiadomosciach - e-mail (w tle).
- /api/messages/unread-count wlicza rozmowy o ogloszeniach.
- Zgloszenie uzytkownika z rozmowy: zgloszonego, ogloszenie i tresc rozmowy
serwer bierze z bazy, nie z przegladarki.
Frontend:
- Adresy /wiadomosci/:conversationId, /wiadomosci/administracja
i /wiadomosci/nowa/:listingId zamiast rozmowy w location.state.
- Lista rozmow odswiezana co 30 s, otwarta rozmowa co 4 s.
- Zdjecia w wiadomosciach usuniete - serwer ich nie przyjmuje (rozmowa
z administracja i tak je gubila).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Strony pokazywaly zmyslone dane jako prawdziwe. Usuwam je i zostawiam
puste stany tam, gdzie funkcja nie ma jeszcze zrodla danych:
- strona glowna: 4 fikcyjne "Polecane ogloszenia" (pokazywane przy mniej
niz 4 ogloszeniach) - teraz prawdziwe ogloszenia albo pusty stan;
- mapa: zapasowe fikcyjne oferty kupna i wynajmu;
- wyszukiwarka: gotowe wpisy "Ostatnio wyszukiwane";
- negocjacje: zmyslona "szansa na zakup" i "podobne transakcje" - pusty stan;
- historia cen: wykres i statystyki z generatora - puste do czasu podpiecia API;
- alerty cenowe: wykres z generatora; srednia liczona tylko z ogloszen.
Wczesniej przy braku ogloszen podstawiana byla stawka szacunkowa, przez co
monitoring w tle zglaszal nieistniejace zmiany cen;
- spotkania: przykladowe i "testowe" spotkania dopisywane kazdemu kontu,
takze odfiltrowane z localStorage;
- wiadomosci: 7 fikcyjnych rozmow; pusty stan zamiast bledu bez watkow;
- moje oferty: 12 ukrytych fikcyjnych ofert zapisywanych w localStorage;
- poradniki: zmyslone polecane artykuly (teraz najczesciej czytane z API)
i liczniki "5 120 ofert";
- wycena: wskaznik "% dokladnosci" liczony z liczby wypelnionych pol;
- martwy kod z fikcyjnymi powiadomieniami, znacznikami mapy i statystykami.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
scripts/cleanup-test-data.sql zostawia wylacznie konta zatorskipascal@gmail.com
i admin@softspm.com. Usuwa pozostale konta, ogloszenia spoza tych dwoch kont
oraz powiazane dane (wiadomosci, powiadomienia, ustawienia, leady, zamowienia
promocji, zgloszenia, poradniki), w tym sieroty po kontach usunietych wczesniej
z panelu admina. Domyslnie dziala na sucho (ROLLBACK), zapis tylko z -v apply=1;
przerywa, gdy ktoregos z zachowywanych kont nie ma w bazie.
DataSeeder nie dodaje juz ogloszen demo: robil to przy kazdym starcie z pusta
tabela ogloszen, wiec po wyczyszczeniu danych wracalyby przy kolejnym wdrozeniu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Endpoint /api/auth/social byl atrapa bez prawdziwego OAuth: wydawal token
sesji dla dowolnego adresu e-mail podanego w zadaniu, bez hasla. Podanie
adresu administratora dawalo pelna sesje z rola ADMIN.
Na tym etapie logowanie ma byc wylacznie dla uzytkownikow systemu (e-mail
i haslo), wiec usuwam je w calosci:
- backend: endpoint, wpis permitAll w SecurityConfig, AuthService.socialLogin
z pomocnikami i DTO SocialLoginRequest. Enum AuthProvider zostaje, bo
istniejace konta moga miec GOOGLE/FACEBOOK.
- frontend: przyciski Google/Facebook w formularzach logowania i rejestracji,
socialLogin w AuthContext oraz osierocone style.
Test regresyjny AuthControllerTest nie uruchomi sie jeszcze na H2 - start
kontekstu wywraca sie na split_part w SQL naprawiajacym nicki (ten sam blad
dotyczy istniejacego contextLoads). Zweryfikowane recznie na stacku
z PostgreSQL: /api/auth/social -> 403, logowanie e-mailem -> 200.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Trzy rzeczy kosztowaly dzis najwiecej czasu i zadnej nie dalo sie wyczytac z repozytorium:
zmienne z pliku srodowiskowego nie docieraja do kontenera, jesli nie ma ich w sekcji
environment; wszystkie aplikacje na serwerze leza w katalogach "app", wiec Compose bez -p
wchodzi w cudzy stack; loginem jest e-mail, a nie nick.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Logowanie z https://polskalokalnie.pl konczylo sie bledem 403, a nie 401 -
zadanie w ogole nie docieralo do logiki uwierzytelniania. Nginx terminuje TLS
i przekazuje ruch do backendu po http, wiec Spring widzi schemat http, podczas
gdy przegladarka przysyla Origin z https. Schematy sie roznia, wiec zadanie
jest traktowane jako cross-origin i sprawdzane wzgledem listy dozwolonych
originow, na ktorej byly wylacznie adresy lokalne i LAN. Frontend pokazywal
przy tym generyczny komunikat, bo odpowiedz CORS nie jest JSON-em z pole
"message".
Dodanie domeny produkcyjnej do listy przywraca poprawne zachowanie: zle haslo
zwraca 401 z czytelnym komunikatem, poprawne 200.
Poza tym:
- name: polskalokalnie w obu plikach compose. Bez tego Compose wyprowadza nazwe
projektu z nazwy katalogu, a na serwerze kazda z trzech aplikacji siedzi w
katalogu "app" - komenda bez -p wchodzila w stack innej aplikacji i podmieniala
w nim serwis backend.
- restart: unless-stopped na serwisach produkcyjnych. Kontenery polskalokalnie
mialy polityke "no" i jako jedyne na serwerze nie wstawaly po reboocie.
W pliku deweloperskim swiadomie tego nie ma - lokalnie kontenery nie powinny
startowac same przy kazdym uruchomieniu Dockera.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>