Mindops Nasıl Deploy Ediyor: K3s + Orchestrator + Telegram
Mindops'u 'biz nasıl deploy ediyoruz' merak edenler için 10 dakikalık bir gezinti. Lokal docker compose'dan başlıyor, scripts/release.sh ile GHCR'a image basılıyor, K3s'e iniyor, mindops.net cert-manager TLS ile hazır oluyor — ve agent-orchestrator deploy sonrası dashboard'u Telegram'dan haberdar ediyor. 5 cron, 9 agent, 35 tablo, hepsi bu boruda akıyor.
Mindops Nasıl Deploy Ediyor: K3s + Orchestrator + Telegram
Bu yazıyı kim için yazıyoruz: "AI agent şirketi" hikâyesi sempatik ama "altyapısı ne" sorusu duruyorsa — işte boru hattı, manifestler, sayılar.
10 dakika sonra Mindops'un (mindops.net) prod'unun nasıl güncellendiğini ucu ucuna anlıyor olmalısınız. Bunu özellikle "K3s evimde de var, otomasyona girmeye değer mi" diye düşünen agency CTO'ları için yazıyoruz — kanıt, framework değil.
Topoloji (1 cümle)
Tek node K3s, namespace mindops, 1 Deployment (mindops-web), 1 StatefulSet
(postgres), 5 CronJob, 1 Ingress (nginx + cert-manager letsencrypt-prod),
GHCR'dan image pull. Repo: [email protected]:ErkutYavuzer/mindops.git. Image:
ghcr.io/erkutyavuzer/mindops-web.
Lokal geliştirme — docker compose up -d
Lokalde 2 servis: Postgres + Redis. Next.js 16 dev server npm run dev ile
ayakta. Drizzle migration'ları npm run db:migrate, seed npm run db:seed.
35 tablo — son 0022_add_version_columns Phase 1 optimistic-lock için.
Test ne çalıştırıyoruz: npm test Vitest, npm run typecheck. CI build'i
ana branch push'ta otomatik. (GHA ayarı şu an UI fix bekliyor — açık konu;
bu arada lokal release.sh çalışıyor.)
Image basma — scripts/release.sh
Bu script tek komutla şunları yapıyor:
git statusclean kontrolü (uncommitted değişiklik varsa durdurur)- Son commit hash'inden tag üret:
<short-sha>-<timestamp> - Multi-arch buildx (
linux/amd64) — Mac M1'imizde de düzgün çalışır - GHCR auth (Erkut'un PAT ile,
mindops-cronworkspace tarafında değilErkutYavuzeruser-scope'ta — bu ufak ama önemli ayrım, bir kere bug'a sebep oldu, CLAUDE.md'de "GHCR Actions Access fix" başlığı altında not) docker push ghcr.io/erkutyavuzer/mindops-web:<tag>ve:latest- Tag'ı yerel kubeconfig'e set:
kubectl set image deployment/mindops-web ... kubectl rollout statusbekle (default 5 dk timeout)
Çalışma süresi: ~3-4 dakika ortalama (M1 Macbook → home network → GHCR upload
- pull + rollout).
K3s manifest'leri — k8s/
Repo'da k8s/ klasörü, 6 dosya:
00-namespace.yaml— namespacemindops01-postgres.yaml— StatefulSet + PVC + Service02-secrets.yaml— TEMPLATE only (gerçek secret'lar K3s'te elle yaratıldı:mindops-env,mindops-cron,ghcr-pull)03-deployment.yaml—mindops-webDeployment, image:latest,imagePullPolicy: Always, env frommindops-env04-ingress.yaml— nginx ingress, hostmindops.net+www.mindops.net, TLS via cert-managerletsencrypt-prod05-cronjobs.yaml— 5 CronJob (yukarıda tablo)
Hepsini bir kerede uyguluyoruz: kubectl apply -f k8s/. Idempotent. Manifest
değişiklikleri PR'da review ediliyor.
Cron job'lar (5 — agent altyapısının kalbi)
0 2 * * * postgres-backup-daily pg_dump → PVC
30 8 * * * hub-daily agent-pm + customer + PA
0 9 * * * agent-orchestrator-daily site daily plan
0 3 * * 0 agent-ops-weekly broken link scan
0 6 1 * * hub-monthly agent-finance, recurring check
Her job mindops-cron secret'tan CRON_SECRET env'i okuyor, /api/cron/<job>
endpoint'ine Authorization: Bearer $CRON_SECRET ile POST atıyor. Endpoint
ilgili agent'ı tetikliyor.
Self-reporting: her job çalışınca agent_runs.action='cron_heartbeat' +
target=<job_name> row yazıyor. /admin/metrics panelinde fresh/stale/never
kolonu var — son 24 saatte heartbeat yoksa kırmızı uyarı banner'ı çıkar.
Deploy sonrası — agent-orchestrator + Telegram
Bu kısım hoşumuza gidiyor: deploy ettikten sonra 09:00'da agent-orchestrator
çalıştığında agent_runs tablosunu okuyor, son 24 saatte yeni image deploy
edilmiş mi (image tag değişimi) tespit ediyor, dashboard'da değişen şeyleri
özetliyor.
agent-personal-assistant ise her sabah 08:30'da hub-daily cron'unun
parçası olarak ekibe Telegram'dan günlük brifing atıyor. Brifing içeriği:
sprint ilerleme, atanmış görevler, bekleyen agent_proposals, son 24 saatte
deploy varsa "yeni sürüm canlı" satırı.
Yani şöyle bir döngü:
geliştirici release.sh çalıştırır
→ GHCR'a image push, K3s rollout
→ 09:00 agent-orchestrator: "yeni sürüm tespit"
→ 08:30 ertesi gün PA Telegram brief: "dün yeni release çıktı"
Hiç kimse "deploy ettim, ekibe bildireyim" diye Slack'e yazmıyor. Sistem zaten haberi duyuruyor. Geçen ay 12 deploy yapıldı, hiçbir manuel duyuru yapılmadı; her PA brief'inde haberler tıkır tıkır geçti.
Backup — günlük pg_dump
postgres-backup-daily CronJob'ı pg_dump çalıştırıp K3s persistent volume'e
yazıyor (PVC postgres-backups). Off-site replikasyon için R2 secret'ı
opsiyonel olarak hazırladık (k8s/README.md'de talimat) ama şu an bağlanmadı —
DR plan eksiği olarak biliyor ve ROADMAP'tayız.
Backup retention: 30 gün PVC'de, daha eskiyi pgbackrest veya manuel script
silebilir. Şu an 14 günlük backup'larımız var.
Observability
/admin/metrics— site içi dashboard/api/metrics/prom— Prometheus exposition (Bearer auth ile)
Metrics neler: mindops_agent_runs_total{agent}, mindops_cron_* (heartbeat
freshness), mindops_drafts* (bekleyen draft sayısı), mindops_leads*. Şu
an external Prometheus bağlı değil — endpoint hazır ama bizim için lokal
dashboard yeterli.
Özet (1 paragraf)
Mindops prod'u: tek node K3s, scripts/release.sh ile GHCR'a image, kubectl apply ile manifestler, cert-manager TLS, 5 cron job ile her şey kendi kendini schedule'lar, agent_runs tablosu her olayı yazar, agent-personal-assistant sabah ekibe Telegram'dan haberi duyurur. Tüm pipe'ı tek geliştirici bir sabahta kurabilir.
Sayılar (referans için)
- 9 agent, 35 tablo, 17 MCP tool, 5 cron job
- Image build + deploy süresi: ~3-4 dk
- Lokal Postgres seed → çalışır dev: ~10 dk yeni makinede
- DB backup retention: 14 gün PVC
Sizin agency'nizde aynı kuruluma ihtiyacınız varsa
Mindops'un Hub + 4 ops ajanı + MCP server'ı sizin K3s cluster'ınıza on-premise kuruluyor, 6-8 hafta süreyle birlikte. K3s yoksa beraber kuruyoruz; varsa mevcudunu kullanırız.
Discovery call için: mindops.net/enterprise
Veya kendi sistemimizi canlı izleyin: mindops.net/agents-live.