RAILSHOT.
Salona dön

Railshot

AI deployment & operations platform

Yerelde geliştirilen bir web uygulamasını hazır bulut ve şirket içi ortamlara dağıtmak, sonra işletmek.

Yerelde geliştirilen bir web uygulamasını hazır bulut ya da şirket içi ortamlara taşıyan ve işletmeyi sürdüren bir yapay zekâ dağıtım ve operasyon platformu.

2026.09.28 — 2026.10.04 · Tamamlandı

Ekip projesi · benim payım: CI planlama ve uygulaması, CSP kümeleri ve Ansible arayüzü, operasyonlar, ekip kod incelemesi ve entegrasyon

SoftBank Hackathon 2026 powered by KOREC & ProgateÖn eleme katılımcısı · final seçimi 2026.10.26 tarihinde açıklanacak (2026.10.07 itibarıyla)

  • WebUygulandı · hackathon
  • MCP sunucusuUygulandı · uzak · yerel

Operasyon ve müşteri uygulama kümeleri ayrıdır; herkese açık yol dağıtım denetiminden ayrı tutulur.

Operasyon K3s'inde pano, ürün API'si ve build controller platform rolündeki düğümlere, runner Job'ları ise build rolündeki bir düğüme yerleştirilir; dağıtımı Argo CD üstlenir. Müşteri uygulamaları, her kayıtlı hedef için ayrı, tek düğümlü bir K3s + Cilium kümesinin belirlenmiş bir namespace'inde çalışır.

Küme haritası · herkese açık 645e28a commit'indeki tanımlardan ve koddan çizildi
Railshot operasyon ve müşteri kümesi haritasıOperasyon K3s kümesi ve kayıtlı bir müşteri uygulama kümesi. Operasyon kümesinde railshot-system namespace'i panoyu, ürün API'sini, uzak MCP'yi (yalnızca image'ı sağlandığında) ve build controller'ı platform rolündeki düğümlere yerleştirir; railshot-build namespace'indeki runner Job'ları taint'li build rolündeki düğümde GitHub Actions işlerini alır. GitHub-hosted bir release işi, test edilmiş bundle'ı GHCR'a yayımlar. Ürün API'si workload'u config Git'e commit'ler ve argocd namespace'indeki bir Application'ı sync eder; Argo CD de müşteri kümesinde kayıtlı namespace'e bir Deployment, NodePort Service ve NetworkPolicy uygular. Uygulama istekleri sağlayıcının L7 girişinden düğümün NodePort'una ve Service'e, ardından uygulama Pod'una girer. Dağıtım hükmü yalnızca Argo durumuna ve herkese açık URL kontrolüne dayanır; Pod tanılamaları, günlükler ve metrikler ayrı sinyaller olarak okunur. Operatörün kurulum ve kayıt girdileri tenant uygulama payload'ından ayrı tutulur.Railshot kullanıcısıpano · MCPOperatör bootstrap'ıkurulum · kayıt · SecretGHCRdigest image'larıconfig Git deposuworkload.json · revisionSağlayıcı L7 girişiALB · GCP LB · AmphoraUygulama kullanıcısıherkese açık HTTPSGözlemci VMmüşteri K3s'i dışında · Composerailshot-systemdashboard · nginxuzak MCP · yalnızca image ilebuild controller · CronJobürün API'si · cd.js → bridge.pyargocdArgo CD · ApplicationAppProject · cluster Secretyenileme CronJob'u · 2 h'de birrailshot-buildrunner Job · hostNetwork · Docker socketrailshot-deploy.ymlloop job · self-hosted runnerrelease job · GitHub-hosted<app namespace>Deployment · Pod · digest image'ıNodePort Service · LocalNetworkPolicy · listelenen CIDR'larrailshot-argocd SA · tokenkube-systemCilium · Helm · VXLANrailshot-observabilitynode-exporterkube-state-metricsOperasyon kümesi · K3sAWS · rol düğümleriplatform rolündeki düğümlernodeSelectorbuild rolündeki düğümNoSchedule taintGitHubActions · GHCRMüşteri uygulama kümesi · örnekkayıtlı hedef başına birTek K3s düğümü · serverCilium · kube-proxy korundu1workflow_dispatch2runner Job'ını yenile3job'ı al4test edilmiş bundle5 digest ile yayımla · release job · GitHub-hosted → GHCR51workload commit · push2revision3 Application sync · ürün API'si · cd.js → bridge.py → Argo CD · Application34namespace'e uygula5digest ile pull1HTTPS 4432NodePort3 Pod'a · NodePort Service · Local → Deployment · Pod · digest image'ı34 politikayı uygula · Cilium · Helm · VXLAN → NetworkPolicy · listelenen CIDR'lar45 pano · API · Railshot kullanıcısı → dashboard · nginx51 revision · health · image'lar · ürün API'si · cd.js → bridge.py → Argo CD · Application12herkese açık HTTPS kontrolü3Pod tanılaması · hüküm değil4günlük sonu · Pod başına 100 satır5scrape · NodePort'lar6Blackbox probe1platform render · Secret2kayıt bootstrap'ı3K3s · Cilium kurulumu4TokenRequest · 6 h

