Coolify Üzerinde Hermes Agent Dağıtımı: Çıkarılan Dersler
Coolify üzerinde kendi sunucunuzda barındırabileceğiniz bir yapay zeka ajanı için Traefik yönlendirmesini düzeltme, tünel ile genel dağıtım modları arasında seçim yapma ve mantıklı bir kimlik bilgisi modeli oluşturma.
Yayınlayan: FutureGo Studio
CoolifyHermes AgentDockerDevOpsSelf-hosting
NousResearch'ün Hermes Agent projesini, Coolify ile yönettiğim kendi VPS'imde çalıştırmak istedim. Varsayımım oldukça basitti: "bir docker-compose dosyası var, bunu Coolify'a veririm ve biter." Ama öyle olmadı. Bu yazıda nelerin ters gittiğini ve bunları nasıl çözdüğümü adım adım anlatıyorum; ortaya çıkan betik ve rehber ise github.com/yucel-yilmaz/hermes-agent-coolify-deploy adresinde açık kaynak olarak yer alıyor.
Coolify, bir Docker Compose projesini kendi yapısal varsayımlarıyla dağıtır: Servisleri kendi oluşturduğu bir ağa bağlar, nelerin dışarı açılması gerektiğini Traefik etiketleri (labels) aracılığıyla tespit eder ve ortam değişkenlerinin kendi arayüzünden yönetilmesini bekler.
Hermes Agent'ın upstream compose dosyası ise bağımsız çalışacak şekilde yazılmıştı:
Kendi ağlarını tanımlıyor ve sabit isimler bekliyor.
Portları doğrudan ana makineye (host) bağlıyor; bu da Coolify'ın ters proxy (reverse-proxy) modeliyle çelişiyor.
Bazı servisler, Coolify'ın konteynerleri yeniden başlatma şekliyle birleştiğinde yarış durumlarına (race conditions) yol açan depends_on sıralamasına ve sağlık kontrollerine (healthchecks) dayanıyor.
İlk denemede konteynerler sorunsuz çalıştı ancak Traefik bunların hiçbirini göremedi: Dışarıdan bakıldığında site yoktu, içeriden bakıldığında ise her şey "çalışıyor" durumdaydı.
Traefik yönlendirmesini düzeltme
Coolify'da bir servisi dışarı açmanın doğru yolu port bağlamak değil, servise Traefik etiketleri atamak ve onu Coolify'ın proxy ağına bağlamaktır. Compose dosyasındaki temel değişiklik şu şekildedir:
services: hermes-agent: # no host port binding: NO "- 8080:8080" networks: - coolify labels: - traefik.enable=true - traefik.http.routers.hermes.rule=Host(`hermes.example.dev`) - traefik.http.services.hermes.loadbalancer.server.port=8080networks: coolify: external: true
Burada iki nokta önem taşıyor:
Ana makine port bağlantılarını kaldırın. Aksi takdirde hem Traefik hem de ana makine aynı portu sahiplenmeye çalışır ve davranış dağıtım sırasına göre değişir; bu da hata ayıklaması en zor sorun türlerinden biridir.
coolify ağı external: true olmalıdır. Compose'un kendi ağını oluşturmasına izin vermek, servisi Traefik'in erişemeyeceği izole bir adaya yerleştirir.
Tünel mi yoksa genel alan adı mı?
Bir yapay zeka ajanını internete açarken varsayılan ayar "herkes erişebilir" olmamalıdır. Bu doğrultuda iki mod tanımladım:
Tünel modu (Tunnel mode): Servis asla genel bir alan adına bağlanmaz; erişim yalnızca bir SSH tüneli veya VPN üzerinden gerçekleşir. Tek kullanıcı bensem doğru seçim budur; saldırı yüzeyi neredeyse sıfıra iner.
Genel mod (Public mode): Servis, TLS yönetimi Coolify tarafından yapılan gerçek bir alan adının arkasında, Traefik üzerinde yer alır. Bu modda bir kimlik doğrulama katmanı zorunludur; ajanın uç noktasını korumasız bırakmak, VPS'inizi başkasının LLM faturasına dönüştürür.
Yazdığım betik her iki modu da destekliyor ve varsayılan olarak tünel modunu kullanıyor. Güvenli seçeneğin sonradan etkinleştirilen bir şey değil, varsayılan ayar olması gerektiğine inanıyorum.
Kimlik bilgilerinin yönetimi
Upstream yapılandırması API anahtarlarını bir .env dosyasından okur. Coolify ise gizli değişkenleri kendi arayüzü üzerinden tanımlar ve bunları konteynere ortam değişkenleri olarak aktarır. Buradaki tuzak şu: Coolify'ın compose dosyasındaki env_file yönergesini işleme şekli, beklediğiniz dosyayla eşleşmeyebilir.
Çözümüm, env_file bağımlılığını tamamen ortadan kaldırmak ve tüm gizli bilgileri Coolify'ın ortam yönetimine taşımak oldu. Bu sayede şunları elde edersiniz:
Gizli bilgiler asla depoya (repo) veya sunucudaki düz metin bir dosyaya temas etmez.
Coolify'ın yeniden dağıtım (redeploy) akışı, gizli bilgileri otomatik olarak taşır.
Güncelleme ve değiştirme (rotation) işlemleri tek bir merkezden yapılır.
Çıkardığım Dersler
Fork etmeyin, bir uyumlaştırma katmanı yazın. Orijinal compose dosyasını doğrudan düzenlemek yerine, onu dönüştüren bir betik yazmak, upstream güncellemelerini takip etmeyi çok daha kolaylaştırdı.
"Konteyner çalışıyor" ile "servise erişilebiliyor" farklı durumlardır. Coolify'da bir şeyler bozulduğunda bakılacak ilk yer uygulama günlükleri (logs) değil, Traefik'in servis keşif (service discovery) durumudur.
Varsayılanlar güvenli olmalıdır. Tünel modunu varsayılan yapmak, "sadece hızlıca denemek istemiştim ama yanlışlıkla internete açtım" gibi durumları yapısal olarak imkansız hale getirir.
Kendi sunucunda barındırmak (self-hosting) bir kez kurup bırakacağınız bir şey değil, işleteceğiniz bir süreçtir. Yeniden kurulum ve güncelleme yollarını belgelemek, dağıtım betiğinin kendisi kadar önemlidir.
Coolify üzerinde bir şeyler dağıtırken benzer bir engelle karşılaşırsanız, ilgili depoda (repo) bir sorun (issue) açmaktan çekinmeyin.
Coolify Üzerinde Hermes Agent Dağıtımı: Çıkarılan Dersler — FutureGo