RAILSHOT.
전시실로

Railshot

AI deployment & operations platform

로컬에서 만든 웹 앱을, 준비된 클라우드와 온프레미스에 배포하고 운영합니다.

로컬에서 만든 웹 앱을 클라우드나 온프레미스에 배포하고 운영까지 이어 주는 AI 배포 · 운영 플랫폼입니다.

2026.09.28 — 2026.10.04 · 종료

팀 프로젝트 · 맡은 일: CI 기획·구현, CSP 클러스터·Ansible 인터페이스, 운영, 팀 코드 리뷰·통합

SoftBank Hackathon 2026 powered by KOREC & Progate예선 참가 · 본선 선발 발표 예정 10.26 (10.07 기준)

  • 웹구현 · 해커톤
  • MCP 서버구현 · 원격 · 로컬

Railshot vocabulary

Lens
Deployment
Delivery
Endpoint Verification
Evidence
Artifact Identity
Reconciliation
  1. intake
  2. checks
  3. repair
  4. publish
  5. rollout
  1. route
  2. probe
  1. source commit
  2. digest
  3. binding
  1. unknown
  2. resume
  3. 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로 제출합니다.

제품 구성도 · 공개 커밋 645e28a의 코드 경로로 그림
Railshot 제품 구성도Railshot 제품의 구성 요소와 연결입니다. 웹 화면, 원격 OAuth MCP, 사용자 컴퓨터의 로컬 MCP가 같은 제품 API로 배포를 요청하고, API는 소스 commit과 CI 실행을 접수합니다. CI는 고정된 검사로 판정하고 검사한 이미지를 GHCR에 게시합니다. CD 어댑터는 등록된 대상과 게시 기록이 일치할 때만 config Git과 Argo CD로 적용하고, 등록된 공개 HTTPS 주소를 확인해 결과를 기록합니다. 지표는 판정과 별개인 관측입니다.브라우저 사용자폴더 · ZIP · GitHub URLMCP 클라이언트ChatGPT · Codex · Clauderailshot-local MCP사용자 컴퓨터 · stdioGHCRdigest 이미지AI SDK providerCodex · Claude SDKconfig Git 저장소등록 경로 · workload.json공개 HTTPS URL등록된 health 경로Prometheus운영 control VM · 읽기apps/dashboard웹 화면 · 이력 · Insightsagent/remote-mcp.jsOAuth MCP · deploy_repositoryapps/api검증 · 대상 확인 · 202 접수배포 queue · 동시 3CI 실행 바인딩 · 관찰cd.js · deployPublishedmetrics observerapi/product-store.jsoperation 상태 · run 바인딩gitops/bridge.py신뢰 config · 등록 대상 확인commit · push · 원격 readbackArgo sync · 관찰공개 HTTPS probeArgo CDApplication · AppProject 검사apps/<tenant>/<app>source commit · trailerrailshot-deploy.ymlloop · 기본 검사 L0–L3SDK 수정 · 고칠 수 있는 실패만같은 검사 → 검사한 bundlerelease · GHCR 게시 · 바인딩K3s 앱 클러스터workload · ServiceRailshot 플랫폼운영 클러스터 · AWSGitHub비공개 apps 저장소 · Actions등록된 대상 환경provider별 공개 경로1 폴더 · ZIP · GitHub URL · 브라우저 사용자 → 웹 화면 · 이력 · Insights12같은 제품 API · /api/v13 OAuth · deploy_repository · MCP 클라이언트 → OAuth MCP · deploy_repository34같은 제품 API5 ZIP 업로드 · deploy_local_project · railshot-local MCP → 검증 · 대상 확인 · 202 접수56 queued 기록 · 202 · 검증 · 대상 확인 · 202 접수 → operation 상태 · run 바인딩67 대기 순서 · operation 상태 · run 바인딩 → 배포 queue · 동시 378배포 상태 · 이력1source commit2workflow_dispatch3제출 commit4수정안 요청 · 조건부5검사한 이미지 게시6실행 · publication 조회7 failed · publication_unverified · CI 실행 바인딩 · 관찰 → operation 상태 · run 바인딩71images.json · spec · verdict · manifest2apply · 등록 대상3workload commit · push4revision5sync · 관찰6적용7이미지 pull · digest8HTTPS health9 공개 경로 · 공개 HTTPS URL → workload · Service910 succeeded · revision · URL · cd.js · deployPublished → operation 상태 · run 바인딩1011 unknown · 재조정 필요 · cd.js · deployPublished → operation 상태 · run 바인딩111PromQL 조회2scrape · probe3배포 상태 · 이력4HTTPS health

제출 → 접수