Derleme → image yayını

Ürün API'si bir GitHub Actions çalıştırması ister ve build düğümündeki runner job'ı alıp kontrol eder. GHCR'a yalnızca aynı kontrollerden geçen bundle, GitHub-hosted bir release job tarafından yayımlanır.

  1. ürün API'si · cd.js → bridge.pyrailshot-systemçalıştırma · uygulama: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.yml

    Ürün API'si tenant, app, source commit ve target ile bir GitHub Actions çalıştırması ister. API hiçbir zaman bir runner Job'ını doğrudan çağırmaz.

  2. build controller · CronJobrailshot-systemçalıştırma · uygulama: runner Job'ını yenilerunner Job · hostNetwork · Docker socketrailshot-build

    build controller CronJob'u (her dakika, bir platform düğümünde) railshot-build namespace'inde runner Job'ları oluşturur. Role'ü yalnızca Job üzerinde get, list ve create ile tek runner kayıt Secret'ı üzerinde get, update ve patch izni verir; namespace ya da başka Secret oluşturamaz.

  3. runner Job · hostNetwork · Docker socketrailshot-buildçalıştırma · uygulama: job'ı alloop job · self-hosted runnerrailshot-deploy.yml

    Build rolündeki düğümdeki runner (kesin hostname, NoSchedule toleration) loop job'ını self-hosted etiketleriyle alır ve çalıştırır. Müşteri kaynağı mevcut kısıtlı Docker derleme ve kontrol konteynerlerinde çalışır.

  4. runner Job · hostNetwork · Docker socketrailshot-buildveri: test edilmiş bundlerelease job · GitHub-hostedrailshot-deploy.yml

    Loop job aynı kontrollerden geçen bundle'ı bırakır; release job yalnızca o bundle'ı alır.

  5. release job · GitHub-hostedrailshot-deploy.ymlveri: digest ile yayımlaGHCR

    GitHub-hosted bir release job (ubuntu-24.04) test edilmiş bundle'ın image'ını yeniden derlemeden GHCR'a yayımlar. Image yayımlama asla müşteri uygulama kümesinin içinde gerçekleşmez.

Config Git → Argo → müşteri namespace'i

