[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-pl-docker":3,"technology-projects-pl-docker":34,"mdc--fskdh3-key":187},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":14,"links":15,"meta":24,"projects":25,"since":30,"stem":31,"updated":32,"__hash__":33},"technologies_pl\u002Fpl\u002Ftechnologies\u002Fdocker.yml","Docker","infrastructure","Docker pozwala umieścić aplikację i jej zależności w obrazie kontenera. Używam go do usług Laravel i Node.js w DigiPulse, VetSpace oraz NetPostPanel, od lokalnej pracy po wdrożenia na maszynach wirtualnych.\n\n## Jak organizuję kontenery\n\n- **Docker Compose** — wspólny opis aplikacji, procesów obsługujących zadania w tle i usług pomocniczych.\n- **Budowanie wieloetapowe** — oddzielenie narzędzi budowania od końcowego obrazu uruchomieniowego.\n- **Trwałe dane** — pliki bazy danych i przesłane materiały przechowywane poza wymienialnymi kontenerami.\n\n## Co daje przenośność\n\nKontenery pomogły mi zmienić dostawcę hostingu bez odtwarzania środowiska aplikacji od podstaw. Na działanie systemu nadal wpływają konfiguracja, architektura procesora, sieć i dane. Sam Docker nie gwarantuje więc, że błąd z produkcji uda się odtworzyć lokalnie.\n\n## Kontrola stanu i odzyskiwanie działania\n\nHealth check zgłasza stan kontenera. Polityki restartu Dockera reagują na zakończenie procesu; sam status unhealthy nie powoduje ponownego uruchomienia. Trzeba to uwzględnić przy wdrażaniu i usuwaniu awarii, szczególnie w przypadku baz danych i procesów, które nie mogą zgubić rozpoczętych zadań.\n","Docker dla Laravel i Node.js: powtarzalne środowiska, usługi Docker Compose i wdrażanie kontenerów w moich projektach SaaS.","yml",[11],{"label":12,"content":13},"Kiedy wybierasz Docker Compose zamiast Kubernetes?","Używam Compose do usług zarządzanych na pojedynczych maszynach wirtualnych. Kubernetes rozważam, gdy projekt potrzebuje rozdzielania zadań między węzły i ma zasoby na utrzymanie klastra.","i-simple-icons-docker",[16,21],{"label":17,"to":18,"color":19,"icon":20},"docker.com","https:\u002F\u002Fwww.docker.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":22,"to":23,"color":19,"icon":20},"Dokumentacja techniczna","https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fcontainers\u002Fstart-containers-automatically\u002F",{},[26,27,28,29],"digipulse","vetspace","netpostpanel","digispace","2019","pl\u002Ftechnologies\u002Fdocker","2026-09-20","Q6atlSkxe60m_ZElSu6Q4q5VeRVKZrseqvxIDR9-zh0",[35,81,120,150],{"id":36,"title":37,"content":38,"date":39,"description":40,"extension":9,"featured":41,"image":42,"links":43,"meta":52,"stack":53,"stem":75,"tags":76,"url":46,"__hash__":80},"projects_pl\u002Fpl\u002Fprojects\u002Fdigipulse.yml","DigiPulse","SaaS do monitorowania dostępności — sprawdzanie co 60 sekund, śledzenie wygaśnięcia SSL, powiadomienia przez Telegram i email. Panel administracyjny i podstawowy backend zbudowane na Laravel (Octane, websockety Reverb) i Filament, a silnik monitorujący to osobny serwis w Go. Integracja logowania Google OAuth i Cloudflare Turnstile. Zawiera serwer MCP, który udostępnia dane monitoringu bezpośrednio asystentom AI. Self-hosted na Proxmox.\n\n## Kluczowe funkcje\n\n- **Dedykowany silnik w Go** - sprawdzanie dostępności wykonuje osobny serwis w Go, więc ciągłe odpytywanie co 60 sekund nie spowalnia aplikacji Laravel\n- **Dashboard w czasie rzeczywistym** - websockety Reverb przesyłają zmiany statusu do UI na żywo, bez odświeżania\n- **Octane + Filament** - Laravel rezydentny w pamięci z pełnym panelem administracyjnym dla monitorów, kontaktów i reguł alertów\n- **Serwer MCP** - monitory i incydenty dostępne dla asystentów AI (Claude, Cursor) przez Model Context Protocol\n- **Google OAuth + Turnstile** - logowanie bez hasła i ochrona przed botami na formularzach publicznych\n- **Self-hosted** - wdrożone na własnym homelab Proxmox, którym zarządzam end-to-end\n\n## Stos technologiczny\n\n- **Backend**: Laravel (Octane, websockety Reverb)\n- **Panel administracyjny**: Filament\n- **Silnik monitorujący**: Go (osobny serwis)\n- **Baza danych**: PostgreSQL\n- **Integracja AI**: Serwer MCP\n- **Infrastruktura**: Self-hosted na Proxmox\n","2026-04-17","SaaS do monitorowania dostępności: architektura event-driven — Laravel (Octane, Reverb) i Filament wysyłają zadania przez Redis do lekkiego workera w Go; serwer MCP udostępnia dane monitoringu asystentom AI; powiadomienia Telegram\u002Fe-mail",true,"\u002Fhero\u002Fdigipulse.avif",[44,48],{"label":45,"to":46,"color":47,"icon":20},"Live Demo","https:\u002F\u002Fdigipulse.cloud","primary",{"label":49,"to":50,"color":19,"icon":51},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend","i-simple-icons-github",{},[54,57,60,63,66,69,72],{"name":55,"icon":56},"Laravel","i-simple-icons-laravel",{"name":58,"icon":59},"Filament","i-simple-icons-filament",{"name":61,"icon":62},"Go","i-simple-icons-go",{"name":64,"icon":65},"PostgreSQL","i-simple-icons-postgresql",{"name":67,"icon":68},"Redis","i-simple-icons-redis",{"name":70,"icon":71},"Vue","i-simple-icons-vuedotjs",{"name":73,"icon":74},"MCP","i-heroicons-cpu-chip","pl\u002Fprojects\u002Fdigipulse",[77,55,61,78,73,67,79],"SaaS","Monitoring","Event-driven","GqA86kRO7Vh1dUrEBwiAh6SARuOescZleItqed4Wz8M",{"id":82,"title":83,"content":84,"date":85,"description":86,"extension":9,"featured":41,"image":87,"links":88,"meta":100,"stack":101,"stem":116,"tags":117,"url":90,"__hash__":119},"projects_pl\u002Fpl\u002Fprojects\u002Fvetspace.yml","VetSpace","Dwustronna platforma weterynaryjna — katalog SEO klinik i CRM oparty na subskrypcji z wizytami i rekordami pacjentów. Publiczny katalog klinik zbudowany pod kątem pozyskiwania klientów przez SEO oraz CRM oparty na subskrypcji (wizyty, rekordy pacjentów) jako osobne aplikacje Vue\u002FNuxt na jednym API Laravel. Architektura database-per-tenant, subskrypcje Stripe przez Cashier, GraphQL + REST oraz analiza wizyt wspomagana AI przez dedykowany mikroserwis w Go.\n\n## Kluczowe funkcje\n\n- **Dwustronny lejek** - katalog SEO pozyskuje kliniki, a CRM w subskrypcji (wizyty, rekordy pacjentów) je utrzymuje\n- **Prawdziwa izolacja tenantów** - database-per-tenant trzyma dane każdej kliniki osobno, a eksport\u002Fusuwanie GDPR to operacja na bazie\n- **Dwa interfejsy API** - GraphQL dla złożonych zapytań katalogu, REST dla CRM — jedna baza kodu Laravel\n- **Billing od ręki** - subskrypcje Stripe przez Cashier: triale, zmiany planów, dunning\n- **AI tam, gdzie pomaga** - analizę wizyt wykonuje dedykowany mikroserwis w Go, nie obciążając głównego API\n\n## Stos technologiczny\n\n- **Backend**: Laravel (API)\n- **Frontend**: Vue\u002FNuxt (osobne aplikacje)\n- **Architektura**: Multi-tenancy database-per-tenant\n- **Płatności**: Stripe przez Cashier\n- **API**: GraphQL + REST\n- **AI**: Mikroserwis Go do analizy wizyt\n","2026-09-19","Dwustronna platforma weterynaryjna — katalog SEO klinik i CRM oparty na subskrypcji z wizytami i rekordami pacjentów","\u002Fhero\u002Fvetspace.avif",[89,91,94,97],{"label":45,"to":90,"color":47,"icon":20},"https:\u002F\u002Fvetspace.pro",{"label":92,"to":93,"color":19,"icon":51},"Przegląd API","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":95,"to":96,"color":19,"icon":51},"Przegląd frontendu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":98,"to":99,"color":19,"icon":51},"Przegląd VetCard","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard",{},[102,103,104,107,110,113],{"name":55,"icon":56},{"name":70,"icon":71},{"name":105,"icon":106},"Nuxt","i-simple-icons-nuxtdotjs",{"name":108,"icon":109},"Stripe","i-simple-icons-stripe",{"name":111,"icon":112},"GraphQL","i-simple-icons-graphql",{"name":114,"icon":115},"AI","i-heroicons-sparkles","pl\u002Fprojects\u002Fvetspace",[77,55,70,118,108,114],"Multi-tenant","xvJ2gsG93A4aTrZYPgp4UuQdQsPe-Ae8ups9tasKAD8",{"id":121,"title":122,"content":123,"date":124,"description":125,"extension":9,"featured":41,"image":126,"links":127,"meta":131,"stack":132,"stem":144,"tags":145,"url":148,"__hash__":149},"projects_pl\u002Fpl\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","Wewnętrzna platforma AI do operacji na treści, która zamienia research tematu w gotową treść: pełny pipeline RAG (Google Custom Search + RSS → scraping → generacja multi-provider → wektoryzacja), plus wersjonowane zewnętrzne API zasilające procesy treściowe innych projektów, w tym pipeline bloga DigiSpace.\n\n## Kluczowe funkcje\n\n- **Zewnętrzne API** - wersjonowane `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` z kluczami i limitami per klient udostępnia cały pipeline innym aplikacjom, synchronicznie lub asynchronicznie z callbackami\n- **Auto Pilot** - codzienne zaplanowane uruchomienia generują treść z nowych inspiracji lub własnych tematów, w pełni automatycznie\n- **AI bez przywiązania do dostawcy** - Gemini i OpenAI za abstrakcją driverów, więc zmiana modelu to konfiguracja, nie refaktoryzacja\n- **Pipeline semantyczny** - wyszukiwanie wektorowe na Qdrant deduplikuje i grupuje newsy zanim trafią do generacji\n- **Autonomiczna agregacja** - auto-wykrywanie kanałów RSS oraz Google Custom Search plus scraping zamieniają temat w samozasilające się źródło treści\n- **Widoczne wywołania LLM** - każda generacja jest śledzona w Langfuse: tokeny, opóźnienie, koszt\n- **Dostęp oparty na rolach** - role admin\u002Fcontent manager\u002Feditor, każde zapytanie ograniczone do właściciela poza adminem\n\n## Stos technologiczny\n\n- **Backend**: Laravel, agenci `laravel\u002Fai`\n- **Frontend**: Inertia.js + Vue 3 (SPA Search & Creation, edytor TipTap)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) za abstrakcją driverów\n- **Research**: Google Custom Search + agregacja RSS, scraping stron\n- **Baza wektorowa**: Qdrant do wyszukiwania semantycznego\n- **Obserwowalność**: Langfuse do śledzenia LLM\n- **Kolejka**: Laravel Horizon\n- **Testy**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","Platforma AI do operacji na treści — pipeline RAG (research → scraping → generacja → wektoryzacja), zewnętrzne API dla innych aplikacji oraz Auto Pilot do generacji bez udziału człowieka","\u002Fhero\u002Fnetpostpanel.avif",[128],{"label":129,"to":130,"color":19,"icon":51},"Przegląd projektu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview",{},[133,134,135,138,141],{"name":55,"icon":56},{"name":114,"icon":115},{"name":136,"icon":137},"Qdrant","i-simple-icons-qdrant",{"name":139,"icon":140},"Langfuse","i-heroicons-chart-bar",{"name":142,"icon":143},"Horizon","i-simple-icons-laravelhorizon","pl\u002Fprojects\u002Fnetpostpanel",[114,55,146,147,136,142],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","Gkp9EK0q-C32J7DZ0z0fi4In36IKL9zOIc9U4HbCAxA",{"id":151,"title":152,"content":153,"date":154,"description":155,"extension":9,"featured":41,"image":156,"links":157,"meta":162,"stack":163,"stem":182,"tags":183,"url":159,"__hash__":186},"projects_pl\u002Fpl\u002Fprojects\u002Fdigispace.yml","DigiSpace","Produkcyjna strona digispace.pro — publiczny serwis agencji, panel administracyjny i autorski CMS w jednej aplikacji Laravel, teraz w pełni wielojęzyczna (EN\u002FUK\u002FPL), z panelem Filament obok starego panelu na Inertia + Vue. Ten sam kod, który obsługuje żywą stronę, jest dostępny na GitHub.\n\n## Kluczowe funkcje\n\n- **Panel administracyjny Filament** - równoległy panel `\u002Fcontrol` (24 zasoby) z edytorem TipTap, przesyłaniem obrazów bezpośrednio do MinIO i nawigacją zorientowaną na treść, wdrażany zasób po zasobie obok istniejącego panelu Inertia\n- **Wielojęzyczność od podstaw** - tłumaczone są nie tylko strony, ale i strukturalne teksty UI (menu, stopka, przyciski) dla każdej lokalizacji, z routingiem opartym na hreflang\n- **SEO wbudowane** - dane strukturalne JSON-LD, zlokalizowane sitemapy i poprawna obsługa 404 dla każdej lokalizacji\n- **Monolit zrobiony dobrze** - publiczna strona i oba panele administracyjne w jednej aplikacji Laravel, bez osobnego API\n- **Treść pod kontrolą** - strony, usługi i portfolio edytuje się w CMS — bez deploymentu dla zmiany tekstu czy tłumaczenia\n- **Bramy jakości** - testy PHPUnit i analiza statyczna PHPStan w CI\n- **Otwarty kod** - dokładnie ten kod, który obsługuje digispace.pro, jest publiczny na GitHub\n\n## Stos technologiczny\n\n- **Backend**: Laravel\n- **Panel admina**: Filament 5 (`\u002Fcontrol`) + stary panel na Inertia.js + Vue\n- **Frontend**: Vue.js, Vite\n- **Lokalizacja**: tłumaczenia treści i struktury EN\u002FUK\u002FPL\n- **Architektura**: Niestandardowy CMS\n","2022-10-05","Wielojęzyczna (EN\u002FUK\u002FPL) produkcyjna strona agencji z autorskim CMS — panel Filament z rozbudowanym edytorem treści, tłumaczenia, JSON-LD i zlokalizowane sitemapy wbudowane obok starego panelu na Inertia + Vue","\u002Fhero\u002Fdigispace.avif",[158,160],{"label":45,"to":159,"color":47,"icon":20},"https:\u002F\u002Fdigispace.pro",{"label":49,"to":161,"color":19,"icon":51},"https:\u002F\u002Fgithub.com\u002FYurij2015\u002FDigiSpace",{},[164,165,168,169,172,175,178,179],{"name":55,"icon":56},{"name":166,"icon":167},"Inertia","i-simple-icons-inertia",{"name":70,"icon":71},{"name":170,"icon":171},"Vite","i-simple-icons-vite",{"name":173,"icon":174},"MySQL","i-simple-icons-mysql",{"name":176,"icon":177},"Tailwind CSS","i-simple-icons-tailwindcss",{"name":58,"icon":59},{"name":180,"icon":181},"CMS","i-heroicons-document-text","pl\u002Fprojects\u002Fdigispace",[55,58,166,70,184,185],"i18n","SEO","Fk6DSrh4wV9UrvlIWm6anLNeGfF5gl4G-jy8qzYVLUM",{"data":188,"body":189},{},{"type":190,"children":191},"root",[192,200,207,243,249,254,260],{"type":193,"tag":194,"props":195,"children":196},"element","p",{},[197],{"type":198,"value":199},"text","Docker pozwala umieścić aplikację i jej zależności w obrazie kontenera. Używam go do usług Laravel i Node.js w DigiPulse, VetSpace oraz NetPostPanel, od lokalnej pracy po wdrożenia na maszynach wirtualnych.",{"type":193,"tag":201,"props":202,"children":204},"h2",{"id":203},"jak-organizuję-kontenery",[205],{"type":198,"value":206},"Jak organizuję kontenery",{"type":193,"tag":208,"props":209,"children":210},"ul",{},[211,223,233],{"type":193,"tag":212,"props":213,"children":214},"li",{},[215,221],{"type":193,"tag":216,"props":217,"children":218},"strong",{},[219],{"type":198,"value":220},"Docker Compose",{"type":198,"value":222}," — wspólny opis aplikacji, procesów obsługujących zadania w tle i usług pomocniczych.",{"type":193,"tag":212,"props":224,"children":225},{},[226,231],{"type":193,"tag":216,"props":227,"children":228},{},[229],{"type":198,"value":230},"Budowanie wieloetapowe",{"type":198,"value":232}," — oddzielenie narzędzi budowania od końcowego obrazu uruchomieniowego.",{"type":193,"tag":212,"props":234,"children":235},{},[236,241],{"type":193,"tag":216,"props":237,"children":238},{},[239],{"type":198,"value":240},"Trwałe dane",{"type":198,"value":242}," — pliki bazy danych i przesłane materiały przechowywane poza wymienialnymi kontenerami.",{"type":193,"tag":201,"props":244,"children":246},{"id":245},"co-daje-przenośność",[247],{"type":198,"value":248},"Co daje przenośność",{"type":193,"tag":194,"props":250,"children":251},{},[252],{"type":198,"value":253},"Kontenery pomogły mi zmienić dostawcę hostingu bez odtwarzania środowiska aplikacji od podstaw. Na działanie systemu nadal wpływają konfiguracja, architektura procesora, sieć i dane. Sam Docker nie gwarantuje więc, że błąd z produkcji uda się odtworzyć lokalnie.",{"type":193,"tag":201,"props":255,"children":257},{"id":256},"kontrola-stanu-i-odzyskiwanie-działania",[258],{"type":198,"value":259},"Kontrola stanu i odzyskiwanie działania",{"type":193,"tag":194,"props":261,"children":262},{},[263],{"type":198,"value":264},"Health check zgłasza stan kontenera. Polityki restartu Dockera reagują na zakończenie procesu; sam status unhealthy nie powoduje ponownego uruchomienia. Trzeba to uwzględnić przy wdrażaniu i usuwaniu awarii, szczególnie w przypadku baz danych i procesów, które nie mogą zgubić rozpoczętych zadań."]