API 적용 최초 배포
Deploy feedback demo / deploy (push) Failing after 4m26s

This commit is contained in:
root
2026-09-01 17:12:46 +09:00
parent badf5f2c81
commit aaddfc7bfc
44 changed files with 1331 additions and 867 deletions
+1
View File
@@ -75,6 +75,7 @@ services:
ABC_API_KEY: ${SECRETARY_ABC_API_KEY:-MASTER_API_KEY}
UPLOAD_ROOT_DIR: /app/uploads
UPLOAD_MAX_FILE_SIZE_MB: ${UPLOAD_MAX_FILE_SIZE_MB:-30}
DEFAULT_SUPPORT_WORKSPACE_CODE: ${DEFAULT_SUPPORT_WORKSPACE_CODE:-EGBIM_DEMO}
ports:
- "${SECRETARY_API_PORT:-8011}:8010"
depends_on:
+27 -160
View File
@@ -1,173 +1,40 @@
name: abc-user-feedback-deploy
name: egbim-feedback-demo
services:
web:
build:
context: ..
dockerfile: docker/web.dockerfile
args:
NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com}
# Browser requests stay same-origin. Next.js proxies them server-side.
APP_NEXT_PUBLIC_API_BASE_URL: ''
APP_NEXT_PUBLIC_FEEDBACK_ONLY: 'true'
environment:
NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL}
INTERNAL_API_BASE_URL: http://api:4000
SUPPORT_API_BASE_URL: http://secretary-api:8010
SECRETARY_ABC_API_KEY: ${SECRETARY_ABC_API_KEY:-}
ports:
- '${WEB_PORT:-3030}:3000'
depends_on:
api:
condition: service_started
secretary-api:
condition: service_started
restart: unless-stopped
api:
build:
context: ..
dockerfile: docker/api.dockerfile
environment:
APP_ADDRESS: 0.0.0.0
APP_PORT: 4000
ADMIN_WEB_URL: ${ADMIN_WEB_URL}
BASE_URL: ${BASE_URL}
JWT_SECRET: ${JWT_SECRET}
INITIAL_SUPER_ADMIN_PHONE_NUMBER: ${INITIAL_SUPER_ADMIN_PHONE_NUMBER:-}
ADMIN_CANDIDATE_EMAILS: ${ADMIN_CANDIDATE_EMAILS:-}
GITEA_API_URL: ${GITEA_API_URL:-https://gitea.hmac.kr/api/v1}
GITEA_API_TOKEN: ${GITEA_API_TOKEN:-}
GITHUB_API_TOKEN: ${GITHUB_API_TOKEN:-}
JIRA_API_EMAIL: ${JIRA_API_EMAIL:-}
JIRA_API_TOKEN: ${JIRA_API_TOKEN:-}
JIRA_WEBHOOK_SECRET: ${JIRA_WEBHOOK_SECRET:-}
JIRA_ISSUE_TYPE: ${JIRA_ISSUE_TYPE:-Task}
MYSQL_PRIMARY_URL: mysql://userfeedback:userfeedback@mysql:3306/userfeedback
SMTP_ENABLED: ${SMTP_ENABLED:-false}
SMTP_HOST: ${SMTP_HOST:-}
SMTP_PORT: ${SMTP_PORT:-25}
SMTP_SENDER: ${SMTP_SENDER:-}
SMTP_USERNAME: ${SMTP_USERNAME:-}
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
SMTP_TLS: ${SMTP_TLS:-false}
SMTP_CIPHER_SPEC: ${SMTP_CIPHER_SPEC:-}
SMTP_OPPORTUNISTIC_TLS: ${SMTP_OPPORTUNISTIC_TLS:-false}
MASTER_API_KEY: ${MASTER_API_KEY:-}
SUPPORT_API_BASE_URL: http://secretary-api:8010
ACCESS_TOKEN_EXPIRED_TIME: ${ACCESS_TOKEN_EXPIRED_TIME:-10m}
REFRESH_TOKEN_EXPIRED_TIME: ${REFRESH_TOKEN_EXPIRED_TIME:-1h}
AUTO_MIGRATION: ${AUTO_MIGRATION:-true}
OPENSEARCH_USE: ${OPENSEARCH_USE:-false}
OPENSEARCH_NODE: ${OPENSEARCH_NODE:-}
OPENSEARCH_USERNAME: ${OPENSEARCH_USERNAME:-}
OPENSEARCH_PASSWORD: ${OPENSEARCH_PASSWORD:-}
NAVER_WORKS_ENABLED: ${NAVER_WORKS_ENABLED:-false}
NAVER_WORKS_API_BASE_URL: ${NAVER_WORKS_API_BASE_URL:-https://www.worksapis.com/v1.0}
NAVER_WORKS_AUTH_URL: ${NAVER_WORKS_AUTH_URL:-https://auth.worksmobile.com/oauth2/v2.0/token}
NAVER_WORKS_ACCESS_TOKEN: ${NAVER_WORKS_ACCESS_TOKEN:-}
NAVER_WORKS_BOT_ID: ${NAVER_WORKS_BOT_ID:-}
NAVER_WORKS_DEFAULT_ROOM_ID: ${NAVER_WORKS_DEFAULT_ROOM_ID:-}
NAVER_WORKS_CLIENT_ID: ${NAVER_WORKS_CLIENT_ID:-}
NAVER_WORKS_CLIENT_SECRET: ${NAVER_WORKS_CLIENT_SECRET:-}
NAVER_WORKS_SERVICE_ACCOUNT: ${NAVER_WORKS_SERVICE_ACCOUNT:-}
NAVER_WORKS_PRIVATE_KEY: ${NAVER_WORKS_PRIVATE_KEY:-}
NAVER_WORKS_SCOPE: ${NAVER_WORKS_SCOPE:-bot.message bot}
NAVER_WORKS_MAX_RETRIES: ${NAVER_WORKS_MAX_RETRIES:-3}
NAVER_WORKS_MAX_MESSAGE_LENGTH: ${NAVER_WORKS_MAX_MESSAGE_LENGTH:-1000}
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
secretary-api:
build:
context: ..
dockerfile: docker/secretary-api.dockerfile
environment:
APP_NAME: secretary-api
APP_ENV: ${APP_ENV:-staging}
APP_HOST: 0.0.0.0
APP_PORT: 8010
DOCS_ROOT_PATH: /secretary-docs
DATABASE_URL: mysql+pymysql://baron_support:baron_support@mysql-secretary:3306/baron_support
ABC_API_BASE_URL: http://api:4000
ABC_API_KEY: ${SECRETARY_ABC_API_KEY:-}
MASTER_API_KEY: ${MASTER_API_KEY:-}
ADMIN_CANDIDATE_TENANT_ID: ${ADMIN_CANDIDATE_TENANT_ID:-}
INITIAL_SUPER_ADMIN_PHONE_NUMBER: ${INITIAL_SUPER_ADMIN_PHONE_NUMBER:-}
SSO_ISSUER: ${SSO_ISSUER:-}
NODE_ENV: production
HOSTNAME: 0.0.0.0
# Keep browser requests on 10.13.10.4:8864 to avoid CORS.
NEXT_PUBLIC_API_BASE_URL: ''
NEXT_PUBLIC_FEEDBACK_ONLY: 'true'
# Existing management console API.
SUPPORT_CONSOLE_API_BASE_URL: ${SUPPORT_CONSOLE_API_BASE_URL:-https://feedback.hmac.kr/api/support}
SSO_ISSUER: ${SSO_ISSUER:-https://sso.hmac.kr/oidc}
SSO_AUTHORIZATION_ENDPOINT: ${SSO_AUTHORIZATION_ENDPOINT:-https://sso.hmac.kr/oidc/oauth2/auth}
SSO_TOKEN_ENDPOINT: ${SSO_TOKEN_ENDPOINT:-https://sso.hmac.kr/oidc/oauth2/token}
SSO_USERINFO_ENDPOINT: ${SSO_USERINFO_ENDPOINT:-https://sso.hmac.kr/oidc/userinfo}
SSO_SCOPE: ${SSO_SCOPE:-openid profile email}
# These are server-only values. Do not prefix them with NEXT_PUBLIC_ and
# do not put them in the browser build.
SSO_CLIENT_ID: ${SSO_CLIENT_ID:-}
SSO_CLIENT_SECRET: ${SSO_CLIENT_SECRET:-}
JWT_SECRET: ${JWT_SECRET}
UPLOAD_ROOT_DIR: /app/uploads
UPLOAD_MAX_FILE_SIZE_MB: ${UPLOAD_MAX_FILE_SIZE_MB:-30}
depends_on:
api:
condition: service_started
mysql-secretary:
condition: service_healthy
volumes:
- ../uploads:/app/uploads
restart: unless-stopped
mysql:
image: mysql:8.0
command:
[
'--default-authentication-plugin=mysql_native_password',
'--collation-server=utf8mb4_bin',
]
environment:
MYSQL_ROOT_PASSWORD: userfeedback
MYSQL_DATABASE: userfeedback
MYSQL_USER: userfeedback
MYSQL_PASSWORD: userfeedback
TZ: UTC
# 스테이징 외부 DB 접속용 포트입니다.
JWT_SECRET: ${JWT_SECRET:-}
SUPPORT_TENANT_ID: ${SUPPORT_TENANT_ID:-}
ports:
- '${MYSQL_PORT:-13306}:3306'
- '${WEB_PORT:-8864}:3000'
healthcheck:
test:
[
'CMD-SHELL',
'mysqladmin ping -h 127.0.0.1 -u root -p$$MYSQL_ROOT_PASSWORD --silent',
]
interval: 5s
test: ['CMD-SHELL', 'wget -q -O - http://127.0.0.1:3000/api/health >/dev/null']
interval: 10s
timeout: 5s
retries: 30
start_period: 15s
volumes:
- mysql:/var/lib/mysql
retries: 12
start_period: 20s
restart: unless-stopped
mysql-secretary:
hostname: mysql-secretary
image: mysql:8.0
command:
[
'--default-authentication-plugin=mysql_native_password',
'--collation-server=utf8mb4_bin',
'--default-time-zone=+09:00',
]
environment:
MYSQL_ROOT_PASSWORD: baron_support
MYSQL_DATABASE: baron_support
MYSQL_USER: baron_support
MYSQL_PASSWORD: baron_support
TZ: Asia/Seoul
# 스테이징 외부 DB 접속용 포트입니다.
ports:
- '${MYSQL_SECRETARY_PORT:-13308}:3306'
healthcheck:
test:
[
'CMD-SHELL',
'mysqladmin ping -h 127.0.0.1 -u root -p$$MYSQL_ROOT_PASSWORD --silent',
]
interval: 5s
timeout: 5s
retries: 30
start_period: 15s
volumes:
- mysql-secretary:/var/lib/mysql
restart: unless-stopped
volumes:
mysql:
mysql-secretary:
+5 -1
View File
@@ -1,6 +1,8 @@
# This Dockerfile is copy-pasted into our main docs at /docs/handbook/deploying-with-docker.
# Make sure you update both files!
ARG NPM_REGISTRY=https://registry.npmjs.org
ARG APP_NEXT_PUBLIC_API_BASE_URL=https://feedback.hmac.kr
ARG APP_NEXT_PUBLIC_FEEDBACK_ONLY=true
FROM node:24.14.1-alpine AS base
ARG NPM_REGISTRY
ENV COREPACK_NPM_REGISTRY=${NPM_REGISTRY} \
@@ -18,6 +20,8 @@ RUN turbo prune --scope=web --docker
# Add lockfile and package.json's of isolated subworkspace
FROM base AS installer
ARG APP_NEXT_PUBLIC_API_BASE_URL
ARG APP_NEXT_PUBLIC_FEEDBACK_ONLY
RUN apk add --no-cache libc6-compat
RUN apk --no-cache add --virtual .builds-deps build-base python3
@@ -37,7 +41,7 @@ COPY --from=builder /app/out/full/ .
COPY turbo.json ./
COPY --from=builder /app/apps/web/.env.build /app/apps/web/.env.production
RUN printf 'NEXT_PUBLIC_API_BASE_URL=%s\nNEXT_PUBLIC_FEEDBACK_ONLY=%s\n' "$APP_NEXT_PUBLIC_API_BASE_URL" "$APP_NEXT_PUBLIC_FEEDBACK_ONLY" > /app/apps/web/.env.production
RUN SKIP_ENV_VALIDATION=true pnpm exec turbo run build --filter=web...
FROM base AS runner