[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-uk-docker":3,"technology-projects-uk-docker":34,"mdc--ii10b4-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_uk\u002Fuk\u002Ftechnologies\u002Fdocker.yml","Docker","infrastructure","Docker пакує застосунок і його залежності в контейнерний образ. Я використовую його для Laravel- і Node.js-сервісів у DigiPulse, VetSpace та NetPostPanel — від локальної розробки до розгортання на віртуальних машинах.\n\n## Як я організовую контейнери\n\n- **Docker Compose** — спільний опис застосунку, фонових обробників і допоміжних сервісів.\n- **Багатоетапні збірки** — відокремлення інструментів збірки від кінцевого образу для запуску.\n- **Постійне сховище** — зберігання файлів бази даних і завантажень поза контейнерами, які можна замінити.\n\n## Що дає переносність\n\nКонтейнери допомогли мені змінити провайдера хостингу без відтворення середовища застосунків із нуля. Проте на поведінку системи також впливають налаштування, архітектура процесора, мережа й дані. Сам факт використання Docker не гарантує, що виробнича помилка відтвориться локально.\n\n## Перевірка стану та відновлення\n\nHealth check показує стан контейнера. Політики перезапуску Docker реагують на завершення процесу; статус unhealthy сам по собі не запускає контейнер повторно. Цю різницю потрібно враховувати під час розгортання, особливо для фонових обробників і баз даних, де важливо зберегти незавершену роботу.\n","Docker для Laravel і Node.js: відтворювані середовища, сервіси Docker Compose та розгортання контейнерів у SaaS-проєктах.","yml",[11],{"label":12,"content":13},"Коли ви обираєте Docker Compose замість Kubernetes?","Використовую Compose для сервісів на окремих віртуальних машинах. Kubernetes розглядаю, коли проєкту потрібен розподіл завдань між вузлами й є ресурси для підтримки кластера.","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},"Технічна документація","https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fcontainers\u002Fstart-containers-automatically\u002F",{},[26,27,28,29],"digipulse","vetspace","netpostpanel","digispace","2019","uk\u002Ftechnologies\u002Fdocker","2026-09-20","OmnCv9T6r1_5gTRaBFburGoJ-h3uUwW83t7i0XZUp7w",[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_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",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","uk\u002Fprojects\u002Fdigipulse",[77,55,61,78,73,67,79],"SaaS","Monitoring","Event-driven","jNmJS9kMabUQ04ggukPIRPMSLui7xNAbE9Nsuuw99ag",{"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_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 для підписки з призначеннями та записами пацієнтів","\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},"Огляд API","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":95,"to":96,"color":19,"icon":51},"Огляд фронтенду","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":98,"to":99,"color":19,"icon":51},"Огляд 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","uk\u002Fprojects\u002Fvetspace",[77,55,70,118,108,114],"Multi-tenant","DG_13GfOpIs-FP9mwOJDR33DOhZ0GdfeSK1u1JLzZt8",{"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_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",[128],{"label":129,"to":130,"color":19,"icon":51},"Огляд проєкту","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","uk\u002Fprojects\u002Fnetpostpanel",[114,55,146,147,136,142],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","aFH5L_k5kJI95DcFyQpS2By5vB1-qCqdu32coHU9QL8",{"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_uk\u002Fuk\u002Fprojects\u002Fdigispace.yml","DigiSpace","Production-сайт digispace.pro — публічний сайт агенції, адмін-панель та кастомна CMS в одному застосунку Laravel, тепер повністю мультимовний (EN\u002FUK\u002FPL), з Filament-панеллю поруч зі старою адмінкою на Inertia + Vue. Той самий код, що працює на живому сайті, доступний на GitHub.\n\n## Ключові можливості\n\n- **Адмін-панель на Filament** - паралельна панель `\u002Fcontrol` (24 ресурси) з TipTap-редактором, заливкою зображень напряму в MinIO та контент-орієнтованою навігацією, впроваджена ресурс за ресурсом поруч з існуючою Inertia-адмінкою\n- **Мультимовність за задумом** - перекладаються не лише сторінки, а й структурні UI-рядки (меню, футер, кнопки) для кожної локалі, з hreflang-маршрутизацією\n- **SEO з коробки** - структуровані дані JSON-LD, локалізовані sitemap та коректна обробка 404 для кожної локалі\n- **Моноліт як треба** - публічний сайт і обидві адмінки в одному застосунку Laravel, без окремого API\n- **Самостійний контент** - сторінки, послуги й кейси редагуються в CMS — без деплою заради зміни тексту чи перекладу\n- **Брама якості** - PHPUnit-тести та статичний аналіз PHPStan у CI\n- **Відкритий код** - саме той код, що обслуговує digispace.pro, публічний на GitHub\n\n## Стек технологій\n\n- **Бекенд**: Laravel\n- **Адмінка**: Filament 5 (`\u002Fcontrol`) + стара адмінка на Inertia.js + Vue\n- **Фронтенд**: Vue.js, Vite\n- **Локалізація**: переклади контенту й структури EN\u002FUK\u002FPL\n- **Архітектура**: Кастомна CMS\n","2022-10-05","Мультимовний (EN\u002FUK\u002FPL) production-сайт агенції з кастомною CMS — Filament-панель з розширеним редактором контенту, переклади, JSON-LD і локалізовані sitemap із коробки, поруч зі старою адмінкою на 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","uk\u002Fprojects\u002Fdigispace",[55,58,166,70,184,185],"i18n","SEO","6eh_R4Py3nOuDZ26oLWb7x2WWp4iSV66uJrBh_MkX_U",{"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 пакує застосунок і його залежності в контейнерний образ. Я використовую його для Laravel- і Node.js-сервісів у DigiPulse, VetSpace та NetPostPanel — від локальної розробки до розгортання на віртуальних машинах.",{"type":193,"tag":201,"props":202,"children":204},"h2",{"id":203},"як-я-організовую-контейнери",[205],{"type":198,"value":206},"Як я організовую контейнери",{"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}," — спільний опис застосунку, фонових обробників і допоміжних сервісів.",{"type":193,"tag":212,"props":224,"children":225},{},[226,231],{"type":193,"tag":216,"props":227,"children":228},{},[229],{"type":198,"value":230},"Багатоетапні збірки",{"type":198,"value":232}," — відокремлення інструментів збірки від кінцевого образу для запуску.",{"type":193,"tag":212,"props":234,"children":235},{},[236,241],{"type":193,"tag":216,"props":237,"children":238},{},[239],{"type":198,"value":240},"Постійне сховище",{"type":198,"value":242}," — зберігання файлів бази даних і завантажень поза контейнерами, які можна замінити.",{"type":193,"tag":201,"props":244,"children":246},{"id":245},"що-дає-переносність",[247],{"type":198,"value":248},"Що дає переносність",{"type":193,"tag":194,"props":250,"children":251},{},[252],{"type":198,"value":253},"Контейнери допомогли мені змінити провайдера хостингу без відтворення середовища застосунків із нуля. Проте на поведінку системи також впливають налаштування, архітектура процесора, мережа й дані. Сам факт використання Docker не гарантує, що виробнича помилка відтвориться локально.",{"type":193,"tag":201,"props":255,"children":257},{"id":256},"перевірка-стану-та-відновлення",[258],{"type":198,"value":259},"Перевірка стану та відновлення",{"type":193,"tag":194,"props":261,"children":262},{},[263],{"type":198,"value":264},"Health check показує стан контейнера. Політики перезапуску Docker реагують на завершення процесу; статус unhealthy сам по собі не запускає контейнер повторно. Цю різницю потрібно враховувати під час розгортання, особливо для фонових обробників і баз даних, де важливо зберегти незавершену роботу."]