Config Git istenen kaynakları, GHCR image baytlarını taşır. Argo CD yalnızca kayıtlı müşteri namespace'ine uygular.

  1. ürün API'si · cd.js → bridge.pyrailshot-systemveri: workload commit · pushconfig Git deposu

    cd.js, bridge.py'ı çalıştırır; bridge.py yalnızca yayın kaydı ile kayıtlı hedef uyuştuğunda workload.json'u commit'leyip push eder, ardından uzak revision'ı geri okur. Git istenen kaynakları, GHCR image baytlarını taşır.

  2. config Git deposuveri: revisionArgo CD · Applicationargocd

    Application yalnızca kısıtlı config deposunu, yolunu ve revision'ını okur.

  3. ürün API'si · cd.js → bridge.pyrailshot-systemçalıştırma · uygulama: Application syncArgo CD · Applicationargocd

    Adı belirli Application server-side apply ile ayarlanır ve tek bir kesin revision için prune olmadan sync istenir. Ürün API'sinin railshot-product ServiceAccount'u hem operatörün kurduğu kayıt bootstrap'ını (argocd'de Secret, AppProject ve Application için create; adı belirli Role'ler üzerinde get, update ve escalate) hem de doğrulanan her hedef için kesin adla eklenen get ve patch izinlerini taşır. Kubernetes create adla sınırlanamadığından adları kapsam içinde tutmak ürünün girdi doğrulamasına da düşer.

  4. Argo CD · Applicationargocdçalıştırma · uygulama: namespace'e uygula<app namespace>

    Argo CD, kayıtlı cluster Secret'ının kimlik bilgisiyle müşteri kümesindeki belirlenmiş namespace'e uygular. AppProject yalnızca namespace kapsamlı kind'lara izin verir, küme kapsamlı kaynaklara izin vermez.

  5. Deployment · Pod · digest image'ı<app namespace>veri: digest ile pullGHCR

    Yayımlanan digest image'ı, aynı namespace'te adıyla başvurulan bir pull Secret'ı ile çekilir. Secret değerleri asla artefakta ya da config Git'e girmez.

Herkese açık istek yolu

Uygulama istekleri sağlayıcı L7 girişi → düğüm NodePort'u → Service → uygulama Pod'u yolunu izler. Cilium'un politika uygulaması isteği taşıyan bir atlama değil, ayrı bir denetimdir. Operasyon panosuna giriş ayrı bir yoldur.

  1. Uygulama kullanıcısıveri: HTTPS 443Sağlayıcı L7 girişi

    Uygulama kullanıcıları kayıtlı hostname ile sağlayıcının L7 girişine ulaşır. Her sağlayıcı kendi girişini uygular.

  2. Sağlayıcı L7 girişiveri: NodePortNodePort Service · Local<app namespace>

    Giriş, düğümün özel adresine ve NodePort'una iletir. NodePort, hedef kaydında tahsis edilen değerdir.

  3. NodePort Service · Local<app namespace>veri: Pod'aDeployment · Pod · digest image'ı<app namespace>

    Service isteği aynı düğümdeki uygulama Pod'una (Deployment) gönderir. externalTrafficPolicy Local ile kaynak adres NetworkPolicy'nin kayıtlı CIDR kontrolüne değişmeden ulaşır.

  4. Cilium · Helm · VXLANkube-systemçalıştırma · uygulama: politikayı uygulaNetworkPolicy · listelenen CIDR'lar<app namespace>

    Cilium NetworkPolicy'yi uygular: giriş yalnızca kayıtlı CIDR'lardan uygulama portuna; varsayılan olarak çıkış yok, onaylı bir veritabanı adresi hariç. Bulut güvenlik duvarları ve host kuralları yine önemlidir.

  5. Railshot kullanıcısıveri: pano · APIdashboard · nginxrailshot-system

    Kullanıcılar operasyon girişinden nginx panosuna gelir ve nginx ürün API'sinin önünde durur. Pano Service'i yalnızca onaylı bir node port verildiğinde NodePort olur; API ClusterIP olarak kalır.

Doğrula · gözlemle

