가이드
Docker Compose로 배포
번들로 제공되는 docker-compose.prod.yml 및 install.sh를 사용한 단일 호스트 프로덕션 배포.
고성능 서버 한 대로 10분 안에 AskAIs Customer Service을 띄우고 싶으신가요? 바로 이 방법입니다. 동시 접속 ~500명 미만에 적합합니다. 더 큰 규모라면 Kubernetes 가이드로 이동하세요.
사전 요구 사항
- Docker 24+ 와 `docker compose` v2가 설치된 Linux 호스트
- ≥ 2 vCPU, 4 GB RAM(8 GB 권장)
- 호스트를 가리키는 도메인(Caddy / Cloudflare / nginx를 통한 TLS용)
한 줄 설치
git clone https://github.com/singlink/singlink
cd singlink
APP_DOMAIN=chat.acme.com bash scripts/install.sh이 스크립트는:
- docker + openssl을 확인합니다
- 강력한 무작위 시크릿이 포함된
.env.prod를 생성합니다(모드 600) - 세 개의 이미지(web / ws / worker)를 빌드합니다
docker compose -f docker-compose.prod.yml up -d로 전체 스택을 띄웁니다- web 컨테이너 내부에서
prisma migrate deploy를 실행합니다
실행되는 서비스
- postgres — pgvector PG16
- redis — pub/sub + 큐(비밀번호 보호)
- minio — 첨부 파일용 S3 호환 스토리지
- web / ws / worker — 세 개의 앱 프로세스
- nginx — 포트 8080의 리버스 프록시(WS 업그레이드 지원)
TLS 추가
동봉된 nginx는 포트 8080에서 HTTP/1.1을 종료합니다. 앞단에 TLS 종료 프록시를 배치하세요:
Caddy(가장 쉬움)
# /etc/caddy/Caddyfile
chat.acme.com {
reverse_proxy localhost:8080
}Cloudflare Tunnel(인바운드 포트 전혀 불필요)
cloudflared tunnel create singlink
cloudflared tunnel route dns singlink chat.acme.com
cloudflared tunnel run --url http://localhost:8080 singlinkDay-2 운영
# Logs
docker compose -f docker-compose.prod.yml logs -f
# Restart everything
docker compose -f docker-compose.prod.yml restart
# Stop (data persists in named volumes)
docker compose -f docker-compose.prod.yml down
# Upgrade
git pull
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d --build
docker compose -f docker-compose.prod.yml exec web pnpm db:deploy
# Backups (run from cron daily)
docker compose -f docker-compose.prod.yml exec -T postgres \
pg_dump -U singlink singlink | gzip > /backups/singlink-$(date +%F).sql.gzworker 스케일 아웃
AI worker 복제본을 더 실행합니다(Redis BullMQ가 분산을 처리합니다):
docker compose -f docker-compose.prod.yml up -d --scale worker=4Kubernetes로 넘어가야 할 때
- 고가용성 postgres / redis가 필요할 때(관리형 RDS / ElastiCache)
- 트래픽 급증 시 오토스케일링이 필요할 때
- 여러 리전에 걸쳐 운영할 때
- SLA상 단일 호스트 다운타임이 허용되지 않을 때
그러면 Kubernetes / Helm으로 이동하세요.