RAILSHOT.
Tagasi saali

Railshot

AI deployment & operations platform

Lokaalselt ehitatud veebirakendus ettevalmistatud pilve- ja kohapealsetesse keskkondadesse juurutamiseks ja käitamiseks.

AI-põhine juurutus- ja käitusplatvorm, mis viib lokaalselt ehitatud veebirakenduse ettevalmistatud pilve- või kohapealsetesse keskkondadesse ja hoiab seda töös.

28. september 2026 – 4. oktoober 2026 · Lõppenud

Meeskonnaprojekt · minu osa: CI kavandamine ja teostus, CSP klastrid ja Ansible'i liides, käitamine, meeskonna koodiülevaatus ja integreerimine

SoftBank Hackathon 2026 powered by KOREC & ProgateEelvooru osaleja · finaali valik kuulutatakse välja 26. oktoobril 2026 (seisuga 7. oktoober 2026)

  • VeebTeostatud · häkaton
  • MCP-serverTeostatud · kaug · kohalik

Käitus- ja kliendirakenduste klastrid on eraldi ning avalik tee hoitakse juurutuse juhtimisest lahus.

Käitus-K3s-is paiknevad juhtpaneel, toote API ja build controller platform-rolli sõlmedel ning runner-Jobid build-rolli sõlmel, juurutamise eest vastutab Argo CD. Kliendirakendused töötavad määratud nimeruumis eraldi ühe sõlmega K3s + Cilium klastris iga registreeritud sihtmärgi kohta.

Klastri kaart · joonistatud avaliku commiti 645e28a deklaratsioonide ja koodi põhjal
Railshoti käitus- ja kliendiklastrite kaartKäitus-K3s-klaster ja registreeritud kliendirakenduse klaster. Käitusklastris paigutab nimeruum railshot-system juhtpaneeli, toote API, kaug-MCP (ainult kui selle tõmmis on antud) ja build controlleri platform-rolli sõlmedele; nimeruumi railshot-build runner-Jobid võtavad GitHub Actionsi töid vastu taint'iga build-rolli sõlmel. GitHubi hostitud release-job avaldab testitud kimbu GHCR-is. Toote API commitib töökoormuse config Giti ja sünkroonib Applicationi nimeruumis argocd ning Argo CD rakendab Deploymenti, NodePort Service'i ja NetworkPolicy kliendiklastris registreeritud nimeruumi. Rakenduse päringud sisenevad pakkuja L7-sisenemispunktist sõlme NodePorti ja Service'isse ning seejärel rakenduse Podi. Juurutuse verdikt põhineb ainult Argo olekul ja avaliku URL-i kontrollil; Podi diagnostikat, logisid ja mõõdikuid loetakse eraldi signaalidena. Operaatori paigaldus- ja registreerimissisendid hoitakse kliendirakenduse kasulikust koormusest lahus.Railshoti kasutajajuhtpaneel · MCPOperaatori bootstrappaigaldus · registreerimine · SecretGHCRtõmmised räsigaconfig Giti repositooriumworkload.json · revisionPakkuja L7-sisenemispunktALB · GCP LB · AmphoraRakenduse kasutajaavalik HTTPSVaatlus-VMkliendi K3s-ist väljas · Composerailshot-systemdashboard · nginxkaug-MCP · ainult tõmmisegabuild controller · CronJobtoote API · cd.js → bridge.pyargocdArgo CD · ApplicationAppProject · cluster Secretuuendamise CronJob · iga 2 hrailshot-buildrunner Job · hostNetwork · Docker socketrailshot-deploy.ymlloop job · self-hosted runnerrelease job · GitHub-hosted<app namespace>Deployment · Pod · tõmmis räsigaNodePort Service · LocalNetworkPolicy · loetletud CIDR-idrailshot-argocd SA · tokenkube-systemCilium · Helm · VXLANrailshot-observabilitynode-exporterkube-state-metricsKäitusklaster · K3sAWS · rollisõlmedplatform-rolli sõlmednodeSelectorbuild-rolli sõlmNoSchedule taintGitHubActions · GHCRKliendirakenduse klaster · näideüks iga registreeritud sihtmärgi kohtaÜks K3s sõlm · serverCilium · kube-proxy alles1workflow_dispatch2runner-Jobide täiendamine3töö vastuvõtt4testitud kimp5 avaldamine räsi järgi · release job · GitHub-hosted → GHCR51workload commit · push2revision3 Application sync · toote API · cd.js → bridge.py → Argo CD · Application34rakendamine nimeruumi5allalaadimine räsi järgi1HTTPS 4432NodePort3 Podile · NodePort Service · Local → Deployment · Pod · tõmmis räsiga34 poliitika jõustamine · Cilium · Helm · VXLAN → NetworkPolicy · loetletud CIDR-id45 juhtpaneel · API · Railshoti kasutaja → dashboard · nginx51 redaktsioon · health · tõmmised · toote API · cd.js → bridge.py → Argo CD · Application12avalik HTTPS-kontroll3Podi diagnostika · mitte verdikt4logi tail · 100 rida Podi kohta5scrape · NodePortid6Blackbox probe1platvormi renderdamine · Secret2registreerimise bootstrap3K3s-i · Ciliumi paigaldus4TokenRequest · 6 h