Dağıtım hükmü yalnızca Argo durumuna ve herkese açık URL kontrolüne dayanır. Pod tanılamaları, güncel günlükler ve işletim metrikleri onu asla değiştirmeyen ayrı sinyallerdir.

  1. ürün API'si · cd.js → bridge.pyrailshot-systemgözlem: revision · health · image'larArgo CD · Applicationargocd

    Deployed için Application'ın sync revision'ı, Synced ve Healthy, operation Succeeded ve Argo Application durumunda kaydedilen image referanslarının incelenen Deployment'ın digest image'larına eşit olması gerekir. Bu doğrudan bir Pod imageID geçidi değildir ve yeşil bir Argo durumu tek başına eşleşmeyi kanıtlamaz.

  2. ürün API'si · cd.js → bridge.pyrailshot-systemgözlem: herkese açık HTTPS kontrolüSağlayıcı L7 girişi

    Kayıtlı herkese açık URL yönlendirme olmadan kontrol edilir. Succeeded ancak hem Argo hükmü hem bu kontrol varsa kaydedilir.

  3. ürün API'si · cd.js → bridge.pyrailshot-systemgözlem: Pod tanılaması · hüküm değilDeployment · Pod · digest image'ı<app namespace>

    Argo hükmü ve herkese açık kontrolden sonra Deployment, ReplicaSet'ler ve Pod'lar kayıtlı kimlik bilgisiyle ayrıca okunur; imageID ve hazır olma durumu ready, progressing ya da unavailable tanılaması olarak eklenir. Başarısız ya da farklı bir tanılama deployed ya da succeeded hükmünü asla değiştirmez.

  4. ürün API'si · cd.js → bridge.pyrailshot-systemgözlem: günlük sonu · Pod başına 100 satırDeployment · Pod · digest image'ı<app namespace>

    Yalnızca şu anda dağıtılmış operation için, güvenilir config ve kayıtlı kimlik bilgisiyle. Her güncel Pod için (en fazla üç) çalışan image digest'i beklenen digest'e eşit olmalıdır; ardından bayt sınırı içinde Pod başına en fazla 100 maskelenmiş satır okunur. Daha eski bir deneme superseded, yapılandırma yoksa not_configured yanıtını verir. Bu bir günlük toplama sistemi değildir.

  5. Gözlemci VMgözlem: scrape · NodePort'larrailshot-observability

    Gözlemci VM'deki Prometheus, node-exporter ve kube-state-metrics'i güvenlik duvarıyla sınırlanmış iki NodePort üzerinden scrape eder. Eksik ya da eski değerler sıfır değil, bilinmeyendir.

  6. Gözlemci VMgözlem: Blackbox probeSağlayıcı L7 girişi

    probe_success=1 o probe konumunda bir 2xx anlamına gelir. Ne her kullanıcının erişimini ne de dağıtılan sürümü kanıtlar ve published'ı asla deployed'a yükseltmez.

Operatör kurulumu · kayıt

Küme kurulumu, kayıt bootstrap'ı ve hedef girdileri, Secret'lar ve kimlik bilgisi yenileme ayarı operatör girdileridir; asla tenant uygulama payload'ının parçası değildir.

  1. Operatör bootstrap'ıçalıştırma · uygulama: platform render · Secretrailshot-system

    Operatör platform tanımını render-platform.py ile üretir ve özel operasyon yapılandırmasını ve Secret'ları sağlar. Uzak MCP yalnızca image'ı sağlandığında, kişisel gateway (WireGuard) yalnızca --personal ile dahil edilir.

  2. Operatör bootstrap'ıçalıştırma · uygulama: kayıt bootstrap'ıAppProject · cluster Secretargocd

    Operatör argocd'ye kayıt bootstrap Role'ünü ve boş bir kayıtlar Role'ünü kurar ve hedef girdilerini hazırlar. Ardından ürün API'sinin çalıştırdığı kayıt yardımcıları (environment.py, applications.py) railshot-<target> Secret'ını kapsamı belirli bir kimlik bilgisiyle yazar (clusterResources false, izinli namespace'ler listelenmiş) ve doğrulanan kesin adları kayıtlar Role'üne ekler. Uygulama başına kayıt, bir app-<id> namespace'ini aynı adlı bir AppProject'e bağlar.

  3. Operatör bootstrap'ıçalıştırma · uygulama: K3s · Cilium kurulumuCilium · Helm · VXLANkube-system

    install-k3s.sh tek düğümlü bir K3s server kurar (flannel, network policy, traefik ve servicelb kapalı; kube-proxy korunur) ve Cilium bir Helm release olarak kurulur (kubeProxyReplacement false, VXLAN, Hubble kapalı).

  4. yenileme CronJob'u · 2 h'de birargocdçalıştırma · uygulama: TokenRequest · 6 hrailshot-argocd SA · token<app namespace>

    railshot-credentials CronJob'u iki saatte bir müşteri SA'sı için altı saatlik yeni bir token ister. Müşteri tarafındaki Role yalnızca kendi SA'sı için token create'e izin verir. Altı saat bir token'ın TTL'sidir, operatör erişiminin bittiği an değildir.

