Procházet zdrojové kódy

build: 添加 Docker 相关配置文件

- 新增 .dockerignore 文件忽略不必要的文件
- 添加 Dockerfile 用于多阶段构建前端应用
- 配置 nginx.conf 优化静态资源处理和路由
piks před 2 dny
rodič
revize
cf68c906a3
3 změnil soubory, kde provedl 93 přidání a 0 odebrání
  1. 16 0
      .dockerignore
  2. 32 0
      Dockerfile
  3. 45 0
      nginx.conf

+ 16 - 0
.dockerignore

@@ -0,0 +1,16 @@
+node_modules
+dist
+.git
+.gitignore
+.husky
+.vscode
+.opencode
+.agents
+.codex
+.kiro
+.trae
+docs
+weekworkdos
+*.md
+.env.*
+!.env.production

+ 32 - 0
Dockerfile

@@ -0,0 +1,32 @@
+# ---- Stage 1: Build ----
+FROM node:20-alpine AS build
+
+# 启用 pnpm
+RUN corepack enable
+
+WORKDIR /app
+
+# 先复制依赖文件,利用 Docker 层缓存
+COPY package.json pnpm-lock.yaml ./
+
+# 安装依赖
+RUN pnpm install --frozen-lockfile
+
+# 复制项目源码
+COPY . .
+
+# 构建
+RUN pnpm build
+
+# ---- Stage 2: Serve ----
+FROM nginx:alpine
+
+# 复制 nginx 配置
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+
+# 复制构建产物
+COPY --from=build /app/dist /usr/share/nginx/html
+
+EXPOSE 80
+
+CMD ["nginx", "-g", "daemon off;"]

+ 45 - 0
nginx.conf

@@ -0,0 +1,45 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    charset utf-8;
+
+    # 静态资源根目录
+    root   /usr/share/nginx/html;
+    index  index.html;
+
+    # gzip 压缩
+    gzip on;
+    gzip_min_length  1k;
+    gzip_comp_level  6;
+    gzip_types       text/plain text/css application/json application/javascript
+                     text/xml application/xml application/xml+rss text/javascript
+                     image/svg+xml;
+    gzip_vary on;
+    gzip_disable     "MSIE [1-6]\.";
+
+    # 静态资源缓存(Vite 构建产物带 hash,可长期缓存)
+    location /assets/ {
+        expires 1y;
+        add_header Cache-Control "public, immutable";
+    }
+
+    # 后端 API 代理(目前未接入,先预留)
+    location /prod-api/ {
+        proxy_pass http://backend:8080/;
+        proxy_set_header Host              $host;
+        proxy_set_header X-Real-IP         $remote_addr;
+        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+    }
+
+    # Vue Router history 模式 — 所有未匹配路径回退到 index.html
+    location / {
+        try_files $uri $uri/ /index.html;
+    }
+
+    # 禁止访问隐藏文件
+    location ~ /\. {
+        deny all;
+    }
+}