Railshot
AI deployment & operations platform
Helyben készült webalkalmazás telepítése előkészített felhős és helyszíni környezetekbe, majd üzemeltetése.
AI-alapú telepítési és üzemeltetési platform, amely a helyben készült webalkalmazást előkészített felhős vagy helyszíni környezetekbe viszi, és tovább üzemelteti.
Az üzemeltetési és az ügyfélalkalmazás-klaszterek elkülönülnek, a nyilvános útvonal pedig a telepítésvezérléstől külön marad.
Az üzemeltetési K3s-ben az irányítópult, a termék-API és a build controller platformszerepű csomópontokon, a runner Jobok pedig egy buildszerepű csomóponton futnak, a telepítést az Argo CD végzi. Az ügyfélalkalmazások minden regisztrált célhoz külön egycsomópontos K3s + Cilium klaszter kijelölt namespace-ében futnak.
Build → konténerkép közzététele
A termék-API GitHub Actions-futtatást kér, a build-csomóponton futó runner pedig átveszi és ellenőrzi a jobot. Csak az ugyanazokon az ellenőrzéseken átment csomagot publikálja egy GitHub által hosztolt release job a GHCR-be.
termék-API · cd.js → bridge.py
railshot-systemfuttatás · alkalmazás: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.ymlA termék-API tenant, app, source commit és cél megadásával kér GitHub Actions-futtatást. Az API soha nem hív közvetlenül runner Jobot.
build controller · CronJob
railshot-systemfuttatás · alkalmazás: runner Job pótlásarunner Job · hostNetwork · Docker socketrailshot-buildA build controller CronJob (percenként, egy platformcsomóponton) runner Jobokat hoz létre a railshot-build namespace-ben. Role-ja csak a Jobok get, list és create műveletét, valamint az egyetlen runner-regisztrációs Secret get, update és patch műveletét engedi; namespace-eket vagy más Secreteket nem hozhat létre.
runner Job · hostNetwork · Docker socket
railshot-buildfuttatás · alkalmazás: a job átvételeloop job · self-hosted runnerrailshot-deploy.ymlA buildszerepű csomóponton (pontos hostname, NoSchedule toleration) futó runner a self-hosted címkéi alapján átveszi és futtatja a loop jobot. Az ügyfél forráskódja a meglévő korlátozott Docker build- és ellenőrző konténerekben fut.
runner Job · hostNetwork · Docker socket
railshot-buildadat: tesztelt csomagrelease job · GitHub-hostedrailshot-deploy.ymlA loop job hátrahagyja az ugyanazokon az ellenőrzéseken átment csomagot, a release job pedig csak ezt a csomagot veszi át.
release job · GitHub-hosted
railshot-deploy.ymladat: közzététel digest szerintGHCREgy GitHub által hosztolt release job (ubuntu-24.04) újraépítés nélkül publikálja a tesztelt csomag konténerképét a GHCR-be. Konténerkép-közzététel soha nem történik az ügyfélalkalmazás-klaszteren belül.
Config Git → Argo → ügyfél-namespace
A config Git a kívánt erőforrásokat, a GHCR a konténerkép bájtjait hordozza. Az Argo CD csak a regisztrált ügyfél-namespace-re alkalmaz.
termék-API · cd.js → bridge.py
railshot-systemadat: workload commit · pushconfig Git-tárolóA cd.js futtatja a bridge.py-t, amely csak akkor commitolja és pusholja a workload.json-t, ha a közzétételi feljegyzés és a regisztrált cél egyezik, majd visszaolvassa a távoli revíziót. A Git a kívánt erőforrásokat, a GHCR a konténerkép bájtjait hordozza.
config Git-tárolóadat: revisionArgo CD · Application
argocdAz Application csak a korlátozott config-tárolóját, útvonalát és revízióját olvassa.
termék-API · cd.js → bridge.py
railshot-systemfuttatás · alkalmazás: Application syncArgo CD · ApplicationargocdA megnevezett Applicationt server-side applyjal állítja be, és egyetlen pontos revízió szinkronizálását kéri prune nélkül. A termék-API railshot-product ServiceAccountja egyszerre birtokolja az üzemeltető által telepített regisztrációs bootstrapet (create a Secretekre, AppProjectekre és Applicationökre az argocd-ben; get, update és escalate a megnevezett Role-okra), valamint minden ellenőrzött célhoz pontos név szerint hozzáfűzött get- és patch-jogosultságot. A Kubernetes create művelete név szerint nem korlátozható, ezért a nevek hatókörben tartását a termék bemeneti validálása is biztosítja.
Argo CD · Application
argocdfuttatás · alkalmazás: alkalmazás a namespace-re<app namespace>Az Argo CD a regisztrált klaszter-Secret hitelesítő adatával alkalmaz az ügyfélklaszter kijelölt namespace-ére. Az AppProject csak namespace-szintű típusokat enged, klaszterszintű erőforrásokat nem.
Deployment · Pod · digest konténerkép
<app namespace>adat: letöltés digest szerintGHCRA közzétett digest szerinti konténerképet egy ugyanabban a namespace-ben név szerint hivatkozott pull Secrettel tölti le. Secret-értékek soha nem kerülnek az artefaktumba vagy a config Gitbe.
Nyilvános kérésútvonal
Az alkalmazáskérések útja: szolgáltatói L7-belépési pont → csomópont NodePort → Service → alkalmazás-Pod. A Cilium szabályzat-érvényesítése külön vezérlés, nem a kérést továbbító lépés. Az üzemeltetési irányítópultra vezető út külön útvonal.
Alkalmazásfelhasználóadat: HTTPS 443Szolgáltatói L7-belépési pont
Az alkalmazás felhasználói a regisztrált hostnéven érik el a szolgáltató L7-belépési pontját. Minden szolgáltató a saját belépési pontját valósítja meg.
Szolgáltatói L7-belépési pontadat: NodePortNodePort Service · Local
<app namespace>A belépési pont a csomópont privát címére és NodePortjára továbbít. A NodePort a cél regisztrálásakor kiosztott érték.
NodePort Service · Local
<app namespace>adat: a PodhozDeployment · Pod · digest konténerkép<app namespace>A Service ugyanazon a csomóponton lévő alkalmazás-Podhoz (Deployment) küldi a kérést. externalTrafficPolicy Local mellett a forráscím változatlanul jut el a NetworkPolicy regisztrált CIDR-eket vizsgáló ellenőrzéséhez.
Cilium · Helm · VXLAN
kube-systemfuttatás · alkalmazás: szabályzat érvényesítéseNetworkPolicy · csak a felsorolt CIDR-ek<app namespace>A Cilium érvényesíti a NetworkPolicyt: bejövő forgalom csak a regisztrált CIDR-ekből az alkalmazás portjára; kimenő forgalom alapból nincs, kivéve egy jóváhagyott adatbáziscímet. A felhőalapú tűzfalak és a hosztszabályok továbbra is számítanak.
Railshot-felhasználóadat: irányítópult · APIdashboard · nginx
railshot-systemA felhasználók az üzemeltetési belépési ponton át érkeznek az nginx-irányítópultra, az nginx pedig a termék-API előtt áll. Az irányítópult Service-e csak jóváhagyott node port megadása esetén NodePort; az API ClusterIP marad.
Ellenőrzés · megfigyelés
A telepítési ítélet kizárólag az Argo-állapoton és a nyilvános URL ellenőrzésén alapul. A Pod-diagnosztika, az aktuális naplók és az üzemeltetési metrikák külön jelek, amelyek soha nem változtatják meg.
termék-API · cd.js → bridge.py
railshot-systemmegfigyelés: revízió · health · konténerképekArgo CD · ApplicationargocdA deployed állapothoz kell az Application sync-revíziója, a Synced és Healthy állapot, az operation Succeeded, és az, hogy az Argo Application állapotában rögzített konténerkép-hivatkozások egyezzenek a felülvizsgált Deployment digest szerinti konténerképeivel. Ez nem közvetlen Pod-imageID-kapu, és önmagában a zöld Argo-állapot nem igazolja az egyezést.
termék-API · cd.js → bridge.py
railshot-systemmegfigyelés: nyilvános HTTPS-ellenőrzésSzolgáltatói L7-belépési pontA regisztrált nyilvános URL ellenőrzése átirányítások nélkül történik. Succeeded csak az Argo-ítélettel és ezzel az ellenőrzéssel együtt rögzül.
termék-API · cd.js → bridge.py
railshot-systemmegfigyelés: Pod-diagnosztika · nem az ítéletDeployment · Pod · digest konténerkép<app namespace>Az Argo-ítélet és a nyilvános ellenőrzés után a Deploymentet, a ReplicaSeteket és a Podokat a regisztrált hitelesítő adattal külön olvassa, és az imageID-t és a készenlétet ready, progressing vagy unavailable diagnosztikaként fűzi hozzá. Egy sikertelen vagy eltérő diagnosztika soha nem módosítja a deployed vagy succeeded ítéletet.
termék-API · cd.js → bridge.py
railshot-systemmegfigyelés: naplóvég · Podonként 100 sorDeployment · Pod · digest konténerkép<app namespace>Csak az éppen telepített műveletre, a megbízható konfigurációval és a regisztrált hitelesítő adattal. Minden aktuális Podnál (legfeljebb háromnál) a futó konténerkép digestjének egyeznie kell a várt digesttel; ezután Podonként legfeljebb 100 kitakart sort olvas bájtkorláton belül. Egy régebbi kísérletre superseded, konfiguráció nélkül not_configured a válasz. Ez nem naplóaggregáció.
Megfigyelő VMmegfigyelés: scrape · NodePortokrailshot-observability
A megfigyelő VM-en futó Prometheus két, tűzfallal korlátozott NodePorton át gyűjti a node-exporter és a kube-state-metrics adatait. A hiányzó vagy elavult érték ismeretlen, nem nulla.
Megfigyelő VMmegfigyelés: Blackbox probeSzolgáltatói L7-belépési pont
A probe_success=1 azt jelenti, hogy az adott próbahelyen 2xx válasz érkezett. Nem bizonyítja sem minden felhasználó hozzáférését, sem a telepített verziót, és soha nem lépteti elő a published állapotot deployeddá.
Üzemeltetői telepítés · regisztráció
A klasztertelepítés, a regisztrációs bootstrap és a célbemenetek, a Secretek és a hitelesítőadat-megújítás beállítása üzemeltetői bemenetek, soha nem részei a tenant alkalmazás payloadjának.
Üzemeltetői bootstrapfuttatás · alkalmazás: platform renderelése · Secretrailshot-system
Az üzemeltető a render-platform.py-jal rendereli a platformdeklarációt, és megadja a nem nyilvános üzemeltetési konfigurációt és Secreteket. A távoli MCP csak akkor kerül bele, ha a konténerképe rendelkezésre áll, a személyes gateway (WireGuard) pedig csak --personal esetén.
Üzemeltetői bootstrapfuttatás · alkalmazás: regisztrációs bootstrapAppProject · cluster Secret
argocdAz üzemeltető telepíti az argocd-be a regisztrációs bootstrap Role-t és egy üres registrations Role-t, és előkészíti a célbemeneteket. Ezután a termék-API által futtatott regisztrációs segédek (environment.py, applications.py) hatókörhöz kötött hitelesítő adattal megírják a railshot-<target> Secretet (clusterResources false, felsorolt engedélyezett namespace-ek), és az ellenőrzött pontos neveket hozzáfűzik a registrations Role-hoz. Az alkalmazásonkénti regisztráció egy app-<id> namespace-t azonos nevű AppProjecthez köt.
Üzemeltetői bootstrapfuttatás · alkalmazás: K3s · Cilium telepítéseCilium · Helm · VXLAN
kube-systemAz install-k3s.sh egycsomópontos K3s servert telepít (flannel, network policy, traefik és servicelb kikapcsolva; kube-proxy megtartva), a Cilium pedig Helm-releaseként települ (kubeProxyReplacement false, VXLAN, Hubble kikapcsolva).
megújító CronJob · 2 óránként
argocdfuttatás · alkalmazás: TokenRequest · 6 hrailshot-argocd SA · token<app namespace>A railshot-credentials CronJob kétóránként új, hatórás tokent kér az ügyfél SA-jához. Az ügyféloldali Role csak a saját SA-ja token create műveletét engedi. A hat óra egyetlen token TTL-je, nem az üzemeltetői hozzáférés vége.
Minden kapcsolat azonos vastagsággal. Válasszon egy folyamatot, hogy csak annak útvonala emelődjön ki, számozott lépésekkel.
- Folytonos · a kérések, csomagok, konténerképek és deklarációk áramlási iránya
- Szaggatott · futtatási kérések, alkalmazás, telepítés, hitelesítő adatok
- Hosszú pontvonalas · állapot, naplók, próbák, metrikák olvasása; az ítélettől elkülönítve
- Vastag fekete vonal · a kiválasztott folyamat; a számok a sorrendet jelzik
- Doboz · egy namespace, fejlécében a nevével (nem csomópont)
- Belső chip · komponens a namespace-ben
- Szaggatott doboz · a klasztereken kívül
- railshot-system · termék
- argocd · telepítési jogkör
- railshot-build · hoszt-Docker-jogkör
- GitHub · ügyfélklaszter
A docs/architecture október 2-i elhelyezési döntése (két szerepcsomópont) és a nyilvános README ábrája előzmény; ez a térkép a 645e28a deklarációit és kódját követi. A nyilak okot és irányt jelölnek, nem bizonyítják, hogy minden szolgáltatói útvonal most éles.
- Namespace-ek és csomópontok
- A namespace névtartomány: nem hardver, és önmagában nem is biztonsági határ. A platform- és buildszerep nodeSelectorral és tainttel megadott ütemezési elhelyezés; ez a térkép nem rögzíti az üzemeltetési klaszter csomópontszámát. Az Argo CD csomóponti elhelyezése szintén külön ellenőrizendő.
- A build-csomópont jogköre
- A runner Jobok hostNetworkkel, a hoszt Docker-socketjével, NET_ADMIN-nal és rootként futnak. Namespace, taint vagy RBAC nem szünteti meg a hoszt-Docker-jogkört, így ez sem VM-adminisztrátori elszigetelés, sem tetszőleges kódhoz való sandbox.
- Ügyfél-namespace
- Minden regisztrált cél nem alapértelmezett namespace-t és AppProjectet használ (például tenant-demo, vagy alkalmazásonként app-<id>). Csak egyetlen szolgáltatás Deploymentje (a ServiceAccount-token automatikus csatolása kikapcsolva), NodePort Service-e és NetworkPolicyja, valamint egy opcionális PVC vagy migrációs Job jön létre; a Secretekre csak név szerint hivatkozik (a pull Secret és egy jóváhagyott DATABASE_URL), soha nem hozza létre őket.
- AWS-belépési pont
- Route 53 Alias → közös ALB HTTPS 443 → az ügyfélcsomópont privát címe és NodePortja. Több alkalmazás is ugyanazt a csomópontot használja, mindegyik saját namespace-szel, Applicationnel és NodePorttal.
- GCP-belépési pont
- Globális EXTERNAL_MANAGED HTTPS LB → zonális GCE_VM_IP_PORT NEG → a meglévő VM privát NodePortja. A tanúsítványok a Certificate Managerből származnak DNS-engedélyezéssel. A modul sem a VM-et, sem a VPC-t nem birtokolja, és egyetlen VM egyetlen hibapont marad.
- OpenStack-belépési pont
- Amphora TLS-listener 443 Host- és útvonalalapú L7-szabályokkal → HTTP NodePort. Az alapértelmezett cím privát VIP; az Octavia, a K3s, az adatbázis és a DNS a modulon kívül esik. A nyilvános elérhetőség és a helyszíni Amphora-készenlét külön átvételt igényel, és helyszíni alkalmazást ezzel a modullal még nem igazoltak.
- Szolgáltatók között
- A három belépési pont különálló megvalósítás, a szolgáltatók között nincs automatikus failover vagy replikáció. Az ügyfélalkalmazás-klaszter egy regisztrált cél példája, nem állítás arról, hogy ugyanaz a telepítés egyszerre fut minden felhőn.
- Üzemeltetői beállítások
- A személyes gateway (WireGuard) csak akkor csatlakozik a platformhoz, ha az üzemeltető bekapcsolja a --personal kapcsolót; az ügyfélfelhők számára nem kötelező útvonal. A támogatott direct módban a megfigyelő VM osztozhat az üzemeltetési vezérlő VM-en.