Cloud, Docker & DevOps — брзо и сигурно објавување
Ги контејнеризираме сите апликации со Docker, ги оркестрираме со Docker Compose (или Kubernetes за enterprise проекти), го конфигурираме Caddy како reverse proxy со автоматски SSL и го автоматизираме целиот циклус на објавување преку GitHub Actions — од commit до продукција.
Контејнеризација со Docker и Docker Compose
Секој сервис има свој multi-stage Dockerfile: build фаза што ги инсталира зависностите и компајлира, и минимална финална фаза (distroless или alpine) што ги содржи само потребните артефакти. Типична Next.js слика излегува под 150MB; FastAPI под 80MB. Сликите повторно се градат при секој merge на main и се означуваат семантички (`v1.2.3` + `latest`).
Docker Compose го дефинира целиот стек: фронтенд, API, DB, Redis, worker. Чувствителните променливи (лозинка за DB, API клучеви, Stripe secret) се во `.env` исклучен од git — никогаш не се хардкодираат во сликата. Health checks во Compose осигуруваат дека зависностите се подготвени пред стартот (DB подготвена → API старт → фронтенд старт).
- Build кеш со `--mount=type=cache` за npm ci во CI
- Оптимизиран редослед на слоеви: стабилни зависности → изворен код
- Управување со тајни со Docker secrets или HashiCorp Vault за enterprise проекти
- `restart: unless-stopped` + `docker compose up --no-deps` за атомско објавување
Caddy — модерен reverse proxy со автоматски SSL
Caddy 2.8 го управува SSL/TLS автоматски преку ACME (Let's Encrypt или ZeroSSL) — ниту еден истечен сертификат, никаква рачна конфигурација. HTTP/2 и HTTP/3 (QUIC) се активни по default. Безбедносните headers (HSTS, X-Frame-Options, CSP) се поставуваат глобално преку повторно употребливи snippet-и. Декларативната Caddyfile конфигурација може да се споредува (diff) и се верзионира во git.
Rate limiting, gzip/brotli компресија и структурирано JSON логирање се активираат преку вградени Caddy директиви — без nginx модули или сложена Apache конфигурација. Пристапот до чувствителни рути (`/admin`, `.env`, `.git`) враќа 444 (без одговор), конфигурирано како глобален безбедносен snippet.
- Само TLS 1.3 со модерни cipher suites
- On-demand TLS за multi-tenant SaaS со динамични поддомени
- Reload без прекин — `caddy reload` не ги прекинува активните врски
- Логирање Caddy → Loki → Grafana — анализа на сообраќајот и алармирање за аномалии
GitHub Actions CI/CD и мониторинг
CI pipeline-от се извршува при секој PR: lint, type check, unit тестови, build на Docker слика, скенирање на ранливости (Trivy). Ако сè помине, сликата се објавува на registry, а објавувањето на staging се прави автоматски. Merge на main = автоматско објавување во продукција со healthcheck по објавувањето. Автоматски rollback ако healthcheck-от падне во рок од 60 секунди.
Мониторинг со Grafana + Prometheus за апликативни метрики (латенција, error rate, големина на редица) и Loki за агрегација на логови. Алармите се конфигурирани на Slack/email: error rate >1%, латенција P95 >500ms, диск >85%. Надворешен uptime мониторинг со Better Uptime — јавна SLA контролна табла достапна на барање.
- Trivy скенирање на ранливости на сликите — блокада при Critical CVE
- Dependabot + auto-merge за patch ажурирања (потребен е зелен CI)
- Автоматски бекап на DB на S3-компатибилно складиште (секоја ноќ, чување 30 дена)
Предности и ограничувања
Предности
- Објавување со автоматски rollback при неуспешен healthcheck.
- Автоматски SSL/TLS преку Caddy — ниту еден рачно истечен сертификат.
- Репродуцибилна околина: истата Docker слика на dev, staging, продукција.
- Мониторинг и аларми (Grafana, Loki) — проблемите се гледаат пред корисниците.
Ограничувања
- Docker Compose не скалира како Kubernetes за enterprise со повеќе јазли.
- Почетното поставување на CI/CD бара време и DevOps експертиза.
- Сликите и логовите трошат дисковен простор — бараат периодично чистење.
- Комплетниот мониторинг (Prometheus + Grafana) додава сервиси за одржување.
Кус заклучок
Docker + Caddy + GitHub Actions е идеалната комбинација за сигурно објавување на VPS или неколку јазли. За десетици јазли со агресивно автоматско скалирање, премини на Kubernetes.
Табела со спецификации
| Можност | Граница / праг | Типична употреба | |
|---|---|---|---|
| Оркестрација | Docker Compose, комплетен стек | Еден јазол; повеќе јазли бараат Swarm/K8s | VPS, мали и средни проекти |
| Reverse proxy | Caddy 2.8, HTTP/3, автоматски SSL | Многу сложени правила бараат проширена конфигурација | Повеќе домени, multi-tenant |
| CI/CD | GitHub Actions, автоматско објавување | CI минутите се наплатуваат над бесплатното ниво | Автоматски од commit до продукција |
| Типичен трошок | VPS од ~5€/месец | Мониторингот + бекапот додаваат трошок | Од еден сајт до повеќе брендови |
Docker Compose наспроти Kubernetes
| Критериум | Docker Compose | Kubernetes |
|---|---|---|
| Сложеност на поставување | Мала | Голема |
| Скалирање со повеќе јазли / автоматско скалирање | Ограничено (еден јазол) | Одлично |
| Погоден за | VPS, мали и средни проекти | Големи флоти, enterprise |
Често поставувани прашања
Зошто Caddy, а не Nginx?
Caddy го управува SSL/TLS автоматски преку ACME, ги активира HTTP/2 и HTTP/3 по default и има кратка декларативна конфигурација. Nginx бара certbot и повеќе рачна конфигурација за ист резултат.
Дали ми треба Kubernetes?
Не за поголемиот дел од сајтовите. Docker Compose на VPS сигурно управува со еден сајт или неколку сервиси. Kubernetes станува корисен дури кај десетици јазли со агресивно автоматско скалирање.
Како функционира објавувањето?
GitHub Actions гради нова слика, ја стартува покрај старата, извршува healthcheck, па го префрла сообраќајот. Ако healthcheck-от падне во рок од 60 секунди, автоматски се прави rollback на претходната верзија.
Каков мониторинг препорачувате?
Grafana + Prometheus за метрики (латенција, error rate) и Loki за агрегирани логови, со аларми на Slack/email. За надворешен uptime додаваме независен сервис како Better Uptime.