[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-pl-caddy":3,"technology-projects-pl-caddy":30,"mdc-5boufj-key":146},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":11,"links":12,"meta":21,"projects":22,"since":26,"stem":27,"updated":28,"__hash__":29},"technologies_pl\u002Fpl\u002Ftechnologies\u002Fcaddy.yml","Caddy","infrastructure","Caddy to serwer WWW i odwrotne proxy, którego używam do kierowania żądań do aplikacji SaaS. W projektach takich jak VetSpace i DigiPulse łączy publiczne domeny z usługami działającymi w kontenerach Docker.\n\n## Jak korzystam z Caddy\n\n- **Kierowanie ruchu** — przekazywanie żądań do aplikacji lub kontenera obsługującego daną domenę.\n- **HTTPS** — automatyczne uzyskiwanie i odnawianie certyfikatów dla skonfigurowanych domen.\n- **Czytelna konfiguracja** — reguły w pliku Caddyfile, które można przeglądać razem ze zmianami aplikacji.\n\n## Certyfikaty a dostęp do danych placówki\n\nAutomatyczne HTTPS wymaga poprawnego DNS, weryfikacji domeny i trwałego przechowywania certyfikatów. Błędy odnawiania nadal trzeba monitorować. Sama aplikacja musi rozpoznawać placówkę i sprawdzać uprawnienia: odwrotne proxy nie zapewnia izolacji danych klientów.\n\n## Miejsce Caddy w infrastrukturze\n\nW moich środowiskach Docker Caddy ułatwia zarządzanie ruchem przychodzącym bez rozbudowanej konfiguracji proxy. Osobno trzeba dobrać limity czasu, przekazywane nagłówki i logi dostępu. Te szczegóły pomagają prześledzić na przykład nieudane żądanie rezerwacji od serwera proxy do API Laravel.\n","Caddy w aplikacjach SaaS: odwrotne proxy, automatyczne HTTPS, obsługa domen i kierowanie żądań do usług w kontenerach Docker.","yml",null,"i-simple-icons-caddy",[13,18],{"label":14,"to":15,"color":16,"icon":17},"caddyserver.com","https:\u002F\u002Fcaddyserver.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":16,"icon":17},"Dokumentacja techniczna","https:\u002F\u002Fcaddyserver.com\u002Fdocs\u002Fautomatic-https",{},[23,24,25],"vetspace","digipulse","netpostpanel","2022","pl\u002Ftechnologies\u002Fcaddy","2026-09-20","odSoXQrJDgJHdIIDDlGYf79GO0pLGV6q6w-M_xfmlpo",[31,79,116],{"id":32,"title":33,"content":34,"date":35,"description":36,"extension":9,"featured":37,"image":38,"links":39,"meta":54,"stack":55,"stem":74,"tags":75,"url":42,"__hash__":78},"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",true,"\u002Fhero\u002Fvetspace.avif",[40,44,48,51],{"label":41,"to":42,"color":43,"icon":17},"Live Demo","https:\u002F\u002Fvetspace.pro","primary",{"label":45,"to":46,"color":16,"icon":47},"Przegląd API","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api","i-simple-icons-github",{"label":49,"to":50,"color":16,"icon":47},"Przegląd frontendu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":52,"to":53,"color":16,"icon":47},"Przegląd VetCard","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard",{},[56,59,62,65,68,71],{"name":57,"icon":58},"Laravel","i-simple-icons-laravel",{"name":60,"icon":61},"Vue","i-simple-icons-vuedotjs",{"name":63,"icon":64},"Nuxt","i-simple-icons-nuxtdotjs",{"name":66,"icon":67},"Stripe","i-simple-icons-stripe",{"name":69,"icon":70},"GraphQL","i-simple-icons-graphql",{"name":72,"icon":73},"AI","i-heroicons-sparkles","pl\u002Fprojects\u002Fvetspace",[76,57,60,77,66,72],"SaaS","Multi-tenant","xvJ2gsG93A4aTrZYPgp4UuQdQsPe-Ae8ups9tasKAD8",{"id":80,"title":81,"content":82,"date":83,"description":84,"extension":9,"featured":37,"image":85,"links":86,"meta":92,"stack":93,"stem":111,"tags":112,"url":88,"__hash__":115},"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","\u002Fhero\u002Fdigipulse.avif",[87,89],{"label":41,"to":88,"color":43,"icon":17},"https:\u002F\u002Fdigipulse.cloud",{"label":90,"to":91,"color":16,"icon":47},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend",{},[94,95,98,101,104,107,108],{"name":57,"icon":58},{"name":96,"icon":97},"Filament","i-simple-icons-filament",{"name":99,"icon":100},"Go","i-simple-icons-go",{"name":102,"icon":103},"PostgreSQL","i-simple-icons-postgresql",{"name":105,"icon":106},"Redis","i-simple-icons-redis",{"name":60,"icon":61},{"name":109,"icon":110},"MCP","i-heroicons-cpu-chip","pl\u002Fprojects\u002Fdigipulse",[76,57,99,113,109,105,114],"Monitoring","Event-driven","GqA86kRO7Vh1dUrEBwiAh6SARuOescZleItqed4Wz8M",{"id":117,"title":118,"content":119,"date":120,"description":121,"extension":9,"featured":37,"image":122,"links":123,"meta":127,"stack":128,"stem":140,"tags":141,"url":144,"__hash__":145},"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",[124],{"label":125,"to":126,"color":16,"icon":47},"Przegląd projektu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview",{},[129,130,131,134,137],{"name":57,"icon":58},{"name":72,"icon":73},{"name":132,"icon":133},"Qdrant","i-simple-icons-qdrant",{"name":135,"icon":136},"Langfuse","i-heroicons-chart-bar",{"name":138,"icon":139},"Horizon","i-simple-icons-laravelhorizon","pl\u002Fprojects\u002Fnetpostpanel",[72,57,142,143,132,138],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","Gkp9EK0q-C32J7DZ0z0fi4In36IKL9zOIc9U4HbCAxA",{"data":147,"body":148},{},{"type":149,"children":150},"root",[151,159,166,202,208,213,219],{"type":152,"tag":153,"props":154,"children":155},"element","p",{},[156],{"type":157,"value":158},"text","Caddy to serwer WWW i odwrotne proxy, którego używam do kierowania żądań do aplikacji SaaS. W projektach takich jak VetSpace i DigiPulse łączy publiczne domeny z usługami działającymi w kontenerach Docker.",{"type":152,"tag":160,"props":161,"children":163},"h2",{"id":162},"jak-korzystam-z-caddy",[164],{"type":157,"value":165},"Jak korzystam z Caddy",{"type":152,"tag":167,"props":168,"children":169},"ul",{},[170,182,192],{"type":152,"tag":171,"props":172,"children":173},"li",{},[174,180],{"type":152,"tag":175,"props":176,"children":177},"strong",{},[178],{"type":157,"value":179},"Kierowanie ruchu",{"type":157,"value":181}," — przekazywanie żądań do aplikacji lub kontenera obsługującego daną domenę.",{"type":152,"tag":171,"props":183,"children":184},{},[185,190],{"type":152,"tag":175,"props":186,"children":187},{},[188],{"type":157,"value":189},"HTTPS",{"type":157,"value":191}," — automatyczne uzyskiwanie i odnawianie certyfikatów dla skonfigurowanych domen.",{"type":152,"tag":171,"props":193,"children":194},{},[195,200],{"type":152,"tag":175,"props":196,"children":197},{},[198],{"type":157,"value":199},"Czytelna konfiguracja",{"type":157,"value":201}," — reguły w pliku Caddyfile, które można przeglądać razem ze zmianami aplikacji.",{"type":152,"tag":160,"props":203,"children":205},{"id":204},"certyfikaty-a-dostęp-do-danych-placówki",[206],{"type":157,"value":207},"Certyfikaty a dostęp do danych placówki",{"type":152,"tag":153,"props":209,"children":210},{},[211],{"type":157,"value":212},"Automatyczne HTTPS wymaga poprawnego DNS, weryfikacji domeny i trwałego przechowywania certyfikatów. Błędy odnawiania nadal trzeba monitorować. Sama aplikacja musi rozpoznawać placówkę i sprawdzać uprawnienia: odwrotne proxy nie zapewnia izolacji danych klientów.",{"type":152,"tag":160,"props":214,"children":216},{"id":215},"miejsce-caddy-w-infrastrukturze",[217],{"type":157,"value":218},"Miejsce Caddy w infrastrukturze",{"type":152,"tag":153,"props":220,"children":221},{},[222],{"type":157,"value":223},"W moich środowiskach Docker Caddy ułatwia zarządzanie ruchem przychodzącym bez rozbudowanej konfiguracji proxy. Osobno trzeba dobrać limity czasu, przekazywane nagłówki i logi dostępu. Te szczegóły pomagają prześledzić na przykład nieudane żądanie rezerwacji od serwera proxy do API Laravel."]