웹 화면·원격 MCP·로컬 MCP가 같은 제품 API로 요청하고, API는 확인한 요청을 queued로 기록한 뒤 202로 답합니다.

  1. 브라우저 사용자데이터: 폴더 · ZIP · GitHub URL웹 화면 · 이력 · Insightsapps/dashboard

    웹 화면에서 소스와 등록된 환경을 고릅니다.

  2. 웹 화면 · 이력 · Insightsapps/dashboard데이터: 같은 제품 API · /api/v1검증 · 대상 확인 · 202 접수apps/api

    웹 화면은 같은 출처의 제품 API를 부릅니다.

  3. MCP 클라이언트데이터: OAuth · deploy_repositoryOAuth MCP · deploy_repositoryagent/remote-mcp.js

    원격 MCP는 OAuth로 연결하고 공개 GitHub 저장소를 입력으로 받습니다.

  4. OAuth MCP · deploy_repositoryagent/remote-mcp.js데이터: 같은 제품 API검증 · 대상 확인 · 202 접수apps/api

    원격 MCP 서버가 내부 API 클라이언트로 같은 배포 API를 부릅니다.

  5. railshot-local MCP데이터: ZIP 업로드 · deploy_local_project검증 · 대상 확인 · 202 접수apps/api

    사용자 컴퓨터의 stdio MCP가 폴더를 ZIP으로 묶어 올립니다. 이 세션은 원격 OAuth 세션과 공유되지 않습니다.

  6. 검증 · 대상 확인 · 202 접수apps/api데이터: queued 기록 · 202operation 상태 · run 바인딩api/product-store.js

    입력, 등록된 대상, 용량, idempotency 키를 확인한 뒤 operation을 queued로 기록하고 202로 답합니다. 202는 접수이며 배포 성공이 아닙니다.

  7. operation 상태 · run 바인딩api/product-store.js데이터: 대기 순서배포 queue · 동시 3apps/api

    동시 배포 수(기본 3) 안에서 접수 순서대로 꺼냅니다.

  8. operation 상태 · run 바인딩api/product-store.js관측: 배포 상태 · 이력웹 화면 · 이력 · Insightsapps/dashboard

    웹 화면과 MCP 도구는 같은 operation 기록을 읽습니다. 최근 시도와 현재 검증된 배포를 따로 보여 주며, AI 작업 완료는 배포 성공이 아닙니다.

CI 검사 → 이미지 게시

고정된 플랫폼 코드가 제출 commit을 검사하고, 고칠 수 있는 실패만 AI에 맡긴 뒤 같은 검사를 다시 통과한 이미지만 게시합니다.

  1. 배포 queue · 동시 3apps/api데이터: source commitsource commit · trailerapps/<tenant>/<app>

    제출 소스를 비공개 apps 저장소에 commit으로 만들고(Railshot-Request · Railshot-Target trailer) 브랜치를 force 없이 갱신합니다.

  2. 배포 queue · 동시 3apps/api실행 · 적용: workflow_dispatchloop · 기본 검사 L0–L3railshot-deploy.yml

    tenant · app · source_commit · target_id로 실행을 요청합니다. 응답이 유실되면 다시 보내지 않고 같은 commit의 실행을 찾습니다.

  3. source commit · trailerapps/<tenant>/<app>데이터: 제출 commitloop · 기본 검사 L0–L3railshot-deploy.yml

    제출 commit과 고정된 플랫폼 코드(PLATFORM_REF)만 checkout합니다.

  4. SDK 수정 · 고칠 수 있는 실패만railshot-deploy.yml데이터: 수정안 요청 · 조건부AI SDK provider

    고칠 수 있는 실패 분류일 때만 부르고, 같은 실패가 두 번 나오거나 시도 한도에 닿으면 멈춥니다. 통과·실패는 LLM이 아니라 검사가 정합니다.

  5. release · GHCR 게시 · 바인딩railshot-deploy.yml데이터: 검사한 이미지 게시GHCR

    검사를 통과한 bundle을 확인한 뒤 같은 이미지를 GHCR에 게시합니다. 다시 빌드하지 않습니다.

  6. CI 실행 바인딩 · 관찰apps/api관측: 실행 · publication 조회railshot-deploy.yml

    run id, source commit, target, app이 접수 기록과 일치해야 게시로 인정합니다.

  7. CI 실행 바인딩 · 관찰apps/api실패 · 결과 불명: failed · publication_unverifiedoperation 상태 · run 바인딩api/product-store.js

    CI 실패나 게시 확인 실패는 진단과 함께 기록하고 CD로 넘기지 않습니다.

적용 → 공개 확인

