From e3ec0f6c166d45f2c15fe7cd6cd6e90e7c11d7b6 Mon Sep 17 00:00:00 2001 From: OhSeongRak Date: Tue, 17 Jun 2025 18:09:45 +0900 Subject: [PATCH] fix: deployment --- deployment/Jenkinsfile | 14 +-- .../container/Dockerfile-smarketing-frontend | 92 +++++++------------ package.json | 5 +- vite.config.js | 44 ++++----- 4 files changed, 63 insertions(+), 92 deletions(-) diff --git a/deployment/Jenkinsfile b/deployment/Jenkinsfile index 9a3279d..d3649a7 100644 --- a/deployment/Jenkinsfile +++ b/deployment/Jenkinsfile @@ -85,13 +85,13 @@ podTemplate( # Docker 이미지 빌드 podman build \\ --build-arg PROJECT_FOLDER="." \\ - --build-arg REACT_APP_AUTH_URL="${props.auth_url}" \\ - --build-arg REACT_APP_MEMBER_URL="${props.member_url}" \\ - --build-arg REACT_APP_STORE_URL="${props.store_url}" \\ - --build-arg REACT_APP_MENU_URL="${props.menu_url}" \\ - --build-arg REACT_APP_SALES_URL="${props.sales_url}" \\ - --build-arg REACT_APP_CONTENT_URL="${props.content_url}" \\ - --build-arg REACT_APP_RECOMMEND_URL="${props.recommend_url}" \\ + --build-arg VUE_APP_AUTH_URL="${props.auth_url}" \\ + --build-arg VUE_APP_MEMBER_URL="${props.member_url}" \\ + --build-arg VUE_APP_STORE_URL="${props.store_url}" \\ + --build-arg VUE_APP_MENU_URL="${props.menu_url}" \\ + --build-arg VUE_APP_SALES_URL="${props.sales_url}" \\ + --build-arg VUE_APP_CONTENT_URL="${props.content_url}" \\ + --build-arg VUE_APP_RECOMMEND_URL="${props.recommend_url}" \\ --build-arg BUILD_FOLDER="deployment/container" \\ --build-arg EXPORT_PORT="${props.export_port}" \\ -f deployment/container/Dockerfile-smarketing-frontend \\ diff --git a/deployment/container/Dockerfile-smarketing-frontend b/deployment/container/Dockerfile-smarketing-frontend index 1f688b7..dd1086a 100644 --- a/deployment/container/Dockerfile-smarketing-frontend +++ b/deployment/container/Dockerfile-smarketing-frontend @@ -1,81 +1,51 @@ # Build stage FROM node:20-slim AS builder + ARG PROJECT_FOLDER +ARG VUE_APP_AUTH_URL +ARG VUE_APP_MEMBER_URL +ARG VUE_APP_STORE_URL +ARG VUE_APP_MENU_URL +ARG VUE_APP_SALES_URL +ARG VUE_APP_CONTENT_URL +ARG VUE_APP_RECOMMEND_URL ENV NODE_ENV=production +ENV VUE_APP_AUTH_URL=${VUE_APP_AUTH_URL} +ENV VUE_APP_MEMBER_URL=${VUE_APP_MEMBER_URL} +ENV VUE_APP_STORE_URL=${VUE_APP_STORE_URL} +ENV VUE_APP_MENU_URL=${VUE_APP_MENU_URL} +ENV VUE_APP_SALES_URL=${VUE_APP_SALES_URL} +ENV VUE_APP_CONTENT_URL=${VUE_APP_CONTENT_URL} +ENV VUE_APP_RECOMMEND_URL=${VUE_APP_RECOMMEND_URL} WORKDIR /app -# Install dependencies +# Copy package files COPY ${PROJECT_FOLDER}/package*.json ./ -RUN npm ci --only=production -# Build application +# Install all dependencies (including devDependencies for build) +RUN npm ci + +# Copy source code COPY ${PROJECT_FOLDER} . + +# Build the application RUN npm run build -# Run stage -FROM nginx:stable-alpine +# Production stage +FROM nginx:alpine AS production -ARG BUILD_FOLDER -ARG EXPORT_PORT -ARG REACT_APP_AUTH_URL -ARG REACT_APP_MEMBER_URL -ARG REACT_APP_STORE_URL -ARG REACT_APP_CONTENT_URL -ARG REACT_APP_RECOMMEND_URL +ARG EXPORT_PORT=18080 -# Create nginx user if it doesn't exist -RUN adduser -S nginx || true +# Copy built files from builder stage +COPY --from=builder /app/dist /usr/share/nginx/html -# Copy build files -COPY --from=builder /app/build /usr/share/nginx/html +# Copy nginx configuration +COPY deployment/container/nginx.conf /etc/nginx/conf.d/default.conf -# Create runtime config with all smarketing APIs -# index.html의 헤더에서 이 값을 읽어 환경변수를 생성함 -# api.js에서 이 환경변수를 이용함 -RUN echo "console.log('=== RUNTIME-ENV.JS 로드됨 (Docker 빌드) ==='); \ -window.__runtime_config__ = { \ - AUTH_URL: '${REACT_APP_AUTH_URL}', \ - MEMBER_URL: '${REACT_APP_MEMBER_URL}', \ - STORE_URL: '${REACT_APP_STORE_URL}', \ - CONTENT_URL: '${REACT_APP_CONTENT_URL}', \ - RECOMMEND_URL: '${REACT_APP_RECOMMEND_URL}', \ - ENV: 'production', \ - DEBUG: false, \ - API_TIMEOUT: 30000, \ - RETRY_ATTEMPTS: 3, \ - RETRY_DELAY: 1000, \ - VERSION: '1.0.0', \ - BUILD_DATE: new Date().toISOString() \ -}; \ -window.getApiConfig = () => window.__runtime_config__; \ -window.getApiUrl = (serviceName) => { \ - const config = window.__runtime_config__; \ - const urlKey = \`\${serviceName.toUpperCase()}_URL\`; \ - return config[urlKey] || null; \ -}; \ -console.log('✅ [RUNTIME] Docker 빌드 런타임 설정 로드 완료');" > /usr/share/nginx/html/runtime-env.js - -# Copy and process nginx configuration -COPY ${BUILD_FOLDER}/nginx.conf /etc/nginx/templates/default.conf.template - -# Add custom nginx settings -RUN echo "client_max_body_size 100M;" > /etc/nginx/conf.d/client_max_body_size.conf -RUN echo "proxy_buffer_size 128k;" > /etc/nginx/conf.d/proxy_buffer_size.conf -RUN echo "proxy_buffers 4 256k;" > /etc/nginx/conf.d/proxy_buffers.conf -RUN echo "proxy_busy_buffers_size 256k;" > /etc/nginx/conf.d/proxy_busy_buffers_size.conf - -# Set permissions -RUN chown -R nginx:nginx /usr/share/nginx/html && \ - chmod -R 755 /usr/share/nginx/html && \ - chown -R nginx:nginx /var/cache/nginx && \ - chown -R nginx:nginx /var/log/nginx && \ - chown -R nginx:nginx /etc/nginx/conf.d && \ - touch /var/run/nginx.pid && \ - chown -R nginx:nginx /var/run/nginx.pid - -USER nginx +# Create nginx configuration with custom port +RUN sed -i "s/80/${EXPORT_PORT}/g" /etc/nginx/conf.d/default.conf EXPOSE ${EXPORT_PORT} diff --git a/package.json b/package.json index 4df90f0..5f0ed5e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "ai-marketing-frontend", + "name": "smarketing-frontend", "version": "1.0.0", "private": true, "type": "module", @@ -21,6 +21,7 @@ "@vitejs/plugin-vue": "^5.0.0", "vite": "^5.0.0", "vite-plugin-vuetify": "^2.0.0", - "sass": "^1.69.0" + "sass": "^1.69.0", + "eslint": "^8.55.0" } } \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 1727156..fb2a622 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,30 +1,30 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' -import { fileURLToPath, URL } from 'node:url' +import vuetify from 'vite-plugin-vuetify' export default defineConfig({ - plugins: [vue()], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - }, + plugins: [ + vue(), + vuetify({ + autoImport: true, + }) + ], + build: { + outDir: 'dist', + sourcemap: false, + minify: 'terser' }, server: { port: 3000, - host: true, - open: true, + host: true }, - build: { - outDir: 'dist', - sourcemap: true, - rollupOptions: { - output: { - manualChunks: { - vendor: ['vue', 'vue-router', 'pinia'], - vuetify: ['vuetify'], - icons: ['@mdi/font'], - }, - }, - }, - }, -}) + define: { + 'process.env.VUE_APP_AUTH_URL': JSON.stringify(process.env.VUE_APP_AUTH_URL), + 'process.env.VUE_APP_MEMBER_URL': JSON.stringify(process.env.VUE_APP_MEMBER_URL), + 'process.env.VUE_APP_STORE_URL': JSON.stringify(process.env.VUE_APP_STORE_URL), + 'process.env.VUE_APP_MENU_URL': JSON.stringify(process.env.VUE_APP_MENU_URL), + 'process.env.VUE_APP_SALES_URL': JSON.stringify(process.env.VUE_APP_SALES_URL), + 'process.env.VUE_APP_CONTENT_URL': JSON.stringify(process.env.VUE_APP_CONTENT_URL), + 'process.env.VUE_APP_RECOMMEND_URL': JSON.stringify(process.env.VUE_APP_RECOMMEND_URL) + } +}) \ No newline at end of file