Railshot
AI deployment & operations platform
Nasadit lokálně vytvořenou webovou aplikaci do připravených cloudových a on-premises prostředí a pak ji provozovat.
Platforma AI pro nasazení a provoz, která převede lokálně vytvořenou webovou aplikaci do připravených cloudových nebo on-premises prostředí a dál ji provozuje.
Provozní cluster a clustery zákaznických aplikací jsou oddělené a veřejná cesta je oddělena od řízení nasazení.
V provozním K3s jsou dashboard, API produktu a build controller umístěny na uzlech v roli platform a Joby runnerů na uzlu v roli build, zatímco nasazení obstarává Argo CD. Zákaznické aplikace běží ve vyhrazeném jmenném prostoru samostatného jednouzlového clusteru K3s + Cilium pro každý registrovaný cíl.
Build → publikace obrazu
API produktu žádá o běh GitHub Actions a runner na uzlu build úlohu převezme a zkontroluje. Do GHCR publikuje úloha vydání hostovaná na GitHubu jen bundle, který prošel stejnými kontrolami.
API produktu · cd.js → bridge.py
railshot-systemspuštění · aplikace: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.ymlAPI produktu žádá o běh GitHub Actions s tenantem, aplikací, zdrojovým commitem a cílem. API nikdy nevolá Job runneru přímo.
build controller · CronJob
railshot-systemspuštění · aplikace: doplňování Jobů runnerurunner Job · hostNetwork · Docker socketrailshot-buildCronJob build controlleru (každou minutu, na uzlu platform) vytváří Joby runnerů ve jmenném prostoru railshot-build. Jeho Role povoluje jen get, list a create pro Joby a get, update a patch pro jediný Secret registrace runneru; nemůže vytvářet jmenné prostory ani jiné Secrety.
runner Job · hostNetwork · Docker socket
railshot-buildspuštění · aplikace: převzetí úlohyloop job · self-hosted runnerrailshot-deploy.ymlRunner na uzlu v roli build (přesný hostname, tolerance NoSchedule) převezme úlohu loop podle štítků self-hosted a spustí ji. Zdrojový kód zákazníka běží ve stávajících omezených kontejnerech Docker pro build a kontroly.
runner Job · hostNetwork · Docker socket
railshot-buildúdaje: otestovaný bundlerelease job · GitHub-hostedrailshot-deploy.ymlÚloha loop zanechá bundle, který prošel stejnými kontrolami, a úloha vydání převezme jen tento bundle.
release job · GitHub-hosted
railshot-deploy.ymlúdaje: publikace podle digestuGHCRÚloha vydání hostovaná na GitHubu (ubuntu-24.04) publikuje obraz z otestovaného bundlu do GHCR bez nového buildu. Publikace obrazů nikdy neprobíhá uvnitř clusteru zákaznické aplikace.
Config Git → Argo → jmenný prostor zákazníka
Config Git nese požadované prostředky a GHCR bajty obrazu. Argo CD aplikuje jen do registrovaného jmenného prostoru zákazníka.
API produktu · cd.js → bridge.py
railshot-systemúdaje: workload commit · pushRepozitář config Gitcd.js spouští bridge.py, který commituje a pushuje workload.json jen tehdy, když se záznam o publikaci a registrovaný cíl shodují, a pak zpětně přečte vzdálenou revizi. Git nese požadované prostředky; GHCR nese bajty obrazu.
Repozitář config Gitúdaje: revisionArgo CD · Application
argocdApplication čte jen svůj omezený repozitář konfigurace, cestu a revizi.
API produktu · cd.js → bridge.py
railshot-systemspuštění · aplikace: Application syncArgo CD · ApplicationargocdPojmenovaná Application se nastaví přes server-side apply a o synchronizaci jedné přesné revize se žádá bez prune. ServiceAccount railshot-product API produktu má jak operátorem nainstalovaný bootstrap registrace (create pro Secrety, AppProjecty a Applications v argocd; get, update a escalate pro pojmenované Role), tak oprávnění get a patch připojovaná přesným názvem pro každý ověřený cíl. Kubernetesové create nelze omezit názvem, proto názvy v rozsahu hlídá i validace vstupů v produktu.
Argo CD · Application
argocdspuštění · aplikace: aplikace do jmenného prostoru<app namespace>Argo CD aplikuje do vyhrazeného jmenného prostoru v zákaznickém clusteru s přihlašovacími údaji z registrovaného Secretu clusteru. AppProject povoluje jen druhy v rozsahu jmenného prostoru a žádné prostředky v rozsahu clusteru.
Deployment · Pod · obraz podle digestu
<app namespace>údaje: stažení podle digestuGHCRPublikovaný obraz podle digestu se stahuje s pull Secretem odkazovaným názvem ve stejném jmenném prostoru. Hodnoty Secretů se nikdy nedostanou do artefaktu ani do config Git.
Veřejná cesta požadavků
Požadavky na aplikaci jdou: vstup L7 poskytovatele → NodePort uzlu → Service → pod aplikace. Vynucování politiky Ciliem je samostatná kontrola, nikoli krok, který požadavek nese. Vstup do provozního dashboardu je samostatná cesta.
Uživatel aplikaceúdaje: HTTPS 443Vstup L7 poskytovatele
Uživatelé aplikace se dostanou ke vstupu L7 poskytovatele přes registrovaný hostname. Každý poskytovatel implementuje vlastní vstup.
Vstup L7 poskytovateleúdaje: NodePortNodePort Service · Local
<app namespace>Vstup předává provoz na soukromou adresu uzlu a NodePort. NodePort je ten přidělený při registraci cíle.
NodePort Service · Local
<app namespace>údaje: k poduDeployment · Pod · obraz podle digestu<app namespace>Service posílá požadavek k podu aplikace (Deployment) na stejném uzlu. S externalTrafficPolicy Local dorazí zdrojová adresa beze změny ke kontrole registrovaných CIDR v NetworkPolicy.
Cilium · Helm · VXLAN
kube-systemspuštění · aplikace: vynucení politikyNetworkPolicy · uvedené CIDR<app namespace>Cilium vynucuje NetworkPolicy: příchozí provoz jen z registrovaných CIDR na port aplikace; ve výchozím stavu žádný odchozí provoz kromě schválené adresy databáze. Cloudové firewally a pravidla hostitele stále hrají roli.
Uživatel Railshotúdaje: dashboard · APIdashboard · nginx
railshot-systemUživatelé přicházejí přes provozní vstup do dashboardu nginx a nginx stojí před API produktu. Service dashboardu je typu NodePort jen tehdy, je-li zadán schválený port uzlu; API zůstává ClusterIP.
Ověření · pozorování
Rozhodnutí o nasazení stojí jen na stavu Argo a kontrole veřejné URL. Diagnostika podů, aktuální logy a provozní metriky jsou samostatné signály, které ho nikdy nemění.
API produktu · cd.js → bridge.py
railshot-systempozorování: revize · health · obrazyArgo CD · ApplicationargocdStav deployed vyžaduje revizi synchronizace Application, Synced a Healthy, operaci Succeeded a shodu odkazů na obrazy zaznamenaných ve stavu Application v Argo s obrazy podle digestu z revidovaného Deploymentu. Nejde o bránu přímo na imageID podu a samotný zelený stav Argo tuto shodu nepotvrzuje.
API produktu · cd.js → bridge.py
railshot-systempozorování: veřejná kontrola HTTPSVstup L7 poskytovateleRegistrovaná veřejná URL se kontroluje bez přesměrování. Succeeded se zaznamená jen s rozhodnutím Argo i touto kontrolou zároveň.
API produktu · cd.js → bridge.py
railshot-systempozorování: diagnostika podu · ne rozhodnutíDeployment · Pod · obraz podle digestu<app namespace>Po rozhodnutí Argo a veřejné kontrole se Deployment, ReplicaSety a pody čtou zvlášť s registrovanými přihlašovacími údaji a imageID a připravenost se připojí jako diagnostika ready, progressing nebo unavailable. Neúspěšná nebo odlišná diagnostika nikdy nemění rozhodnutí deployed ani succeeded.
API produktu · cd.js → bridge.py
railshot-systempozorování: tail logů · 100 řádků na podDeployment · Pod · obraz podle digestu<app namespace>Jen pro aktuálně nasazenou operaci, s důvěryhodnou konfigurací a registrovanými přihlašovacími údaji. U každého aktuálního podu (nejvýše tří) musí digest běžícího obrazu odpovídat očekávanému; pak se čte až 100 maskovaných řádků na pod v limitu bajtů. Starší pokus odpoví superseded; bez konfigurace not_configured. Nejde o agregaci logů.
Pozorovací VMpozorování: scrape · NodePortyrailshot-observability
Prometheus na pozorovací VM sbírá data z node-exporter a kube-state-metrics přes dva NodePorty omezené firewallem. Chybějící nebo zastaralé hodnoty jsou neznámé, nikoli nulové.
Pozorovací VMpozorování: Blackbox probeVstup L7 poskytovatele
probe_success=1 znamená odpověď 2xx v místě této sondy. Nedokazuje přístup každého uživatele ani nasazenou verzi a nikdy nepovýší published na deployed.
Instalace · registrace operátorem
Instalace clusteru, bootstrap registrace a údaje o cílech, Secrety a nastavení obnovy přihlašovacích údajů jsou vstupy operátora, nikdy součást payloadu aplikace tenanta.
Bootstrap operátoraspuštění · aplikace: render platformy · Secretrailshot-system
Operátor vyrenderuje deklaraci platformy pomocí render-platform.py a dodá soukromou provozní konfiguraci a Secrety. Vzdálené MCP je zahrnuto jen tehdy, když je dodán jeho obraz, a osobní brána (WireGuard) jen s --personal.
Bootstrap operátoraspuštění · aplikace: bootstrap registraceAppProject · cluster Secret
argocdOperátor nainstaluje do argocd Role bootstrapu registrace a prázdnou Role registrations a připraví údaje o cíli. Poté registrační helpery spouštěné API produktu (environment.py, applications.py) zapíší Secret railshot-<target> s přihlašovacími údaji s vymezeným rozsahem (clusterResources false, uvedené povolené jmenné prostory) a připojí ověřené přesné názvy do Role registrations. Registrace pro jednotlivé aplikace váže jmenný prostor app-<id> na AppProject stejného názvu.
Bootstrap operátoraspuštění · aplikace: instalace K3s · CiliumCilium · Helm · VXLAN
kube-systeminstall-k3s.sh nainstaluje jednouzlový server K3s (flannel, network policy, traefik a servicelb vypnuty; kube-proxy ponechán) a Cilium se instaluje jako vydání Helm (kubeProxyReplacement false, VXLAN, Hubble vypnut).
CronJob obnovy · každé 2 h
argocdspuštění · aplikace: TokenRequest · 6 hSA railshot-argocd · token<app namespace>CronJob railshot-credentials každé dvě hodiny žádá o nový šestihodinový token pro SA zákazníka. Role na straně zákazníka povoluje jen token create pro vlastní SA. Šest hodin je TTL jednoho tokenu, nikoli okamžik, kdy končí přístup operátora.
Každé spojení se stejnou váhou. Výběr toku zvýrazní jen jeho cestu s očíslovanými kroky.
- Plná čára · směr toku požadavků, bundlů, obrazů a deklarací
- Přerušovaná čára · požadavky na spuštění, aplikace, instalace, přihlašovací údaje
- Dlouhá čerchovaná · čtení stavu, logů, sond, metrik; odděleně od rozhodnutí
- Silná černá čára · zvolený tok; čísla udávají pořadí
- Rámeček · jmenný prostor, název v záhlaví (není to uzel)
- Vnitřní štítek · komponenta v tomto jmenném prostoru
- Přerušovaný rámeček · mimo clustery
- railshot-system · produkt
- argocd · oprávnění k nasazení
- railshot-build · oprávnění Dockeru hostitele
- GitHub · cluster zákazníka
Rozhodnutí o rozmístění z October 2 v docs/architecture (dva uzly rolí) a diagram ve veřejném README jsou historie; tato mapa odpovídá deklaracím a kódu v 645e28a. Šipky ukazují příčinu a směr, nikoli doklad, že každá cesta poskytovatele nyní funguje.
- Jmenné prostory a uzly
- Jmenný prostor je rozsah pojmenování: není to hardware ani sám o sobě bezpečnostní hranice. Role platform a build jsou rozmístěním při plánování pomocí nodeSelector a taint; tato mapa nestanovuje počet uzlů provozního clusteru. Rozmístění Argo CD na uzlech je rovněž samostatná kontrola.
- Oprávnění uzlu build
- Joby runnerů běží s hostNetwork, soketem Dockeru hostitele, NET_ADMIN a jako root. Jmenný prostor, taint ani RBAC oprávnění Dockeru hostitele neodstraní, takže nejde o izolaci od správce VM ani o sandbox pro libovolný kód.
- Jmenný prostor zákazníka
- Každý registrovaný cíl používá nevýchozí jmenný prostor a AppProject (například tenant-demo nebo app-<id> pro každou aplikaci). Vytváří se jen Deployment jedné služby (automount tokenu ServiceAccount vypnut), Service NodePort a NetworkPolicy a volitelně PVC nebo Job migrace; Secrety se jen odkazují názvem (pull Secret a schválená DATABASE_URL), nikdy se nevytvářejí.
- Vstup AWS
- Route 53 Alias → sdílený ALB HTTPS 443 → soukromá adresa uzlu zákazníka a NodePort. Mnoho aplikací sdílí jeden uzel, každá s vlastním jmenným prostorem, Application a NodePort.
- Vstup GCP
- Globální EXTERNAL_MANAGED HTTPS LB → zónová GCE_VM_IP_PORT NEG → soukromý NodePort existující VM. Certifikáty pocházejí z Certificate Manager s autorizací DNS. Modul nevlastní VM ani VPC a jedna VM zůstává jediným bodem selhání.
- Vstup OpenStack
- Listener TLS Amphora 443 s politikami L7 pro Host a cestu → HTTP NodePort. Výchozí adresou je soukromá VIP; Octavia, K3s, databáze a DNS jsou mimo modul. Veřejná dosažitelnost a připravenost Amphory na místě vyžadují samostatné převzetí a žádné nasazení na místě zatím tímto modulem ověřeno nebylo.
- Mezi poskytovateli
- Tři vstupy jsou samostatné implementace, bez automatického failoveru či replikace mezi poskytovateli. Cluster zákaznické aplikace je příkladem registrovaného cíle, nikoli tvrzením, že totéž nasazení běží současně v každém cloudu.
- Volby operátora
- Osobní brána (WireGuard) se k platformě připojí jen tehdy, když operátor zapne --personal; pro zákaznické cloudy není povinnou cestou. V podporovaném režimu direct může pozorovací VM sdílet provozní řídicí VM.