From 88f72e767f02bc43a77bbf6306a6292199169ea9 Mon Sep 17 00:00:00 2001 From: copecone Date: Tue, 17 Mar 2026 13:40:28 +0900 Subject: [PATCH] Add Docker Build Script --- .dockerignore | 8 ++++++ .gitignore | 2 ++ Dockerfile | 26 +++++++++++++++++++ angular.json | 6 ++++- build.ps1 | 21 +++++++++++++++ src/app/app.ts | 2 +- .../header-menu/header-menu.html | 0 .../header-menu/header-menu.scss | 0 .../header-menu/header-menu.ts | 0 src/app/{ui => features}/settings/popup.html | 0 src/app/{ui => features}/settings/popup.scss | 0 src/app/features/settings/settings.ts | 9 +++++++ src/app/ui/settings/settings.ts | 12 --------- src/server.ts | 8 +++--- 14 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 build.ps1 rename src/app/{ui => features}/header-menu/header-menu.html (100%) rename src/app/{ui => features}/header-menu/header-menu.scss (100%) rename src/app/{ui => features}/header-menu/header-menu.ts (100%) rename src/app/{ui => features}/settings/popup.html (100%) rename src/app/{ui => features}/settings/popup.scss (100%) create mode 100644 src/app/features/settings/settings.ts delete mode 100644 src/app/ui/settings/settings.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a3206a5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +dist +.git +.idea +.vscode +.angular +README.md +package-lock.json diff --git a/.gitignore b/.gitignore index 854acd5..4fcee55 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ __screenshots__/ # System files .DS_Store Thumbs.db + +*.tar diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4e0d414 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# 1. Build Stage +FROM node:24-alpine AS build + +WORKDIR /app + +# 의존성 파일 복사 및 설치 +COPY package*.json ./ +RUN npm install + +# 소스 코드 복사 및 빌드 +COPY . . +RUN npm run build + +# 2. Production Stage +FROM node:24-alpine AS runner + +WORKDIR /app + +# 빌드 스테이지에서 생성된 dist 폴더만 복사 +COPY --from=build /app/dist /app/dist + +# 포트 설정 (Angular SSR 기본 포트: 4000) +EXPOSE 4000 + +# 서버 실행 (package.json의 serve:ssr:aef-component-test 참고) +CMD ["node", "dist/aef-component-test/server/server.mjs"] diff --git a/angular.json b/angular.json index 9100e13..804b7d0 100644 --- a/angular.json +++ b/angular.json @@ -37,7 +37,11 @@ "server": "src/main.server.ts", "outputMode": "server", "security": { - "allowedHosts": [] + "allowedHosts": [ + "aef.kr", + "*.aef.kr", + "yunizun.org" + ] }, "ssr": { "entry": "src/server.ts" diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..ab5f743 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,21 @@ +# AefComponentTest Docker 이미지 빌드 및 추출 스크립트 + +$IMAGE_NAME = "aef-component-test" +$TAG = "0.0.1" +$OUTPUT_FILE = "aef-component-test.tar" + +Write-Host "--- Docker 이미지 빌드 시작: ${IMAGE_NAME}:${TAG} ---" -ForegroundColor Cyan +docker build -t "$($IMAGE_NAME):$TAG" . + +if ($LASTEXITCODE -eq 0) { + Write-Host "--- 이미지 추출 시작: $OUTPUT_FILE ---" -ForegroundColor Cyan + docker save -o $OUTPUT_FILE "$($IMAGE_NAME):$TAG" + + if ($LASTEXITCODE -eq 0) { + Write-Host "성공! $OUTPUT_FILE 파일이 생성되었습니다." -ForegroundColor Green + } else { + Write-Host "이미지 추출 중 오류가 발생했습니다." -ForegroundColor Red + } +} else { + Write-Host "빌드 중 오류가 발생했습니다." -ForegroundColor Red +} diff --git a/src/app/app.ts b/src/app/app.ts index 61bc9ab..8623dbe 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -2,7 +2,7 @@ import { Component, signal } from '@angular/core'; import { RouterOutlet } from '@angular/router'; import { Switch } from './components/switch/switch'; import { Dropdown, DropdownOption } from './components/dropdown/dropdown'; -import { HeaderMenu } from './ui/header-menu/header-menu'; +import { HeaderMenu } from './features/header-menu/header-menu'; @Component({ selector: 'app-root', diff --git a/src/app/ui/header-menu/header-menu.html b/src/app/features/header-menu/header-menu.html similarity index 100% rename from src/app/ui/header-menu/header-menu.html rename to src/app/features/header-menu/header-menu.html diff --git a/src/app/ui/header-menu/header-menu.scss b/src/app/features/header-menu/header-menu.scss similarity index 100% rename from src/app/ui/header-menu/header-menu.scss rename to src/app/features/header-menu/header-menu.scss diff --git a/src/app/ui/header-menu/header-menu.ts b/src/app/features/header-menu/header-menu.ts similarity index 100% rename from src/app/ui/header-menu/header-menu.ts rename to src/app/features/header-menu/header-menu.ts diff --git a/src/app/ui/settings/popup.html b/src/app/features/settings/popup.html similarity index 100% rename from src/app/ui/settings/popup.html rename to src/app/features/settings/popup.html diff --git a/src/app/ui/settings/popup.scss b/src/app/features/settings/popup.scss similarity index 100% rename from src/app/ui/settings/popup.scss rename to src/app/features/settings/popup.scss diff --git a/src/app/features/settings/settings.ts b/src/app/features/settings/settings.ts new file mode 100644 index 0000000..73ccdaa --- /dev/null +++ b/src/app/features/settings/settings.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'settings-popup', + imports: [], + templateUrl: './popup.html', + styleUrl: './popup.scss', +}) +export class SettingsPopup {} diff --git a/src/app/ui/settings/settings.ts b/src/app/ui/settings/settings.ts deleted file mode 100644 index 71e5b8c..0000000 --- a/src/app/ui/settings/settings.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, input, model, output } from '@angular/core'; -import { Dropdown } from '../../components/dropdown/dropdown'; -import { Switch } from '../../components/switch/switch'; -import { PopupComponent } from '../../components/popup/popup'; - -@Component({ - selector: 'settings-popup', - imports: [PopupComponent, Dropdown, Switch], - templateUrl: './popup.html', - styleUrl: './popup.scss', -}) -export class SettingsPopup {} diff --git a/src/server.ts b/src/server.ts index d5c9240..41bd857 100644 --- a/src/server.ts +++ b/src/server.ts @@ -50,13 +50,15 @@ app.use((req, res, next) => { * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. */ if (isMainModule(import.meta.url) || process.env['pm_id']) { - const port = process.env['PORT'] || 4000; - app.listen(port, (error) => { + const port = parseInt(process.env['PORT'] || '4000'); + const host = '0.0.0.0'; + + app.listen(port, host, (error) => { if (error) { throw error; } - console.log(`Node Express server listening on http://localhost:${port}`); + console.log(`Node Express server listening...`); }); }