[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-docker":3,"technology-projects-en-docker":34,"mdc--schnrg-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_en\u002Fen\u002Ftechnologies\u002Fdocker.yml","Docker","infrastructure","Docker packages applications and their dependencies into container images. I use it for Laravel and Node.js services in projects such as DigiPulse, VetSpace and NetPostPanel, from local development to deployment on virtual machines.\n\n## How I structure containers\n\n- **Docker Compose** — describe the application, background workers and supporting services together.\n- **Multi-stage builds** — separate build tools from the final runtime image.\n- **Persistent storage** — keep database files and uploads outside replaceable containers.\n\n## What portability means in practice\n\nContainers helped me move workloads between hosting providers without rebuilding the application environment from scratch. They reduce differences between machines, but configuration, CPU architecture, network access and data still affect behavior. A production problem does not automatically reproduce locally just because both environments use Docker.\n\n## Health checks and recovery\n\nA health check reports container health. Docker restart policies react to container exits; an unhealthy status alone does not trigger a restart. Deployment checks and recovery procedures need to account for that distinction, particularly for workers and databases that must preserve work across releases.\n","Docker for Laravel and Node.js applications: reproducible environments, Compose services and container deployments for my SaaS projects.","yml",[11],{"label":12,"content":13},"When do you use Docker Compose instead of Kubernetes?","I use Compose for services managed on individual virtual machines. Kubernetes becomes an option when the project needs cluster scheduling and has the operational capacity to support it.","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},"Technical reference","https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fcontainers\u002Fstart-containers-automatically\u002F",{},[26,27,28,29],"digipulse","vetspace","netpostpanel","digispace","2019","en\u002Ftechnologies\u002Fdocker","2026-09-20","F76lNXh4wJaFmVmhoLA0F0BjoARVI7o_hKm-K7KEhnI",[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_en\u002Fen\u002Fprojects\u002Fdigipulse.yml","DigiPulse","Uptime monitoring SaaS — 60-second checks, SSL expiry tracking, Telegram and email notifications. The admin panel and core backend are built with Laravel (Octane, Reverb websockets) and Filament, while the monitoring engine is a separate Go service. Includes Google OAuth sign-in and Cloudflare Turnstile integration, plus an MCP server that exposes monitoring data directly to AI assistants. Self-hosted on Proxmox.\n\n## Key Features\n\n- **Dedicated Go engine** - availability checks run in a separate Go service, so constant 60-second polling never slows down the Laravel app\n- **Real-time dashboard** - Reverb websockets push status changes to the UI live, no manual refresh\n- **Octane + Filament** - resident-memory Laravel with a full admin panel for monitors, contacts and alert rules\n- **MCP server** - monitors and incidents are queryable from AI assistants (Claude, Cursor) via the Model Context Protocol\n- **Google OAuth + Turnstile** - passwordless sign-in and bot protection on public forms\n- **Self-hosted** - deployed on a Proxmox homelab I manage end-to-end\n\n## Tech Stack\n\n- **Backend**: Laravel (Octane, Reverb websockets)\n- **Admin Panel**: Filament\n- **Monitoring Engine**: Go (separate service)\n- **Database**: PostgreSQL\n- **AI Integration**: MCP server\n- **Infrastructure**: Self-hosted on Proxmox\n","2026-04-17","Uptime monitoring SaaS: event-driven architecture — Laravel (Octane, Reverb) + Filament dispatch checks through Redis to a lightweight Go worker; an MCP server exposes monitoring data to AI assistants; Telegram\u002Femail alerts",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","en\u002Fprojects\u002Fdigipulse",[77,55,61,78,73,67,79],"SaaS","Monitoring","Event-driven","b7hu-_otqukg-JY_hPBvmlUYk5jVOx42XpCotH6Cvqo",{"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_en\u002Fen\u002Fprojects\u002Fvetspace.yml","VetSpace","A two-sided veterinary platform — an SEO clinic catalog and a subscription-based CRM with appointments and patient records. A public clinic catalog built for SEO-first customer acquisition, and a subscription-based CRM (appointments, visits, patient records) as separate Vue\u002FNuxt apps on top of a single Laravel API. Database-per-tenant architecture, Stripe subscriptions via Cashier, GraphQL + REST, and AI-assisted visit analysis through a dedicated Go microservice.\n\n## Key Features\n\n- **Two-sided funnel** - an SEO-first public catalog acquires clinics; the subscription CRM (appointments, patient records) retains them\n- **True tenant isolation** - database-per-tenant keeps every clinic's data separate and makes GDPR export\u002Fdelete a per-database operation\n- **Dual API surface** - GraphQL for complex catalog queries, REST for the CRM — one Laravel codebase\n- **Billing built-in** - Stripe subscriptions via Cashier: trials, plan changes, dunning\n- **AI where it helps** - visit analysis runs in a dedicated Go microservice, keeping the main API unburdened\n\n## Tech Stack\n\n- **Backend**: Laravel (API)\n- **Frontend**: Vue\u002FNuxt (separate apps)\n- **Architecture**: Database-per-tenant multi-tenancy\n- **Payments**: Stripe via Cashier\n- **API**: GraphQL + REST\n- **AI**: Go microservice for visit analysis\n","2026-09-19","A two-sided veterinary platform — an SEO clinic catalog and a subscription-based CRM with appointments and patient records","\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 Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":95,"to":96,"color":19,"icon":51},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":98,"to":99,"color":19,"icon":51},"VetCard Overview","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","en\u002Fprojects\u002Fvetspace",[77,55,70,118,108,114],"Multi-tenant","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",{"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_en\u002Fen\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","An internal AI content-operations platform that turns topic research into publishable content: a full RAG pipeline (Google Custom Search + RSS → scraping → multi-provider generation → vectorization), plus a versioned external API that powers content workflows in other projects, including the DigiSpace blog pipeline.\n\n## Key Features\n\n- **External API** - a versioned `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` API with per-client keys and rate limits exposes the whole pipeline to other apps, sync or async with callbacks\n- **Auto Pilot** - scheduled daily runs generate content from new inspiration items or custom topics, fully unattended\n- **Provider-agnostic AI** - Gemini and OpenAI sit behind a driver abstraction, so swapping models is config, not refactoring\n- **Semantic pipeline** - Qdrant vector search deduplicates and clusters incoming stories before they reach generation\n- **Autonomous aggregation** - RSS auto-discovery and Google Custom Search plus scraping turn a bare topic into a self-feeding content source\n- **Observable LLM calls** - every generation is traced in Langfuse: tokens, latency, cost\n- **Role-based access** - admin\u002Fcontent manager\u002Feditor roles, with every query scoped to its owner unless admin\n\n## Tech Stack\n\n- **Backend**: Laravel, `laravel\u002Fai` agents\n- **Frontend**: Inertia.js + Vue 3 (Search & Creation SPA, TipTap editor)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) behind a driver abstraction\n- **Research**: Google Custom Search + RSS aggregation, page scraping\n- **Vector DB**: Qdrant for semantic search\n- **Observability**: Langfuse for LLM tracing\n- **Queue**: Laravel Horizon\n- **Tests**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","AI content-operations platform — a RAG pipeline (research → scrape → generate → vectorize), an external API other apps call, and Auto Pilot for unattended scheduled generation","\u002Fhero\u002Fnetpostpanel.avif",[128],{"label":129,"to":130,"color":19,"icon":51},"Overview","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","en\u002Fprojects\u002Fnetpostpanel",[114,55,146,147,136,142],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","9F27sKWiICL9ugPIbYmr3dQH8lYynDHYMUcKPSIVVGQ",{"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_en\u002Fen\u002Fprojects\u002Fdigispace.yml","DigiSpace","The production website behind digispace.pro — the agency's public site, admin panel and custom CMS in a single Laravel app, now fully multilingual (EN\u002FUK\u002FPL) with a Filament admin panel running alongside the legacy Inertia + Vue one. The same code that runs the live site is available on GitHub.\n\n## Key Features\n\n- **Filament admin panel** - a parallel `\u002Fcontrol` panel (24 resources) with a TipTap rich editor, straight-to-MinIO image uploads and content-first navigation, rolled out resource-by-resource next to the existing Inertia admin\n- **Multilingual by design** - both content and structural UI strings (menus, footer, buttons) are translated per locale, not just page text, with hreflang-aware localized routing\n- **SEO built in** - JSON-LD structured data, localized sitemaps and proper 404 handling across every locale\n- **Monolith done right** - public site and two admin surfaces live in one Laravel app, no separate API to maintain\n- **Self-managed content** - pages, services and portfolio entries are edited in the CMS — no deploy needed for a text or translation change\n- **Quality gates** - PHPUnit tests and PHPStan static analysis run in CI\n- **Source available** - the exact code serving digispace.pro is public on GitHub\n\n## Tech Stack\n\n- **Backend**: Laravel\n- **Admin**: Filament 5 (`\u002Fcontrol`) + legacy Inertia.js + Vue admin\n- **Frontend**: Vue.js, Vite\n- **Localization**: EN\u002FUK\u002FPL content and structure translations\n- **Architecture**: Custom CMS\n","2022-10-05","The agency's multilingual (EN\u002FUK\u002FPL) production site with a custom CMS — a Filament admin panel with a rich content editor, content translations, JSON-LD and localized sitemaps built in, alongside the legacy Inertia + Vue admin","\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","en\u002Fprojects\u002Fdigispace",[55,58,166,70,184,185],"i18n","SEO","dtWB-9st6fApdLs4qomkqmMQVq9PBqeHoPzR0Ywgu0I",{"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 packages applications and their dependencies into container images. I use it for Laravel and Node.js services in projects such as DigiPulse, VetSpace and NetPostPanel, from local development to deployment on virtual machines.",{"type":193,"tag":201,"props":202,"children":204},"h2",{"id":203},"how-i-structure-containers",[205],{"type":198,"value":206},"How I structure containers",{"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}," — describe the application, background workers and supporting services together.",{"type":193,"tag":212,"props":224,"children":225},{},[226,231],{"type":193,"tag":216,"props":227,"children":228},{},[229],{"type":198,"value":230},"Multi-stage builds",{"type":198,"value":232}," — separate build tools from the final runtime image.",{"type":193,"tag":212,"props":234,"children":235},{},[236,241],{"type":193,"tag":216,"props":237,"children":238},{},[239],{"type":198,"value":240},"Persistent storage",{"type":198,"value":242}," — keep database files and uploads outside replaceable containers.",{"type":193,"tag":201,"props":244,"children":246},{"id":245},"what-portability-means-in-practice",[247],{"type":198,"value":248},"What portability means in practice",{"type":193,"tag":194,"props":250,"children":251},{},[252],{"type":198,"value":253},"Containers helped me move workloads between hosting providers without rebuilding the application environment from scratch. They reduce differences between machines, but configuration, CPU architecture, network access and data still affect behavior. A production problem does not automatically reproduce locally just because both environments use Docker.",{"type":193,"tag":201,"props":255,"children":257},{"id":256},"health-checks-and-recovery",[258],{"type":198,"value":259},"Health checks and recovery",{"type":193,"tag":194,"props":261,"children":262},{},[263],{"type":198,"value":264},"A health check reports container health. Docker restart policies react to container exits; an unhealthy status alone does not trigger a restart. Deployment checks and recovery procedures need to account for that distinction, particularly for workers and databases that must preserve work across releases."]