Ehitus → tõmmise avaldamine

Toote API taotleb GitHub Actionsi käivitust ning build-sõlme runner võtab töö vastu ja kontrollib seda. Ainult samad kontrollid läbinud kimp avaldatakse GHCR-is GitHubi hostitud release-jobiga.

  1. toote API · cd.js → bridge.pyrailshot-systemkäivitus · rakendamine: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.yml

    Toote API taotleb GitHub Actionsi käivitust väärtustega tenant, app, lähte-commit ja sihtmärk. API ei kutsu kunagi runner-Jobi otse.

  2. build controller · CronJobrailshot-systemkäivitus · rakendamine: runner-Jobide täiendaminerunner Job · hostNetwork · Docker socketrailshot-build

    Build controlleri CronJob (iga minut, platform-sõlmel) loob runner-Jobe nimeruumi railshot-build. Selle Role lubab ainult Jobide get, list ja create ning get, update ja patch ühele runneri registreerimise Secretile; see ei saa luua nimeruume ega muid Secrete.

  3. runner Job · hostNetwork · Docker socketrailshot-buildkäivitus · rakendamine: töö vastuvõttloop job · self-hosted runnerrailshot-deploy.yml

    Build-rolli sõlme runner (täpne hostname, NoSchedule-toleratsioon) võtab loop-jobi oma self-hosted siltide järgi ja käivitab selle. Kliendi lähtekood töötab olemasolevates piiratud Dockeri ehitus- ja kontrollikonteinerites.

  4. runner Job · hostNetwork · Docker socketrailshot-buildandmed: testitud kimprelease job · GitHub-hostedrailshot-deploy.yml

    Loop-job jätab samad kontrollid läbinud kimbu ja release-job võtab ainult selle kimbu.

  5. release job · GitHub-hostedrailshot-deploy.ymlandmed: avaldamine räsi järgiGHCR

    GitHubi hostitud release-job (ubuntu-24.04) avaldab testitud kimbu tõmmise GHCR-is ilma seda uuesti ehitamata. Tõmmiste avaldamine ei toimu kunagi kliendirakenduse klastris.

Config Git → Argo → kliendi nimeruum

