goquest architecture
goquest는 neunexus 생태계 전체의 티켓·작업 관리 서비스입니다 — 사람이 아니라 AI 에이전트를 1차 사용자로 두는 agent-first 설계로, REST API 위에 상태 없는 MCP 프록시 계층을 얹었습니다. 모든 코드·인프라·문서 작업은 이 서비스의 티켓(Epic/Task/Sub-task)으로 추적되며, 티켓 CRUD와 상태머신, SpiceDB 기반 세분화 권한, GitHub 연동 자동 링크, Redis 이벤트 기반 후속 처리를 갖췄습니다.
왜 필요한가
작업을 다양하게 진행하다 보니 도중에 이슈가 발생하면 기존 작업을 이어서 하기 어려운 문제가 있었습니다. 또한 한 세션에서 진행 중이던 작업 내용을 다른 세션에서 이어받으려 할 때 학습 비용이 크게 발생했습니다. 이런 학습 비용과 작업 현황 파악 문제를 해결하기 위해 티켓 서비스를 만들었습니다. 기존 티켓 서비스들은 자체 IAM 서비스와 호환이 안 되는 경우가 많았고, API로 작업을 진행할 때 필요한 API가 없거나 제대로 동작하지 않는 이슈가 있어 새로 프로젝트를 만들었습니다.
00
이 프로젝트는 무엇이고 왜 존재하는가
overview.json → diagram_spec
goquest는 neunexus 생태계 전용 agent-first 티켓 시스템입니다 — 1차 사용 주체를 사람이 아니라 AI 에이전트/봇으로 설계했습니다. REST API 위에 상태 없는 MCP 프록시 계층을 얹었습니다.
goquest / overview.yaml
01
누가, 어떻게 GoQuest에 닿는가
context.json → default
외부 관점 — goquest는 AI 에이전트를 1차 사용자로 두고, 그 위에 사람(관리자·고객)과 GitHub 웹훅이 함께 붙는 허브형 서비스입니다.
goquest / context.yaml
02
cmd/service 내부는 어떻게 나뉘는가
components.json → structure
내부 관점 — 사용자와 직접 연결되는 진입점은 goquest-ui(사람)·goquest-iim(AI 에이전트) 둘뿐이고, 둘 다 cmd/service의 REST API 하나로 수렴합니다. ticket 도메인이 시스템의 심장부이고, auth/spicedb가 모든 요청을 게이트하며, queue(Redis Streams)가 도메인 로직과 비동기 후속 처리를 분리합니다.
goquest / component-structure.yaml
03
어느 클러스터, 어느 경로로 뜨는가
deploy.json → network
neunexus 클러스터(OpenStack Dalmatian 기반 kubeadm K8s, Calico VXLAN) 위에서 Octavia LB + Traefik Ingress로 트래픽을 받고, ArgoCD GitOps로 배포됩니다. 시크릿은 평문 매니페스트에 넣지 않고 Vault + Vault Secrets Operator(VSO)가 K8s Secret으로 동기화합니다.
goquest / infra-network.yaml
04
데이터는 어떤 테이블로, 어떻게 연결되는가
erd.json → tables/relations
실제 마이그레이션 기준 — workspaces→projects→tickets 계층을 중심으로 인증·VCS·참조문서·태그·템플릿·게임화·감사로그까지 23개 테이블, 24개 관계입니다. archview는 전용 테이블 노드가 없어, 컬럼 목록(이름:타입, PK 표시)을 박스 하나의 여러 줄 라벨로 접어 넣는 방식으로 근사했습니다.
goquest / erd.yaml
05
커밋이 어떻게 배포로 이어지는가
deploy.json → cicd
git push 웹훅이 toji-ci(Tekton)를 트리거하면 dagger-engine에 빌드를 위임하고, 이미지를 레지스트리에 푸시하는 동시에 toji-cd(ArgoCD) 매니페스트를 writeback합니다 — 폴링을 거치지 않는 CI-native 배포라 반영 지연이 없습니다.
goquest / cicd-pipeline.yaml
06
시크릿은 어디서 와서 어떻게 파드에 들어가는가
deploy.json → secrets
평문 시크릿을 매니페스트에 두지 않습니다. K8s ServiceAccount가 VaultAuth로 Vault Secrets Operator(VSO)를 인증하면, VSO가 Vault를 읽어 K8s Secret으로 동기화하고, goquest 파드는 그 Secret을 env/volume으로만 마운트합니다.
goquest / secrets-flow.yaml
07
요청 하나가 어떤 계층을 통과하는가
techstack.json → api_layers
Go 백엔드(REST, ORM 없이 raw SQL) + React/Refine 관리 UI + TypeScript MCP 프록시, 3단 구성 스택입니다. 사람은 관리 UI에서, AI 에이전트는 MCP 프록시에서 각각 진입해 동일한 Go REST API로 수렴합니다.
goquest / api-layers.yaml
08
REST API는 어떤 그룹으로 나뉘는가
techstack.json → api_endpoints
루트 아래 tickets·workspaces·vcs·auth 네 그룹으로 나뉜 REST 표면입니다 — 티켓 CRUD/상태전이, 워크스페이스·프로젝트 관리, VCS 연동, 인증이 각각의 엔드포인트 그룹을 이룹니다.
goquest / api-endpoints.yaml
09
AI 에이전트의 티켓 생성 요청은 어디를 거치는가
dataflows.json → flow (create-ticket)
MCP 요청 1건이 REST API 검증 → 도메인 서비스 → Postgres 기록 → Redis 이벤트 발행까지 이어지는 대표 시나리오입니다.
goquest / dataflow-create-ticket.yaml
10
티켓 상태 전이는 어떻게 검증되는가
dataflows.json → flow (state-transition)
상태 변경은 하드코딩된 상태머신을 통과해야만 커밋됩니다 — 잘못된 전이는 도메인 계층에서 거부됩니다.
goquest / dataflow-state-transition.yaml
rendered via archview · d2lang/d2 · ELK layout