- config/db/storage/auth/router/perms: eQMS 규약 미러링, 권한 2-tier (관리자 전체 / 구성원 본인·신청만), oauth2-proxy 헤더 인증 + DEV_AUTH mock - 모델: 구성원/부서, 근무(출퇴근·휴가·공가·초과), 프로젝트(회사/제품/버전· 작업자portion·담당자·태스크·계약·첨부·분할입금), 인센티브(설정·단계· 유저배분·분기정산), 회계(거래·세금) - internal/worktime: 근로기준법 월 집계 엔진 - internal/incentive: BE/non-BE × 계약금/중도금/잔금 3단계 계산 + 시뮬레이션 - 시드 데이터, Go 멀티스테이지 Dockerfile - ADMIN_GROUPS 기본값 'admin' (전 내부 앱 공통 그룹) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
ce4023ca59
commit
f83724b995
@@ -0,0 +1,61 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"spin/internal/config"
|
||||
"spin/internal/db"
|
||||
"spin/internal/httpapi"
|
||||
"spin/internal/seed"
|
||||
"spin/internal/storage"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cfg := config.Load()
|
||||
|
||||
gdb, err := db.Connect(cfg.DatabaseURL)
|
||||
if err != nil {
|
||||
log.Fatalf("database connection failed: %v", err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
|
||||
store, err := storage.New(ctx, cfg)
|
||||
if err != nil {
|
||||
log.Printf("storage init failed (continuing without S3): %v", err)
|
||||
store = nil
|
||||
} else if err := store.EnsureBucket(ctx); err != nil {
|
||||
log.Printf("ensure bucket failed (retrying once): %v", err)
|
||||
time.Sleep(2 * time.Second)
|
||||
if err := store.EnsureBucket(ctx); err != nil {
|
||||
log.Printf("ensure bucket failed (best-effort): %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.SeedData {
|
||||
if err := seed.Run(gdb); err != nil {
|
||||
log.Printf("seed failed (continuing): %v", err)
|
||||
}
|
||||
} else {
|
||||
log.Printf("seed skipped (SEED=false)")
|
||||
}
|
||||
|
||||
router := httpapi.NewRouter(gdb, store, cfg)
|
||||
|
||||
addr := ":" + cfg.Port
|
||||
srv := &http.Server{
|
||||
Addr: addr,
|
||||
Handler: router,
|
||||
ReadTimeout: 30 * time.Second,
|
||||
WriteTimeout: 60 * time.Second,
|
||||
}
|
||||
|
||||
log.Printf("spin backend listening on %s (devAuth=%v)", addr, cfg.DevAuth)
|
||||
if err := srv.ListenAndServe(); err != nil {
|
||||
log.Fatalf("server error: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user