서울대학교 컴퓨터공학부 홈페이지의 소스코드입니다.
| 디렉터리 | 분류 | 기술 스택 |
|---|---|---|
apps/web |
프론트 | TanStack Start |
apps/api |
백엔드 | Kotlin · Spring Boot · MySQL · Elasticsearch |
e2e |
E2E | Playwright |
infra |
배포 | compose · Caddy · 모니터링 |
flowchart LR
user(["브라우저"])
subgraph host["호스트"]
edge["Caddy<br/>TLS · 보안 헤더 · 라우팅"]
web["web :3000<br/>Hono · TanStack Start SSR"]
api["api :8080<br/>Spring · MySQL · Elasticsearch"]
end
user -->|HTTPS| edge
edge -->|"etc"| web
edge -->|"/api/*"| api
web -. "SSR 시 /api" .-> edge
OAuth(id.snucse.org)로 발급되는 세션 쿠키 JSESSIONID를 사용해 인증합니다. (학내망에서만 가능)
| 주소 | 브랜치 | ||
|---|---|---|---|
| production | https://cse.snu.ac.kr | main |
학내 호스트. 학외에서 드물게 연결이 끊기면 재시도하면 됩니다. |
| staging | https://168.107.16.249.nip.io | develop |
클라우드. 데이터는 production 과 별개입니다 |
브랜치에 push 되면 자동으로 배포됩니다.
패키지와 환경변수를 세팅합니다.
pnpm install
cp apps/web/env/.env.example apps/web/env/.env # 카카오 맵 API 키. 없어도 지도 외 기능은 동작합니다# staging 백엔드를 사용합니다.
pnpm web:dev
# 백엔드도 직접 띄우려면 도커가 필요합니다.
pnpm api:up # MySQL · Elasticsearch · Spring. :8080
VITE_API_BASE_URL=http://localhost:8080 pnpm web:dev # 프론트가 로컬 백엔드를 보게 합니다로컬/staging 백엔드는 OAuth 대신 /api/v2/mock-login 으로 staff 세션을 만듭니다.
| 명령어 | 설명 |
|---|---|
pnpm web:dev web:build web:start |
프론트. web:start 는 server.ts 로 빌드 산출물을 서빙합니다(prod 와 같은 서버) |
pnpm api:up api:down api:test |
백엔드 스택 · Gradle 테스트 |
pnpm e2e |
E2E. --update-snapshots 로 baseline 을 갱신합니다 |
pnpm test |
api:test + e2e |
pnpm gen:api |
백엔드 스펙에서 프론트 API 타입을 생성합니다 |
pnpm typecheck lint knip |
정적 검사 |
작업은 별도 브랜치에서 하고 develop 으로 PR을 보냅니다. 급한 수정은 hotfix/* 에서 main 으로 보내고 develop 에 되가져옵니다. 두 브랜치 모두 직접 push 는 막혀 있습니다.
머지는 feature → develop 은 squash, develop → main 은 merge commit 입니다.
CI가 통과되어야 머지됩니다.
| 잡 | 하는 일 |
|---|---|
api-jar |
백엔드 소스의 내용 해시로, 이미 테스트된 jar 가 캐시에 있는지 봅니다. |
api-test |
jar가 없을 때만 돕니다. Gradle 테스트 + bootJar, 통과하면 캐시에 넣습니다. |
web-test |
typecheck · lint · knip 뒤에 E2E. 백엔드는 위 jar 로 띄웁니다. |
백엔드 API 를 고쳤으면 pnpm gen:api 로 프론트 타입을 다시 만들어 같은 PR 에 넣습니다. pnpm e2e 가 스펙과 타입을 비교해 어긋나면 실패합니다.
머지하면 자동 배포됩니다. develop은 staging에 main은 production에 배포합니다. 롤백은 revert PR을 올려 일반 배포 프로세스와 동일하게 진행합니다.
GitHub 에는 Environment production·staging 의 시크릿 SSH_KEY 와 레포 시크릿 KAKAO_MAP_KEY(웹 빌드 arg) 가 있습니다. 나머지 비밀은 호스트 ~/secrets/ 에 둡니다.
app.env |
MYSQL_ROOT_PASSWORD MYSQL_USER MYSQL_PASSWORD MYSQL_DATABASE OIDC_CLIENT_SECRET(prod) |
monitoring.env |
GF_SECURITY_ADMIN_PASSWORD · GF_SMTP_*(prod) |
certs/ |
TLS 인증서·키. production.env 의 경로와 맞아야 합니다 |
backup_offsite |
백업용 SSH 개인키(prod) |
백업은 매일 자정 호스트 ~/database/backup/ 에 남습니다(infra/ops/db-backup.sh).
docker run -d --name restore-test -e MYSQL_ROOT_PASSWORD=x -e MYSQL_DATABASE=csereal mysql:8.0
gunzip -c ~/database/backup/mysqldump-YYYY-MM-DD.gz | docker exec -i restore-test mysql -uroot -px csereal