[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-uk-caddy":3,"technology-projects-uk-caddy":30,"mdc-17k8x9-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_uk\u002Fuk\u002Ftechnologies\u002Fcaddy.yml","Caddy","infrastructure","Caddy — це вебсервер і зворотне проксі, яке передає запити до потрібного застосунку. Я використовую його в інфраструктурі VetSpace, DigiPulse та інших сервісів, щоб з'єднати публічні домени із застосунками в Docker.\n\n## Як я використовую Caddy\n\n- **Маршрутизація запитів** — спрямування трафіку до застосунку або контейнера, що обслуговує домен.\n- **HTTPS** — автоматичне отримання й поновлення сертифікатів для налаштованих доменів.\n- **Зрозуміла конфігурація** — правила проксування у Caddyfile, які можна переглядати разом зі змінами застосунку.\n\n## Сертифікати та доступ до даних клінік\n\nАвтоматичний HTTPS потребує коректного DNS, перевірки домену й постійного сховища сертифікатів. Помилки поновлення все одно потрібно відстежувати. Сам застосунок має визначати клініку та перевіряти права доступу: зворотне проксі не забезпечує ізоляцію клієнтських даних.\n\n## Місце Caddy в інфраструктурі\n\nУ моїх Docker-середовищах Caddy дає змогу керувати вхідними запитами без громіздкої конфігурації. Окремо потрібно налаштувати тайм-аути, заголовки проксі та журнали доступу. Це допомагає, наприклад, простежити невдалий запит на запис до клініки від проксі до Laravel API.\n","Caddy для SaaS-застосунків: зворотне проксі, автоматичний HTTPS, маршрутизація доменів і доступ до сервісів у 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},"Технічна документація","https:\u002F\u002Fcaddyserver.com\u002Fdocs\u002Fautomatic-https",{},[23,24,25],"vetspace","digipulse","netpostpanel","2022","uk\u002Ftechnologies\u002Fcaddy","2026-09-20","y-kFYALqFhy0aXtUE5FWe_RYi6EFMeMKCNb3XsT2rdw",[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_uk\u002Fuk\u002Fprojects\u002Fvetspace.yml","VetSpace","Двостороння ветеринарна платформа — SEO-каталог клінік та CRM для підписки з призначеннями та записами пацієнтів. Публічний каталог клінік, побудований для SEO-first набуття клієнтів, та підписка на основі CRM (призначення, візити, записи пацієнтів) як окремі Vue\u002FNuxt додатки над одним Laravel API. Архітектура database-per-tenant, підписки Stripe через Cashier, GraphQL + REST, та аналіз візитів з допомогою AI через присвячений Go мікросервіс.\n\n## Ключові можливості\n\n- **Двостороння воронка** - SEO-каталог залучає клініки, а CRM за підпискою (візити, картки пацієнтів) їх утримує\n- **Справжня ізоляція тенантів** - database-per-tenant тримає дані кожної клініки окремо, а GDPR-експорт\u002Fвидалення — це операція на рівні бази\n- **Дві грані API** - GraphQL для складних запитів каталогу, REST для CRM — одна кодова база Laravel\n- **Білінг із коробки** - підписки Stripe через Cashier: тріали, зміна планів, dunning\n- **AI там, де допомагає** - аналіз візитів виконує окремий Go-мікросервіс, не навантажуючи основний API\n\n## Стек технологій\n\n- **Бекенд**: Laravel (API)\n- **Фронтенд**: Vue\u002FNuxt (окремі застосунки)\n- **Архітектура**: Database-per-tenant multi-tenancy\n- **Платежі**: Stripe через Cashier\n- **API**: GraphQL + REST\n- **AI**: Go-мікросервіс для аналізу візитів\n","2026-09-19","Двостороння ветеринарна платформа — SEO-каталог клінік та CRM для підписки з призначеннями та записами пацієнтів",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},"Огляд API","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api","i-simple-icons-github",{"label":49,"to":50,"color":16,"icon":47},"Огляд фронтенду","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":52,"to":53,"color":16,"icon":47},"Огляд 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","uk\u002Fprojects\u002Fvetspace",[76,57,60,77,66,72],"SaaS","Multi-tenant","DG_13GfOpIs-FP9mwOJDR33DOhZ0GdfeSK1u1JLzZt8",{"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_uk\u002Fuk\u002Fprojects\u002Fdigipulse.yml","DigiPulse","SaaS для моніторингу доступності — перевірки кожні 60 секунд, відстеження закінчення SSL, сповіщення через Telegram та email. Адмін панель та основний бекенд побудовані з Laravel (Octane, Reverb websockets) та Filament, а моніторинг-движок — окремий Go сервіс. Інтеграція Google OAuth sign-in та Cloudflare Turnstile. Включає MCP сервер, який надає дані моніторингу безпосередньо до AI асистентів. Self-hosted на Proxmox.\n\n## Ключові можливості\n\n- **Окремий Go-движок** - перевірки доступності виконує окремий Go-сервіс, тож постійний поллінг кожні 60 секунд не гальмує Laravel-застосунок\n- **Дашборд у реальному часі** - Reverb websockets передають зміни статусу в UI наживо, без ручного оновлення\n- **Octane + Filament** - резидентний у пам'яті Laravel із повною адмін-панеллю для моніторів, контактів і правил сповіщень\n- **MCP-сервер** - монітори та інциденти доступні для AI-асистентів (Claude, Cursor) через Model Context Protocol\n- **Google OAuth + Turnstile** - вхід без пароля та захист від ботів на публічних формах\n- **Self-hosted** - розгорнуто на власному Proxmox-хомлабі, який я адмініструю повністю\n\n## Стек технологій\n\n- **Бекенд**: Laravel (Octane, Reverb websockets)\n- **Адмін-панель**: Filament\n- **Движок моніторингу**: Go (окремий сервіс)\n- **База даних**: PostgreSQL\n- **Інтеграція AI**: MCP-сервер\n- **Інфраструктура**: Self-hosted на Proxmox\n","2026-04-17","SaaS для моніторингу доступності: event-driven архітектура — Laravel (Octane, Reverb) і Filament диспетчеризують перевірки через Redis у легкий Go-воркер; MCP-сервер дає дані моніторингу AI-асистентам; сповіщення Telegram\u002Femail","\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","uk\u002Fprojects\u002Fdigipulse",[76,57,99,113,109,105,114],"Monitoring","Event-driven","jNmJS9kMabUQ04ggukPIRPMSLui7xNAbE9Nsuuw99ag",{"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_uk\u002Fuk\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","Внутрішня AI-платформа для контент-операцій, яка перетворює дослідження теми на готовий контент: повний RAG-пайплайн (Google Custom Search + RSS → скрапінг → мультипровайдерна генерація → векторизація), плюс версіонований зовнішній API, що живить контент-процеси інших проєктів, зокрема блог-пайплайн DigiSpace.\n\n## Ключові можливості\n\n- **Зовнішній API** - версіонований `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` з ключами й лімітами на клієнта відкриває весь пайплайн для інших застосунків, синхронно або асинхронно з колбеками\n- **Auto Pilot** - щоденні заплановані запуски генерують контент з нових джерел натхнення чи власних тем без участі людини\n- **AI без прив'язки до провайдера** - Gemini та OpenAI за драйвер-абстракцією, тож зміна моделі — це конфіг, а не рефакторинг\n- **Семантичний пайплайн** - векторний пошук на Qdrant дедублікує й кластеризує новини ще до генерації\n- **Автономна агрегація** - авто-виявлення RSS-стрічок та Google Custom Search плюс скрапінг перетворюють тему на самопоповнюване джерело контенту\n- **Прозорі LLM-виклики** - кожна генерація трасується в Langfuse: токени, затримка, вартість\n- **Рольовий доступ** - ролі admin\u002Fcontent manager\u002Feditor, кожен запит обмежений власником, крім адміна\n\n## Стек технологій\n\n- **Бекенд**: Laravel, агенти `laravel\u002Fai`\n- **Фронтенд**: Inertia.js + Vue 3 (SPA Search & Creation, редактор TipTap)\n- **AI**: Мультипровайдерно (Gemini\u002FOpenAI) за драйвер-абстракцією\n- **Дослідження**: Google Custom Search + RSS-агрегація, скрапінг сторінок\n- **Векторна БД**: Qdrant для семантичного пошуку\n- **Обсервабельність**: Langfuse для LLM-трейсингу\n- **Черга**: Laravel Horizon\n- **Тести**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","AI-платформа для контент-операцій — RAG-пайплайн (дослідження → скрапінг → генерація → векторизація), зовнішній API для інших застосунків, та Auto Pilot для генерації без участі людини","\u002Fhero\u002Fnetpostpanel.avif",[124],{"label":125,"to":126,"color":16,"icon":47},"Огляд проєкту","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","uk\u002Fprojects\u002Fnetpostpanel",[72,57,142,143,132,138],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","aFH5L_k5kJI95DcFyQpS2By5vB1-qCqdu32coHU9QL8",{"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 — це вебсервер і зворотне проксі, яке передає запити до потрібного застосунку. Я використовую його в інфраструктурі VetSpace, DigiPulse та інших сервісів, щоб з'єднати публічні домени із застосунками в Docker.",{"type":152,"tag":160,"props":161,"children":163},"h2",{"id":162},"як-я-використовую-caddy",[164],{"type":157,"value":165},"Як я використовую 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},"Маршрутизація запитів",{"type":157,"value":181}," — спрямування трафіку до застосунку або контейнера, що обслуговує домен.",{"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}," — автоматичне отримання й поновлення сертифікатів для налаштованих доменів.",{"type":152,"tag":171,"props":193,"children":194},{},[195,200],{"type":152,"tag":175,"props":196,"children":197},{},[198],{"type":157,"value":199},"Зрозуміла конфігурація",{"type":157,"value":201}," — правила проксування у Caddyfile, які можна переглядати разом зі змінами застосунку.",{"type":152,"tag":160,"props":203,"children":205},{"id":204},"сертифікати-та-доступ-до-даних-клінік",[206],{"type":157,"value":207},"Сертифікати та доступ до даних клінік",{"type":152,"tag":153,"props":209,"children":210},{},[211],{"type":157,"value":212},"Автоматичний HTTPS потребує коректного DNS, перевірки домену й постійного сховища сертифікатів. Помилки поновлення все одно потрібно відстежувати. Сам застосунок має визначати клініку та перевіряти права доступу: зворотне проксі не забезпечує ізоляцію клієнтських даних.",{"type":152,"tag":160,"props":214,"children":216},{"id":215},"місце-caddy-в-інфраструктурі",[217],{"type":157,"value":218},"Місце Caddy в інфраструктурі",{"type":152,"tag":153,"props":220,"children":221},{},[222],{"type":157,"value":223},"У моїх Docker-середовищах Caddy дає змогу керувати вхідними запитами без громіздкої конфігурації. Окремо потрібно налаштувати тайм-аути, заголовки проксі та журнали доступу. Це допомагає, наприклад, простежити невдалий запит на запис до клініки від проксі до Laravel API."]