Config Git kannab soovitud ressursse ja GHCR tõmmise baite. Argo CD rakendab ainult registreeritud kliendi nimeruumi.

  1. toote API · cd.js → bridge.pyrailshot-systemandmed: workload commit · pushconfig Giti repositoorium

    cd.js käivitab bridge.py, mis commitib ja push'ib faili workload.json ainult siis, kui avaldamiskirje ja registreeritud sihtmärk ühtivad, ning loeb seejärel kaugredaktsiooni tagasi. Git kannab soovitud ressursse; GHCR kannab tõmmise baite.

  2. config Giti repositooriumandmed: revisionArgo CD · Applicationargocd

    Application loeb ainult oma piiratud config-repositooriumi, teed ja redaktsiooni.

  3. toote API · cd.js → bridge.pyrailshot-systemkäivitus · rakendamine: Application syncArgo CD · Applicationargocd

    Nimetatud Application seatakse server-side apply'ga ja taotletakse ühe täpse redaktsiooni sünkroonimist ilma prune'ita. Toote API ServiceAccountil railshot-product on nii operaatori paigaldatud registreerimise bootstrap (create Secretitele, AppProjectidele ja Applicationitele nimeruumis argocd; get, update ja escalate nimetatud Role'idele) kui ka get- ja patch-õigused, mis lisatakse iga valideeritud sihtmärgi jaoks täpse nimega. Kubernetese create'i ei saa nimega piirata, seega hoiab nimesid ulatuse piires ka toote sisendi valideerimine.

  4. Argo CD · Applicationargocdkäivitus · rakendamine: rakendamine nimeruumi<app namespace>

    Argo CD rakendab kliendiklastri määratud nimeruumi registreeritud klastri-Secreti mandaadiga. AppProject lubab ainult nimeruumipõhiseid tüüpe ja ei luba klastriüleseid ressursse.

  5. Deployment · Pod · tõmmis räsiga<app namespace>andmed: allalaadimine räsi järgiGHCR

    Avaldatud räsiga tõmmis laaditakse alla samas nimeruumis nimega viidatud pull-Secretiga. Secretite väärtused ei jõua kunagi artefakti ega config Giti.

Avalik päringutee

Rakenduse päringud liiguvad teed pakkuja L7-sisenemispunkt → sõlme NodePort → Service → rakenduse Pod. Ciliumi poliitika jõustamine on eraldi kontroll, mitte päringut kandev samm. Pääs käituse juhtpaneelile on eraldi tee.

  1. Rakenduse kasutajaandmed: HTTPS 443Pakkuja L7-sisenemispunkt

    Rakenduse kasutajad jõuavad pakkuja L7-sisenemispunkti registreeritud hostinime kaudu. Iga pakkuja teostab oma sisenemispunkti.

  2. Pakkuja L7-sisenemispunktandmed: NodePortNodePort Service · Local<app namespace>

    Sisenemispunkt edastab sõlme privaatsele aadressile ja NodePortile. NodePort on see, mis eraldati sihtmärgi registreerimisel.

  3. NodePort Service · Local<app namespace>andmed: PodileDeployment · Pod · tõmmis räsiga<app namespace>

    Service saadab päringu sama sõlme rakenduse Podile (Deployment). Seadega externalTrafficPolicy Local jõuab lähteaadress NetworkPolicy registreeritud CIDR-ide kontrollini muutmata kujul.

  4. Cilium · Helm · VXLANkube-systemkäivitus · rakendamine: poliitika jõustamineNetworkPolicy · loetletud CIDR-id<app namespace>

    Cilium jõustab NetworkPolicy: sissetulev liiklus ainult registreeritud CIDR-idest rakenduse porti; väljuvat liiklust vaikimisi ei ole, välja arvatud heakskiidetud andmebaasi aadress. Pilve tulemüürid ja hosti reeglid on endiselt olulised.

  5. Railshoti kasutajaandmed: juhtpaneel · APIdashboard · nginxrailshot-system

    Kasutajad tulevad käituse sisenemispunkti kaudu nginx'i juhtpaneelile ja nginx on toote API ees. Juhtpaneeli Service on NodePort ainult siis, kui antud on heakskiidetud sõlmeport; API jääb ClusterIP-ks.

Verifitseerimine · vaatlus

Juurutuse verdikt põhineb ainult Argo olekul ja avaliku URL-i kontrollil. Podi diagnostika, praegused logid ja käitusmõõdikud on eraldi signaalid, mis seda kunagi ei muuda.

  1. toote API · cd.js → bridge.pyrailshot-systemvaatlus: redaktsioon · health · tõmmisedArgo CD · Applicationargocd

    Deployed nõuab Applicationi sünkroonimisredaktsiooni, olekuid Synced ja Healthy, operatsiooni Succeeded ning et Argo Applicationi olekus salvestatud tõmmiseviited oleksid võrdsed üle vaadatud Deploymenti räsiga tõmmistega. See ei ole otsene Podi imageID-värav ja roheline Argo olek üksi vastavust ei tõenda.

  2. toote API · cd.js → bridge.pyrailshot-systemvaatlus: avalik HTTPS-kontrollPakkuja L7-sisenemispunkt

    Registreeritud avalikku URL-i kontrollitakse ilma ümbersuunamisteta. Succeeded salvestatakse ainult siis, kui olemas on nii Argo verdikt kui ka see kontroll.

  3. toote API · cd.js → bridge.pyrailshot-systemvaatlus: Podi diagnostika · mitte verdiktDeployment · Pod · tõmmis räsiga<app namespace>

    Pärast Argo verdikti ja avalikku kontrolli loetakse Deployment, ReplicaSetid ja Podid registreeritud mandaadiga eraldi ning imageID ja valmidus lisatakse ready-, progressing- või unavailable-diagnostikana. Ebaõnnestunud või erinev diagnostika ei muuda kunagi verdikti deployed või succeeded.

  4. toote API · cd.js → bridge.pyrailshot-systemvaatlus: logi tail · 100 rida Podi kohtaDeployment · Pod · tõmmis räsiga<app namespace>

    Ainult praegu juurutatud operatsioonile, usaldatud konfiguratsiooni ja registreeritud mandaadiga. Iga praeguse Podi (kuni kolm) töötava tõmmise räsi peab võrduma oodatud räsiga; seejärel loetakse baidipiirangu piires kuni 100 varjatud rida Podi kohta. Vanemale katsele vastatakse superseded; konfiguratsioonita not_configured. See ei ole logide koondamine.

  5. Vaatlus-VMvaatlus: scrape · NodePortidrailshot-observability

    Vaatlus-VM-i Prometheus kogub node-exporterit ja kube-state-metrics'it kahe tulemüüriga piiratud NodePorti kaudu. Puuduvad või aegunud väärtused on teadmata, mitte null.

  6. Vaatlus-VMvaatlus: Blackbox probePakkuja L7-sisenemispunkt

    probe_success=1 tähendab 2xx vastust selles sondi asukohas. See ei tõenda iga kasutaja ligipääsu ega juurutatud versiooni ega tõsta kunagi olekut published olekuks deployed.

Operaatori paigaldus · registreerimine

Klastri paigaldus, registreerimise bootstrap ja sihtmärgi sisendid, Secretid ning mandaatide uuendamise seadistus on operaatori sisendid, mitte kunagi kliendirakenduse kasuliku koormuse osa.

  1. Operaatori bootstrapkäivitus · rakendamine: platvormi renderdamine · Secretrailshot-system

    Operaator renderdab platvormi deklaratsiooni render-platform.py abil ning annab privaatse käituskonfiguratsiooni ja Secretid. Kaug-MCP kaasatakse ainult siis, kui selle tõmmis on antud, ja isiklik lüüs (WireGuard) ainult võtmega --personal.

  2. Operaatori bootstrapkäivitus · rakendamine: registreerimise bootstrapAppProject · cluster Secretargocd

    Operaator paigaldab nimeruumi argocd registreerimise bootstrap-Role'i ja tühja registreerimiste Role'i ning valmistab ette sihtmärgi sisendid. Toote API käivitatavad registreerimisabilised (environment.py, applications.py) kirjutavad seejärel Secreti railshot-<target> piiratud mandaadiga (clusterResources false, lubatud nimeruumid loetletud) ja lisavad valideeritud täpsed nimed registreerimiste Role'i. Rakendusepõhine registreerimine seob nimeruumi app-<id> sama nimega AppProjectiga.

  3. Operaatori bootstrapkäivitus · rakendamine: K3s-i · Ciliumi paigaldusCilium · Helm · VXLANkube-system

    install-k3s.sh paigaldab ühe sõlmega K3s-serveri (flannel, network policy, traefik ja servicelb väljas; kube-proxy alles) ning Cilium paigaldatakse Helmi väljalaskena (kubeProxyReplacement false, VXLAN, Hubble väljas).

  4. uuendamise CronJob · iga 2 hargocdkäivitus · rakendamine: TokenRequest · 6 hrailshot-argocd SA · token<app namespace>

    CronJob railshot-credentials taotleb iga kahe tunni järel kliendi SA-le uue kuuetunnise tokeni. Kliendipoolne Role lubab ainult oma SA token create'i. Kuus tundi on ühe tokeni TTL, mitte hetk, mil operaatori ligipääs lõpeb.

Kõik ühendused sama kaaluga. Vali voog, et tõsta esile ainult selle tee koos nummerdatud sammudega.

  • Pidevjoon · päringute, kimpude, tõmmiste ja deklaratsioonide liikumissuund
  • Kriipsjoon · käivitustaotlused, rakendamine, paigaldus, mandaadid
  • Pikk kriips-punktjoon · oleku, logide, sondide ja mõõdikute lugemine; verdiktist eraldi
  • Paks must joon · valitud voog; numbrid näitavad järjekorda
  • Kast · nimeruum, nimi päises (mitte sõlm)
  • Sisemine silt · komponent selles nimeruumis
  • Kriipsjoonega kast · klastritest väljas
  • railshot-system · toode
  • argocd · juurutusvolitus
  • railshot-build · hosti Dockeri volitus
  • GitHub · kliendiklaster

Kataloogi docs/architecture 2. oktoobri paigutusotsus (kaks rollisõlme) ja avaliku README diagramm on ajalugu; see kaart järgib commiti 645e28a deklaratsioone ja koodi. Nooled näitavad põhjust ja suunda, mitte tõendit, et iga pakkuja tee on praegu töös.

Nimeruumid ja sõlmed
Nimeruum on nimeulatus: ei riistvara ega iseenesest turvapiir. Platform- ja build-rollid on nodeSelectori ja taint'iga tehtud ajastamispaigutus; see kaart ei fikseeri käitusklastri sõlmede arvu. Ka Argo CD sõlmepaigutus on eraldi kontroll.
Build-sõlme volitused
Runner-Jobid töötavad hostNetworki, hosti Dockeri sokli, NET_ADMIN-i ja rootiga. Nimeruum, taint või RBAC ei eemalda hosti Dockeri volitust, seega ei ole see VM-i administraatori isoleerimine ega suvalise koodi liivakast.
Kliendi nimeruum
Iga registreeritud sihtmärk kasutab mittevaikimisi nimeruumi ja AppProjecti (näiteks tenant-demo või rakendusepõhine app-<id>). Luuakse ainult ühe teenuse Deployment (ServiceAccounti tokeni automaatne ühendamine väljas), NodePort Service ja NetworkPolicy ning valikuline PVC või migratsiooni-Job; Secretitele ainult viidatakse nimega (pull-Secret ja heakskiidetud DATABASE_URL), neid kunagi ei looda.
AWS-i sisenemispunkt
Route 53 Alias → jagatud ALB HTTPS 443 → kliendisõlme privaatne aadress ja NodePort. Mitu rakendust kasutavad sama sõlme, igaühel oma nimeruum, Application ja NodePort.
GCP sisenemispunkt
Globaalne EXTERNAL_MANAGED HTTPS LB → tsoonipõhine GCE_VM_IP_PORT NEG → olemasoleva VM-i privaatne NodePort. Sertifikaadid tulevad Certificate Managerist DNS-autoriseerimisega. Moodul ei oma ei VM-i ega VPC-d ning üks VM jääb üksikuks tõrkepunktiks.
OpenStacki sisenemispunkt
Amphora TLS-kuulaja 443 Host- ja tee-põhiste L7-poliitikatega → HTTP NodePort. Vaikeaadress on privaatne VIP; Octavia, K3s, andmebaas ja DNS on moodulist väljas. Avalik ligipääs ja kohapealse Amphora valmidus vajavad eraldi vastuvõttu ning kohapealset rakendamist selle mooduliga veel verifitseeritud ei ole.
Pakkujate vahel
Kolm sisenemispunkti on eraldi teostused, pakkujate vahel ei ole automaatset tõrkesiiret ega replikatsiooni. Kliendirakenduse klaster on registreeritud sihtmärgi näide, mitte väide, et sama juurutus töötab korraga igas pilves.
Operaatori valikud
Isiklik lüüs (WireGuard) liitub platvormiga ainult siis, kui operaator lubab võtme --personal; see ei ole kliendipilvede kohustuslik tee. Toetatud direct-režiimis võib vaatlus-VM jagada käituse juhtimis-VM-i.