Files
hanarang-rails/Dockerfile
이랑이 8c123cb03a feat(v0.1.3): LLM 어댑터 + in-process 모드 + docker-compose — 외부인 배포 친화
## LLM 공급자 어댑터 (B)

- sister-agent/src/llm/ 에 LlmAdapter 인터페이스 신설. 어댑터 5종:
    openclaw (기존), openai, anthropic, ollama, mock
- 선택은 LLM_PROVIDER 환경변수로. 기본값 mock.
- 모델명은 LLM_MODEL_{MANAGER,PRINCIPAL,LEAD,JUNIOR} 로 외부화.
  OpenClaw 내부 네이밍이 기본값이지만 env 로 얼마든지 갈아끼움.
- openai 어댑터는 OPENAI_BASE_URL 로 OpenRouter / Azure / 로컬 llama.cpp
  서버까지 커버.

## In-process 단일 프로세스 모드 (C)

- sister-agent/src/core.ts 로 executeInvocation 을 library-export
- rails 에 InProcessTransport 추가. 동적 import 로 sister-agent core 를
  로드해 같은 Node 프로세스에서 함수 호출로 실행.
- DirectRailsClient 로 HTTP 루프백 없이 DB 에 직접 쓰기 — 단일
  프로세스에서도 observability 동일.
- RailsConfig 에 transport: "in-process" 추가.
- buildTransports 가 RAILS_TRANSPORT 와 per-stage override 를 지원하도록
  확장. 레거시 RAILS_TRANSPORT_MODE + RAILS_AGENT_*_HOST 도 그대로 호환.

## Git push 외부화 + allowlist env 화

- spawn.ts 의 ENABLE_GIT_PUSH 를 "GITEA_TOKEN 있으면 auto on" 으로 변경.
  기존 Dev 토폴로지는 sister LXC 들에 이미 토큰이 있어서 행동 변화 없음.
- rails.service.ts 의 파일 프록시 allowlist 를 GIT_RAW_ALLOWED_HOSTS
  env 로 외부화. 기본값은 기존 Gitea 호스트 유지.

## Docker / 배포

- Dockerfile 추가. 단일 이미지로 rails + sister-agent 둘 다 빌드.
- docker-compose.yml (기본): mariadb + rails 한 컨테이너 = in-process.
  docker compose up 한 줄로 로컬 E2E 가능.
- docker-compose.full.yml: rails + 4 개 독립 sister 컨테이너 = 분산.

## 설정 샘플 + 문서

- .env.example 완전 재작성: 필수/LLM/토폴로지/Gitea/Discord 5 섹션
- rails.config.local.yaml: in-process 샘플
- rails.config.distributed.yaml: http 분산 샘플
- docs/LOCAL-SETUP.md: 30분 퀵스타트 (Docker + 네이티브 두 경로)
- README 에 "5분 퀵스타트" + 토폴로지 표 + LLM 공급자 목록 추가

## 테스트

- tests/transport-build.test.ts (6 테스트): 기본값 / in-process /
  per-stage override / http 엔드포인트 누락 / env 기반 wiring / 레거시
  env 호환
- 전체 테스트 105 → 111 통과
2026-04-10 21:51:53 +09:00

69 lines
2.5 KiB
Docker

# ────────────────────────────────────────────────────────────────
# Dockerfile — builds rails + sister-agent + CLI into one image
#
# The image starts `rails serve` in single-process (in-process) mode.
# For distributed mode, see docker-compose.full.yml which uses the same
# image but overrides CMD / env vars per container.
# ────────────────────────────────────────────────────────────────
FROM node:22-bookworm-slim AS builder
RUN corepack enable \
&& apt-get update \
&& apt-get install -y --no-install-recommends git ca-certificates openssl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy manifests first for better layer caching
COPY package.json pnpm-lock.yaml tsconfig.json ./
COPY prisma ./prisma
COPY sister-agent/package.json ./sister-agent/
COPY sister-agent/tsconfig.json ./sister-agent/
# Install deps (root + sister-agent workspace — sister-agent has its own lockfile)
RUN pnpm install --frozen-lockfile
WORKDIR /app/sister-agent
RUN pnpm install --frozen-lockfile || pnpm install
WORKDIR /app
# Copy sources
COPY src ./src
COPY sister-agent/src ./sister-agent/src
# Generate prisma client + build both
RUN npx prisma generate \
&& pnpm build \
&& cd sister-agent && pnpm build
# ────────────── runtime image ──────────────
FROM node:22-bookworm-slim
RUN corepack enable \
&& apt-get update \
&& apt-get install -y --no-install-recommends git ca-certificates openssl wget \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /app/package.json /app/pnpm-lock.yaml ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/sister-agent/package.json ./sister-agent/
COPY --from=builder /app/sister-agent/node_modules ./sister-agent/node_modules
COPY --from=builder /app/sister-agent/dist ./sister-agent/dist
ENV NODE_ENV=production
ENV RAILS_PORT=18800
ENV RAILS_TRANSPORT=in-process
ENV SISTER_AGENT_CORE_PATH=/app/sister-agent/dist/core.js
ENV SISTER_WORKSPACE_DIR=/app/rails-projects
EXPOSE 18800
# Default command: run migrations then start the HTTP server
CMD ["sh", "-c", "npx prisma migrate deploy && node dist/cli/index.js serve"]