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.
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.
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.
toote API · cd.js → bridge.py
railshot-systemkäivitus · rakendamine: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.ymlToote API taotleb GitHub Actionsi käivitust väärtustega tenant, app, lähte-commit ja sihtmärk. API ei kutsu kunagi runner-Jobi otse.
build controller · CronJob
railshot-systemkäivitus · rakendamine: runner-Jobide täiendaminerunner Job · hostNetwork · Docker socketrailshot-buildBuild 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.
runner Job · hostNetwork · Docker socket
railshot-buildkäivitus · rakendamine: töö vastuvõttloop job · self-hosted runnerrailshot-deploy.ymlBuild-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.
runner Job · hostNetwork · Docker socket
railshot-buildandmed: testitud kimprelease job · GitHub-hostedrailshot-deploy.ymlLoop-job jätab samad kontrollid läbinud kimbu ja release-job võtab ainult selle kimbu.
release job · GitHub-hosted
railshot-deploy.ymlandmed: avaldamine räsi järgiGHCRGitHubi 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.
toote API · cd.js → bridge.py
railshot-systemandmed: workload commit · pushconfig Giti repositooriumcd.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.
config Giti repositooriumandmed: revisionArgo CD · Application
argocdApplication loeb ainult oma piiratud config-repositooriumi, teed ja redaktsiooni.
toote API · cd.js → bridge.py
railshot-systemkäivitus · rakendamine: Application syncArgo CD · ApplicationargocdNimetatud 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.
Argo CD · Application
argocdkä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.
Deployment · Pod · tõmmis räsiga
<app namespace>andmed: allalaadimine räsi järgiGHCRAvaldatud 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.
Rakenduse kasutajaandmed: HTTPS 443Pakkuja L7-sisenemispunkt
Rakenduse kasutajad jõuavad pakkuja L7-sisenemispunkti registreeritud hostinime kaudu. Iga pakkuja teostab oma sisenemispunkti.
Pakkuja L7-sisenemispunktandmed: NodePortNodePort Service · Local
<app namespace>Sisenemispunkt edastab sõlme privaatsele aadressile ja NodePortile. NodePort on see, mis eraldati sihtmärgi registreerimisel.
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.
Cilium · Helm · VXLAN
kube-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.
Railshoti kasutajaandmed: juhtpaneel · APIdashboard · nginx
railshot-systemKasutajad 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.
toote API · cd.js → bridge.py
railshot-systemvaatlus: redaktsioon · health · tõmmisedArgo CD · ApplicationargocdDeployed 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.
toote API · cd.js → bridge.py
railshot-systemvaatlus: avalik HTTPS-kontrollPakkuja L7-sisenemispunktRegistreeritud avalikku URL-i kontrollitakse ilma ümbersuunamisteta. Succeeded salvestatakse ainult siis, kui olemas on nii Argo verdikt kui ka see kontroll.
toote API · cd.js → bridge.py
railshot-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.
toote API · cd.js → bridge.py
railshot-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.
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.
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.
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.
Operaatori bootstrapkäivitus · rakendamine: registreerimise bootstrapAppProject · cluster Secret
argocdOperaator 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.
Operaatori bootstrapkäivitus · rakendamine: K3s-i · Ciliumi paigaldusCilium · Helm · VXLAN
kube-systeminstall-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).
uuendamise CronJob · iga 2 h
argocdkä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.