Her bağlantı aynı kalınlıkta. Yalnızca yolunu numaralı adımlarla vurgulamak için bir akış seçin.

  • Düz çizgi · isteklerin, bundle'ların, image'ların ve tanımların akış yönü
  • Kesikli · çalıştırma istekleri, uygulama, kurulum, kimlik bilgileri
  • Uzun çizgi-nokta · durum, günlük, probe ve metrik okuma; hükümden ayrı
  • Kalın siyah çizgi · seçilen akış; numaralar sırayı verir
  • Kutu · bir namespace, başlığında adı (düğüm değil)
  • İç çip · o namespace'teki bir bileşen
  • Kesikli kutu · kümelerin dışı
  • railshot-system · ürün
  • argocd · dağıtım yetkisi
  • railshot-build · host Docker yetkisi
  • GitHub · müşteri kümesi

docs/architecture'daki October 2 yerleşim kararı (iki rol düğümü) ve herkese açık README diyagramı geçmiştir; bu harita 645e28a'daki tanımları ve kodu izler. Oklar nedeni ve yönü gösterir; her sağlayıcı yolunun şu anda canlı olduğunun kanıtı değildir.

Namespace'ler ve düğümler
Bir namespace bir adlandırma kapsamıdır: ne donanımdır ne de tek başına bir güvenlik sınırıdır. Platform ve build rolleri nodeSelector ve taint ile yapılan zamanlama yerleşimidir; bu harita operasyon kümesinin düğüm sayısını sabitlemez. Argo CD'nin düğüm yerleşimi de ayrı bir kontroldür.
Build düğümü yetkisi
Runner Job'ları hostNetwork, host Docker soketi, NET_ADMIN ve root ile çalışır. Bir namespace, taint ya da RBAC host Docker yetkisini kaldırmaz; bu yüzden bu ne VM yöneticisinden yalıtımdır ne de rastgele kod için bir sandbox.
Müşteri namespace'i
Her kayıtlı hedef, varsayılan olmayan bir namespace ve AppProject kullanır (örneğin tenant-demo ya da uygulama başına app-<id>). Yalnızca tek bir hizmetin Deployment'ı (ServiceAccount token otomatik bağlama kapalı), NodePort Service'i ve NetworkPolicy'si ile isteğe bağlı bir PVC ya da migration Job'ı oluşturulur; Secret'lara yalnızca adla başvurulur (pull Secret'ı ve onaylı bir DATABASE_URL), asla oluşturulmaz.
AWS girişi
Route 53 Alias → paylaşılan ALB HTTPS 443 → müşteri düğümünün özel adresi ve NodePort'u. Birçok uygulama tek bir düğümü yeniden kullanır; her birinin kendi namespace'i, Application'ı ve NodePort'u vardır.
GCP girişi
Global EXTERNAL_MANAGED HTTPS LB → bölgesel GCE_VM_IP_PORT NEG → mevcut VM'in özel NodePort'u. Sertifikalar DNS yetkilendirmesiyle Certificate Manager'dan gelir. Modül ne VM'in ne de VPC'nin sahibidir ve tek VM tek hata noktası olarak kalır.
OpenStack girişi
Host ve path L7 politikalarıyla Amphora TLS listener 443 → HTTP NodePort. Varsayılan adres özel bir VIP'dir; Octavia, K3s, veritabanı ve DNS modülün dışındadır. Herkese açık erişilebilirlik ve sahada Amphora hazırlığı ayrı kabul gerektirir; bu modülle henüz sahada hiçbir apply doğrulanmadı.
Sağlayıcılar arasında
Üç giriş ayrı uygulamalardır; sağlayıcılar arasında otomatik failover ya da replikasyon yoktur. Müşteri uygulama kümesi kayıtlı bir hedefin örneğidir; aynı dağıtımın her bulutta aynı anda çalıştığı iddiası değildir.
Operatör seçenekleri
Kişisel gateway (WireGuard), platforma yalnızca operatör --personal'ı etkinleştirdiğinde katılır; müşteri bulutları için zorunlu bir yol değildir. Desteklenen direct modda gözlemci VM, operasyon kontrol VM'ini paylaşabilir.