Railshot
AI deployment & operations platform
로컬에서 만든 웹 앱을, 준비된 클라우드와 온프레미스에 배포하고 운영합니다.
로컬에서 만든 웹 앱을 클라우드나 온프레미스에 배포하고 운영까지 이어 주는 AI 배포 · 운영 플랫폼입니다.
Railshot vocabulary
- intake
- checks
- repair
- publish
- rollout
- route
- probe
- source commit
- digest
- binding
- unknown
- resume
- observation
Intake: deploy_repository · deploy_local_project · OAUTH MCP · Idempotency-Key · IDEMPOTENCY_CONFLICT · 202 ACCEPTED · EXECUTOR_BUSY · CAPACITY_EXCEEDED · maxConcurrentDeployments · workflow_dispatch · TARGET ALLOWLIST · reconciliation_required · CI_DISPATCH_UNCONFIRMEDChecks: package.policy · package.spec · source.quality · image.build · image.runtime · image.scan · GATE_ORDER · verdict.json · release_eligible · GATE VERDICT · SECRET SCAN · --cap-drop=ALL · source_change_allowed · verify_imagesAI Repair: GATE VERDICT · FIXABLE · give_up · PROMPT INJECTION · FAILURE SIGNATURE · REPAIR_SCOPE · MAX_REPAIR_ATTEMPTS · claude-agent-sdk · openai-codex · fixer · lessons.md · source_change_allowed · SDK_OUTCOME_UNKNOWNPublish: release_eligible · GHCR · images.json · EXACT TESTED BUNDLE · GITHUB-HOSTED RELEASE · published · publication_unverified · MANIFEST INSPECT · REGISTRY_VISIBILITY · publish-journal · railshot-release · containerd-snapshotter · images.tar · handoff.jsonRollout: bridge.py · workload.json · CONFIG GIT · pushing · REMOTE READBACK · ARGO CD · Synced · Healthy · targetRevision · sync_requested · NO PRUNE, NO FORCE · NetworkPolicy · readinessProbe · observed_images · NEVER BLINDLY RETRYPublic Route: routing · SHARED ALB · aws_lb_listener_rule · aws_lb_target_group · aws_route53_record · NodePort · LISTENER OWNERSHIP · GCP_ROUTE_APPLY_TIMEOUT · GCP_CERTIFICATE_DNS_FAILED · WireGuardHealth Probe: public_probe · site_probe · railshot-health/1 · NO PROXY, NO REDIRECT · expected_json · HTTPS 200 · verified_at · public_http · health_path · readinessProbe · probe_successSource Commit: workflow_dispatch · targetRevision · Railshot-Request · Railshot-Target · source_commit · source_parent · force: false · source_digest · snapshot.json · GITHUB_SHA · PLATFORM_REF · harness_sha256 · SUBMITTED SOURCE CHANGED · source_preparedImage Digest: GHCR · images.json · MANIFEST INSPECT · source_digest · IMMUTABLE GHCR DIGEST · images_sha256 · observed_images · PULL BY DIGEST · imagePullSecrets · containerd-snapshotter · RESUME_PUBLICATION_CHANGED · verify_images · images.tarRun Binding: Idempotency-Key · published · Railshot-Request · Railshot-Target · handoff.json · producer_attempt · bundle_artifact_id · run_id · state.bindings · CI_BINDING_MISMATCH · DEPLOYMENT BINDING CONFLICT · config_sha256 · TARGET ALLOWLIST · registered_applicationUnknown Outcome: publication_unverified · pushing · GCP_ROUTE_APPLY_TIMEOUT · outcome_unknown · CD_RECONCILE_REQUIRED · reconciliation_required · CD_OUTCOME_UNKNOWN · SDK_OUTCOME_UNKNOWN · unknown_timeout · CI_DISPATCH_UNCONFIRMED · NEVER BLINDLY RETRY · after_reconcile · reconcile_remote · CI_DISPATCH_NOT_IDENTIFIED · READ-ONLY OBSERVEResume: publish-journal · source_parent · RESUME_PUBLICATION_CHANGED · --resume · state.sqlite3 · resumePrepared · findDeployment · recoverDispatch · source_prepared · CI_DISPATCH_NOT_IDENTIFIED · resume_count · SAME WORKFLOW RUN · INTERRUPTEDObservation: observationRetry · next_retry_at · consecutive_failures · no_data · stale · collection_failed · NOT A SUCCESS GATE · probe_success · PROMETHEUS · BLACKBOX EXPORTER · READ-ONLY OBSERVE
웹 화면과 내 에이전트가 같은 제품 API로 배포를 요청합니다.
접수된 배포 요청이 CI 검사와 이미지 게시를 거쳐, 등록된 대상의 Git 구성·Argo CD 적용과 공개 HTTPS 확인까지 이어지는 제품 구성입니다. 적용 revision과 공개 확인이 모두 있어야 성공으로 기록하고, 결과를 알 수 없으면 unknown으로 남깁니다.
웹 화면이나 MCP로 연결한 AI 에이전트에서 프로젝트를 제출하면 배포 파일 준비, 실패 수정, 이미지 게시, 환경 적용과 공개 URL 확인까지 이어지고, 배포 뒤에도 같은 화면에서 이력과 로그를 보고 업데이트 · 중지 · 재개 · 삭제를 관리합니다. 팀 프로젝트입니다.
대회 개발 기간 September 28, 2026 to October 4, 2026
해커톤 기간에 만든 웹 화면과 MCP 서버입니다. 원격 MCP는 OAuth로 로그인해 제출하고, 로컬 폴더는 로컬 MCP로 제출합니다.
제출 → 접수
웹 화면·원격 MCP·로컬 MCP가 같은 제품 API로 요청하고, API는 확인한 요청을 queued로 기록한 뒤 202로 답합니다.
브라우저 사용자데이터: 폴더 · ZIP · GitHub URL웹 화면 · 이력 · Insights
apps/dashboard웹 화면에서 소스와 등록된 환경을 고릅니다.
웹 화면 · 이력 · Insights
apps/dashboard데이터: 같은 제품 API · /api/v1검증 · 대상 확인 · 202 접수apps/api웹 화면은 같은 출처의 제품 API를 부릅니다.
MCP 클라이언트데이터: OAuth · deploy_repositoryOAuth MCP · deploy_repository
agent/remote-mcp.js원격 MCP는 OAuth로 연결하고 공개 GitHub 저장소를 입력으로 받습니다.
OAuth MCP · deploy_repository
agent/remote-mcp.js데이터: 같은 제품 API검증 · 대상 확인 · 202 접수apps/api원격 MCP 서버가 내부 API 클라이언트로 같은 배포 API를 부릅니다.
railshot-local MCP데이터: ZIP 업로드 · deploy_local_project검증 · 대상 확인 · 202 접수
apps/api사용자 컴퓨터의 stdio MCP가 폴더를 ZIP으로 묶어 올립니다. 이 세션은 원격 OAuth 세션과 공유되지 않습니다.
검증 · 대상 확인 · 202 접수
apps/api데이터: queued 기록 · 202operation 상태 · run 바인딩api/product-store.js입력, 등록된 대상, 용량, idempotency 키를 확인한 뒤 operation을 queued로 기록하고 202로 답합니다. 202는 접수이며 배포 성공이 아닙니다.
operation 상태 · run 바인딩
api/product-store.js데이터: 대기 순서배포 queue · 동시 3apps/api동시 배포 수(기본 3) 안에서 접수 순서대로 꺼냅니다.
operation 상태 · run 바인딩
api/product-store.js관측: 배포 상태 · 이력웹 화면 · 이력 · Insightsapps/dashboard웹 화면과 MCP 도구는 같은 operation 기록을 읽습니다. 최근 시도와 현재 검증된 배포를 따로 보여 주며, AI 작업 완료는 배포 성공이 아닙니다.
CI 검사 → 이미지 게시
고정된 플랫폼 코드가 제출 commit을 검사하고, 고칠 수 있는 실패만 AI에 맡긴 뒤 같은 검사를 다시 통과한 이미지만 게시합니다.
배포 queue · 동시 3
apps/api데이터: source commitsource commit · trailerapps/<tenant>/<app>제출 소스를 비공개 apps 저장소에 commit으로 만들고(Railshot-Request · Railshot-Target trailer) 브랜치를 force 없이 갱신합니다.
배포 queue · 동시 3
apps/api실행 · 적용: workflow_dispatchloop · 기본 검사 L0–L3railshot-deploy.ymltenant · app · source_commit · target_id로 실행을 요청합니다. 응답이 유실되면 다시 보내지 않고 같은 commit의 실행을 찾습니다.
source commit · trailer
apps/<tenant>/<app>데이터: 제출 commitloop · 기본 검사 L0–L3railshot-deploy.yml제출 commit과 고정된 플랫폼 코드(PLATFORM_REF)만 checkout합니다.
SDK 수정 · 고칠 수 있는 실패만
railshot-deploy.yml데이터: 수정안 요청 · 조건부AI SDK provider고칠 수 있는 실패 분류일 때만 부르고, 같은 실패가 두 번 나오거나 시도 한도에 닿으면 멈춥니다. 통과·실패는 LLM이 아니라 검사가 정합니다.
release · GHCR 게시 · 바인딩
railshot-deploy.yml데이터: 검사한 이미지 게시GHCR검사를 통과한 bundle을 확인한 뒤 같은 이미지를 GHCR에 게시합니다. 다시 빌드하지 않습니다.
CI 실행 바인딩 · 관찰
apps/api관측: 실행 · publication 조회railshot-deploy.ymlrun id, source commit, target, app이 접수 기록과 일치해야 게시로 인정합니다.
CI 실행 바인딩 · 관찰
apps/api실패 · 결과 불명: failed · publication_unverifiedoperation 상태 · run 바인딩api/product-store.jsCI 실패나 게시 확인 실패는 진단과 함께 기록하고 CD로 넘기지 않습니다.
적용 → 공개 확인
게시 기록이 등록된 대상과 일치할 때만 config Git과 Argo CD로 적용하고, 등록된 공개 HTTPS 주소를 확인해야 성공으로 기록합니다.
release · GHCR 게시 · 바인딩
railshot-deploy.yml데이터: images.json · spec · verdict · manifestcd.js · deployPublishedapps/apiCD는 게시 기록의 파일을 신뢰한 loader로 읽습니다. CI는 클러스터 자원이나 URL, 배포 성공을 만들지 않습니다.
cd.js · deployPublished
apps/api실행 · 적용: apply · 등록 대상신뢰 config · 등록 대상 확인gitops/bridge.py등록된 앱과 tenant가 게시 기록과 같을 때만 gitops/bridge.py를 신뢰한 config로 실행합니다.
commit · push · 원격 readback
gitops/bridge.py데이터: workload commit · pushconfig Git 저장소전용 브랜치의 등록 경로에 workload.json만 commit하고, push 의도를 먼저 기록한 뒤 push해 원격 revision을 다시 읽어 확인합니다. 결과가 불확실하면 다시 push하지 않습니다.
config Git 저장소데이터: revisionApplication · AppProject 검사
Argo CDArgo CD Application이 가리키는 config 저장소의 revision입니다.
Argo sync · 관찰
gitops/bridge.py실행 · 적용: sync · 관찰Application · AppProject 검사Argo CDAppProject를 검사한 뒤 sync를 요청하고, 관찰할 때는 sync 없이 읽기만 합니다.
Application · AppProject 검사
Argo CD실행 · 적용: 적용workload · ServiceK3s 앱 클러스터등록된 대상 클러스터에 workload를 적용합니다.
workload · Service
K3s 앱 클러스터데이터: 이미지 pull · digestGHCR게시된 digest의 이미지를 받습니다. 비공개 GHCR이면 전용 pull credential이 필요합니다.
공개 HTTPS probe
gitops/bridge.py관측: HTTPS health공개 HTTPS URL운영자가 등록한 HTTPS health 주소만, 리다이렉트 없이 200(과 지정한 JSON)인지 확인합니다.
공개 HTTPS URL데이터: 공개 경로workload · Service
K3s 앱 클러스터공개 경로(LB · NodePort · 인증서)는 provider와 등록 대상마다 다릅니다.
cd.js · deployPublished
apps/api데이터: succeeded · revision · URLoperation 상태 · run 바인딩api/product-store.jscd.deployed, revision, 공개 HTTPS 성공·확인 시각·유효한 URL이 모두 있을 때만 succeeded로 기록합니다.
cd.js · deployPublished
apps/api실패 · 결과 불명: unknown · 재조정 필요operation 상태 · run 바인딩api/product-store.js결과를 알 수 없으면 unknown으로 남기고, 같은 적용을 다시 보내거나 되돌리지 않습니다.
관측 · 판정과 별개
지표와 probe는 배포 성공을 정하지 않습니다. 없는 값, 오래된 값, 수집 실패는 그대로 표시합니다.
metrics observer
apps/api관측: PromQL 조회Prometheusup, probe_success, Pod 지표를 읽습니다. 없거나 오래되었거나 수집에 실패한 값은 그 상태로 보여 주며 0으로 바꾸지 않습니다.
Prometheus관측: scrape · probeworkload · Service
K3s 앱 클러스터exporter scrape와 HTTP probe입니다. 이 지표는 배포 성공 판정에 쓰이지 않습니다.
operation 상태 · run 바인딩
api/product-store.js관측: 배포 상태 · 이력웹 화면 · 이력 · Insightsapps/dashboard웹 화면과 MCP 도구는 같은 operation 기록을 읽습니다. 최근 시도와 현재 검증된 배포를 따로 보여 주며, AI 작업 완료는 배포 성공이 아닙니다.
공개 HTTPS probe
gitops/bridge.py관측: HTTPS health공개 HTTPS URL운영자가 등록한 HTTPS health 주소만, 리다이렉트 없이 200(과 지정한 JSON)인지 확인합니다.
모든 연결을 같은 굵기로 보여 줍니다. 흐름을 고르면 그 경로만 번호와 함께 강조됩니다.
- 실선 · 소스 · 이미지 · 요청이 흐르는 방향
- 파선 · 실행 요청 · 적용 · sync
- 긴 점선 · 상태 조회 · probe · 지표, 판정과 별개
- 짧은 파선 · 실패 · unknown 기록
- 굵은 검은 선 · 고른 흐름, 번호는 순서
- 상자 · 소유 경계, 머리말에 소스 경로
- 안쪽 칩 · 그 경계의 구성 요소
- 점선 상자 · 플랫폼 밖
- 주황 테두리 · 모델이 판단하는 곳
- 제품 API
- 배포 기록
- CD 실행 경계
- 진입 · CI · 대상
docs/architecture/README.md의 10월 2일 기준(bc61a5a) 그림은 구현 이력이고, 이 구성도는 645e28a 코드를 따릅니다. 공급자와 네트워크 경로는 등록한 대상마다 다르며, 모든 공급자가 늘 켜져 있다는 뜻이 아닙니다.