# Gitea 스테이징 등록 변수 BARON User Feedback와 secretary-api를 `172.16.10.175:3030`으로 배포할 때 Gitea에 등록할 환경변수와 Secret 정리입니다. ## 1. 스테이징 기본값 ### Variables | 이름 | 등록값 | 용도 | | ---------------------------- | ----------------------------------------------- | ----------------------------------------------- | | `APP_ENV` | `staging` | 실행 환경 | | `WEB_PORT` | `3030` | 외부 웹 포트 | | `API_PORT` | `4000` | Docker 내부 API 포트 (host에 공개하지 않음) | | `SECRETARY_API_PORT` | `8010` | Docker 내부 FastAPI 포트 (host에 공개하지 않음) | | `MYSQL_PORT` | 등록 불필요 | prod Compose는 DB host port를 공개하지 않음 | | `MYSQL_SECRETARY_PORT` | 등록 불필요 | prod Compose는 DB host port를 공개하지 않음 | | `NEXT_PUBLIC_API_BASE_URL` | `http://172.16.10.175:3030` | Web reverse proxy를 통한 브라우저 API 주소 | | `ADMIN_WEB_URL` | `http://172.16.10.175:3030` | 관리자 웹 주소 및 OAuth 기준 주소 | | `BASE_URL` | `http://172.16.10.175:3030` | Web reverse proxy를 통한 API 기준 주소 | | `SMTP_ENABLED` | `false` (현재 SSO 전용) 또는 `true` (SMTP 사용) | 이메일 기능 활성화 여부 | | `SMTP_HOST` | 사내 SMTP 호스트 | 메일 서버 | | `SMTP_PORT` | `25` 또는 사내 SMTP 포트 | 메일 서버 포트 | | `SMTP_SENDER` | 사내 발신 이메일 | 메일 발신자 | | `SMTP_TLS` | `false` 또는 `true` | SMTP TLS 사용 여부 | | `SMTP_CIPHER_SPEC` | 사내 SMTP 정책값 | TLS cipher 설정 | | `SMTP_OPPORTUNISTIC_TLS` | `false` 또는 `true` | SMTP opportunistic TLS | | `ACCESS_TOKEN_EXPIRED_TIME` | `10m` | Access Token 만료시간 | | `REFRESH_TOKEN_EXPIRED_TIME` | `1h` | Refresh Token 만료시간 | | `AUTO_MIGRATION` | `true` | API 시작 시 마이그레이션 | | `OPENSEARCH_USE` | `false` | OpenSearch 사용 여부 | | `OPENSEARCH_NODE` | 빈 값 | OpenSearch 미사용 | | `OPENSEARCH_USERNAME` | 빈 값 | OpenSearch 미사용 | | `OPENSEARCH_PASSWORD` | 빈 값 | OpenSearch 미사용 | > 스테이징 DB는 외부 host port를 사용하지 않습니다. 컨테이너 내부에서는 `mysql:3306`, `mysql-secretary:3306`으로 접근합니다. 외부 DB 접속이 필요하면 SSH 터널을 사용합니다. > | `SSO_ISSUER` | `https://sso.hmac.kr/oidc` | secretary-api용 SSO issuer | > | `SSO_CLIENT_ID` | `838cd69d-e722-41da-9f79-b3c42a509ef2` | BARON-SSO Client ID | `INTERNAL_API_BASE_URL`, `SUPPORT_API_BASE_URL`, `ABC_API_BASE_URL`는 Docker 내부 주소이므로 Gitea에 별도 등록하지 않습니다. ```text INTERNAL_API_BASE_URL=http://api:4000 SUPPORT_API_BASE_URL=http://secretary-api:8010 ABC_API_BASE_URL=http://api:4000 ``` 다음 값도 Compose에 고정되어 있으므로 Gitea에 별도 등록하지 않습니다. | 이름 | 고정값 | | ------------------- | -------------------------------------------------------------------------------- | | `APP_NAME` | `secretary-api` | | `APP_HOST` | `0.0.0.0` | | `APP_PORT` | `8010` | | `UPLOAD_ROOT_DIR` | `/app/uploads` | | `MYSQL_PRIMARY_URL` | `mysql://userfeedback:userfeedback@mysql:3306/userfeedback` | | `DATABASE_URL` | `mysql+pymysql://baron_support:baron_support@mysql-secretary:3306/baron_support` | 다음은 선택 기능을 사용할 때만 추가합니다. | 이름 | 등록값 | | ------------------------------------ | --------------------------- | | `MYSQL_SECONDARY_URLS` | 보조 MySQL URL JSON 배열 | | `AUTO_FEEDBACK_DELETION_ENABLED` | `false` | | `AUTO_FEEDBACK_DELETION_PERIOD_DAYS` | 자동 삭제 사용 시 보존 일수 | ## 2. Gitea Secrets ### API 및 관리자 인증 | 이름 | 등록값 | | ---------------------------------- | -------------------------------------------------------- | | `JWT_SECRET` | 긴 무작위 문자열 | | `MASTER_API_KEY` | ABC 전체 API 관리용 무작위 키 | | `INITIAL_SUPER_ADMIN_PHONE_NUMBER` | 선택값: 초기 SUPER 관리자 자동 지정용 BARON-SSO 전화번호 | | `ADMIN_CANDIDATE_EMAILS` | 관리자 후보 이메일 목록을 쉼표로 연결 | 예시: ```text ADMIN_CANDIDATE_EMAILS=admin1@example.com,admin2@example.com ``` 현재 로컬에 등록된 후보 이메일은 다음과 같습니다. 스테이징에서도 동일하게 사용할 때만 등록합니다. ```text cyhan@samaneng.com,hsmoon@hanmaceng.co.kr,hikim2@samaneng.com,thlee3@samaneng.com ``` ### SMTP | 이름 | 등록값 | | --------------- | ------------- | | `SMTP_USERNAME` | SMTP 계정 | | `SMTP_PASSWORD` | SMTP 비밀번호 | SMTP를 인증 없이 사용하면 두 값은 빈 값으로 둡니다. ### BARON-SSO | 이름 | 등록값 | | ------------------- | ----------------------- | | `SSO_CLIENT_SECRET` | BARON-SSO Client Secret | BARON-SSO에 다음 Redirect URI도 등록해야 합니다. ```text http://172.16.10.175:3030/api/auth/baron-sso/callback ``` ## 3. ABC API Key와 workspace 매핑 Gitea에는 ABC API Key와 내부 매핑 조회용 `MASTER_API_KEY`를 Secret으로 등록합니다. 프로젝트·채널 ID는 Gitea 변수나 수동 SQL로 관리하지 않고, 로그인 시 API가 ABC DB의 프로젝트·채널을 workspace code 기준으로 조회하여 `baron_support.workspace_channel_mappings`에 자동 등록·갱신합니다. ```text SECRETARY_ABC_API_KEY=<스테이징 ABC API Key> MASTER_API_KEY= ``` 자동 매핑 대상은 다음 조건을 만족해야 합니다. - workspace code와 동일한 이름의 ABC 프로젝트가 정확히 1개일 것 - 해당 프로젝트의 채널이 정확히 1개이거나, workspace code/프로젝트 이름과 일치하는 채널이 정확히 1개일 것 - 조건을 만족하면 기존 매핑은 보완하고, 매핑 행이 없으면 새로 INSERT할 것 현재 매핑 확인: ```sql SELECT w.id, w.workspace_code, w.workspace_name, m.id AS mapping_id, m.abc_project_id, m.abc_channel_id, m.is_active FROM workspaces w LEFT JOIN workspace_channel_mappings m ON m.workspace_id = w.id WHERE w.is_active = 1 ORDER BY w.id, m.id; ``` 배포 후 사용자가 로그아웃/로그인하거나 `/api/access/me`를 호출하면 EGBIM, TOVA 등의 누락 매핑이 자동으로 채워집니다. 프로젝트·채널 이름이 여러 개로 모호하면 잘못된 연결을 막기 위해 자동 등록하지 않으므로, 이 경우 ABC DB의 이름을 확인해야 합니다. ## 4. DB 접속값 Docker 내부 서비스 간 접속값은 다음과 같습니다. ```text # ABC 내장 DB MYSQL_PRIMARY_URL=mysql://userfeedback:userfeedback@mysql:3306/userfeedback # secretary-api 구축 DB DATABASE_URL=mysql+pymysql://baron_support:baron_support@mysql-secretary:3306/baron_support ``` 현재 `docker-compose.prod.yml`에는 DB 계정과 비밀번호가 직접 작성되어 있습니다. ```text ABC DB: userfeedback / userfeedback 구축 DB: baron_support / baron_support ``` 운영 배포 전에는 다음 값을 Gitea Secret으로 분리하고 Compose에서 참조하도록 변경하는 것을 권장합니다. ```text MYSQL_ROOT_PASSWORD MYSQL_PASSWORD SECRETARY_MYSQL_ROOT_PASSWORD SECRETARY_MYSQL_PASSWORD ``` ## 5. CI/CD 배포용 변수 Gitea Actions에서 SSH 배포 방식을 사용할 경우 다음 값을 등록합니다. ### Variables | 이름 | 등록값 | | ---------------------- | ----------------------------------------------------------------- | | `STAGING_HOST` | `172.16.10.175` (미등록 시 workflow 기본값 사용) | | `STAGING_PORT` | `22` (미등록 시 workflow가 기본값으로 사용) | | `STAGING_APP_DIR` | `/home/user/baron_qa` (미등록 시 workflow 기본값 사용) | | `STAGING_COMPOSE_FILE` | `docker/docker-compose.prod.yml` (미등록 시 workflow 기본값 사용) | | `STAGING_WEB_PORT` | `3030` | ### Secrets | 이름 | 등록값 | | ------------------------- | -------------------------------- | | `STAGING_USER` | 스테이징 서버 SSH 사용자 | | `STAGING_SSH_PRIVATE_KEY` | 배포용 SSH private key | | `STAGING_SSH_KNOWN_HOSTS` | 스테이징 서버의 `known_hosts` 값 | Docker Registry를 사용하는 경우 추가로 등록합니다. ```text REGISTRY_URL REGISTRY_USERNAME REGISTRY_PASSWORD ``` ## 6. 등록 전 확인사항 - 현재 스테이징은 `SMTP_ENABLED=false`로 등록하면 SMTP 없이 BARON-SSO 로그인과 권한 분기만 검증할 수 있습니다. 추후 SMTP 정보를 확보하면 `true`로 변경합니다. - Gitea Secret에는 API Key, `MASTER_API_KEY`, JWT Secret, SMTP 비밀번호, SSO Client Secret을 등록합니다. - ABC 프로젝트·채널 매핑은 로그인 시 ABC DB와 자동 동기화되며, 이름이 모호한 경우에만 ABC DB의 프로젝트·채널 이름을 확인합니다. - `INITIAL_SUPER_ADMIN_PHONE_NUMBER`는 선택값입니다. 등록하면 해당 BARON-SSO 전화번호 사용자를 초기 SUPER 관리자로 자동 승격하며, 미등록 시에도 API는 정상 기동합니다. - 외부 공개 포트는 Web `3030` 하나이며, Web이 Docker 내부 `api:4000`과 `secretary-api:8010`으로 reverse proxy합니다. - 로컬 Compose에 존재하는 API Key와 DB 비밀번호를 스테이징에 재사용하지 말고 스테이징용 Secret을 별도로 발급합니다.