게시 기록이 등록된 대상과 일치할 때만 config Git과 Argo CD로 적용하고, 등록된 공개 HTTPS 주소를 확인해야 성공으로 기록합니다.

  1. release · GHCR 게시 · 바인딩railshot-deploy.yml데이터: images.json · spec · verdict · manifestcd.js · deployPublishedapps/api

    CD는 게시 기록의 파일을 신뢰한 loader로 읽습니다. CI는 클러스터 자원이나 URL, 배포 성공을 만들지 않습니다.

  2. cd.js · deployPublishedapps/api실행 · 적용: apply · 등록 대상신뢰 config · 등록 대상 확인gitops/bridge.py

    등록된 앱과 tenant가 게시 기록과 같을 때만 gitops/bridge.py를 신뢰한 config로 실행합니다.

  3. commit · push · 원격 readbackgitops/bridge.py데이터: workload commit · pushconfig Git 저장소

    전용 브랜치의 등록 경로에 workload.json만 commit하고, push 의도를 먼저 기록한 뒤 push해 원격 revision을 다시 읽어 확인합니다. 결과가 불확실하면 다시 push하지 않습니다.

  4. config Git 저장소데이터: revisionApplication · AppProject 검사Argo CD

    Argo CD Application이 가리키는 config 저장소의 revision입니다.

  5. Argo sync · 관찰gitops/bridge.py실행 · 적용: sync · 관찰Application · AppProject 검사Argo CD

    AppProject를 검사한 뒤 sync를 요청하고, 관찰할 때는 sync 없이 읽기만 합니다.

  6. Application · AppProject 검사Argo CD실행 · 적용: 적용workload · ServiceK3s 앱 클러스터

    등록된 대상 클러스터에 workload를 적용합니다.

  7. workload · ServiceK3s 앱 클러스터데이터: 이미지 pull · digestGHCR

    게시된 digest의 이미지를 받습니다. 비공개 GHCR이면 전용 pull credential이 필요합니다.

  8. 공개 HTTPS probegitops/bridge.py관측: HTTPS health공개 HTTPS URL

    운영자가 등록한 HTTPS health 주소만, 리다이렉트 없이 200(과 지정한 JSON)인지 확인합니다.

  9. 공개 HTTPS URL데이터: 공개 경로workload · ServiceK3s 앱 클러스터

    공개 경로(LB · NodePort · 인증서)는 provider와 등록 대상마다 다릅니다.

  10. cd.js · deployPublishedapps/api데이터: succeeded · revision · URLoperation 상태 · run 바인딩api/product-store.js

    cd.deployed, revision, 공개 HTTPS 성공·확인 시각·유효한 URL이 모두 있을 때만 succeeded로 기록합니다.

  11. cd.js · deployPublishedapps/api실패 · 결과 불명: unknown · 재조정 필요operation 상태 · run 바인딩api/product-store.js

    결과를 알 수 없으면 unknown으로 남기고, 같은 적용을 다시 보내거나 되돌리지 않습니다.

관측 · 판정과 별개

지표와 probe는 배포 성공을 정하지 않습니다. 없는 값, 오래된 값, 수집 실패는 그대로 표시합니다.

  1. metrics observerapps/api관측: PromQL 조회Prometheus

    up, probe_success, Pod 지표를 읽습니다. 없거나 오래되었거나 수집에 실패한 값은 그 상태로 보여 주며 0으로 바꾸지 않습니다.

  2. Prometheus관측: scrape · probeworkload · ServiceK3s 앱 클러스터

    exporter scrape와 HTTP probe입니다. 이 지표는 배포 성공 판정에 쓰이지 않습니다.

  3. operation 상태 · run 바인딩api/product-store.js관측: 배포 상태 · 이력웹 화면 · 이력 · Insightsapps/dashboard

    웹 화면과 MCP 도구는 같은 operation 기록을 읽습니다. 최근 시도와 현재 검증된 배포를 따로 보여 주며, AI 작업 완료는 배포 성공이 아닙니다.

  4. 공개 HTTPS probegitops/bridge.py관측: HTTPS health공개 HTTPS URL

    운영자가 등록한 HTTPS health 주소만, 리다이렉트 없이 200(과 지정한 JSON)인지 확인합니다.

모든 연결을 같은 굵기로 보여 줍니다. 흐름을 고르면 그 경로만 번호와 함께 강조됩니다.

  • 실선 · 소스 · 이미지 · 요청이 흐르는 방향
  • 파선 · 실행 요청 · 적용 · sync
  • 긴 점선 · 상태 조회 · probe · 지표, 판정과 별개
  • 짧은 파선 · 실패 · unknown 기록
  • 굵은 검은 선 · 고른 흐름, 번호는 순서
  • 상자 · 소유 경계, 머리말에 소스 경로
  • 안쪽 칩 · 그 경계의 구성 요소
  • 점선 상자 · 플랫폼 밖
  • 주황 테두리 · 모델이 판단하는 곳
  • 제품 API
  • 배포 기록
  • CD 실행 경계
  • 진입 · CI · 대상

docs/architecture/README.md의 10월 2일 기준(bc61a5a) 그림은 구현 이력이고, 이 구성도는 645e28a 코드를 따릅니다. 공급자와 네트워크 경로는 등록한 대상마다 다르며, 모든 공급자가 늘 켜져 있다는 뜻이 아닙니다.