修复部署 2
This commit is contained in:
@@ -0,0 +1,11 @@
|
|||||||
|
.git
|
||||||
|
.env
|
||||||
|
backend/tmp
|
||||||
|
backend/data
|
||||||
|
backend/logs
|
||||||
|
frontend/node_modules
|
||||||
|
frontend/dist
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
coverage
|
||||||
|
*.log
|
||||||
+6
-6
@@ -1,15 +1,15 @@
|
|||||||
PORT=8080
|
PORT=8080
|
||||||
JWT_SECRET=your_very_secure_jwt_secret_here_change_me_in_production
|
JWT_SECRET=your_very_secure_jwt_secret_here_change_me_in_production
|
||||||
DB_PATH=data/app.db
|
DB_PATH=data/app.db
|
||||||
MODE=release
|
GIN_MODE=release
|
||||||
OPEN_API_KEY=sk_source_dev_key_change_me
|
OPEN_API_KEY=sk_source_dev_key_change_me
|
||||||
OPEN_API_SECRET=sk_source_dev_secret_change_me
|
OPEN_API_SECRET=sk_source_dev_secret_change_me
|
||||||
OPEN_SIGN_SKEW=300
|
OPEN_SIGN_SKEW=300
|
||||||
OPEN_API_DEBUG=false
|
OPEN_API_DEBUG=false
|
||||||
LOG_FILE=logs/app.log
|
LOG_FILE=logs/app.log
|
||||||
# Caddy 镜像配置:make docker-up 会先拉取来源镜像并标记成本地运行镜像
|
|
||||||
CADDY_RUNTIME_IMAGE=affiliate-caddy:2
|
|
||||||
CADDY_SOURCE_IMAGE=caddy:2
|
|
||||||
CADDY_FALLBACK_IMAGES=docker.m.daocloud.io/library/caddy:2 registry.cn-hangzhou.aliyuncs.com/caddy/caddy:2
|
|
||||||
|
|
||||||
# Caddy 生产环境无需前端运行时环境变量,前端会构建为静态文件
|
# Docker 构建基础镜像;如镜像源不可用,可改为官方镜像或你的私有镜像源
|
||||||
|
GO_BUILDER_IMAGE=docker.m.daocloud.io/library/golang:1.26-alpine
|
||||||
|
BACKEND_RUNTIME_IMAGE=docker.m.daocloud.io/library/alpine:3.22
|
||||||
|
NODE_BUILDER_IMAGE=docker.m.daocloud.io/library/node:22-alpine
|
||||||
|
CADDY_BASE_IMAGE=docker.m.daocloud.io/library/caddy:2-alpine
|
||||||
|
|||||||
+5
-2
@@ -1,4 +1,7 @@
|
|||||||
FROM golang:1.26-alpine AS builder
|
ARG GO_BUILDER_IMAGE=docker.m.daocloud.io/library/golang:1.26-alpine
|
||||||
|
ARG BACKEND_RUNTIME_IMAGE=docker.m.daocloud.io/library/alpine:3.22
|
||||||
|
|
||||||
|
FROM ${GO_BUILDER_IMAGE} AS builder
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
@@ -13,7 +16,7 @@ WORKDIR /app/backend
|
|||||||
RUN CGO_ENABLED=0 GOOS=linux go build -o /server ./cmd/server
|
RUN CGO_ENABLED=0 GOOS=linux go build -o /server ./cmd/server
|
||||||
|
|
||||||
# 最终运行镜像 / Runtime image
|
# 最终运行镜像 / Runtime image
|
||||||
FROM alpine:latest
|
FROM ${BACKEND_RUNTIME_IMAGE}
|
||||||
|
|
||||||
RUN apk --no-cache add ca-certificates tzdata curl
|
RUN apk --no-cache add ca-certificates tzdata curl
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
ARG NODE_BUILDER_IMAGE=docker.m.daocloud.io/library/node:22-alpine
|
||||||
|
ARG CADDY_BASE_IMAGE=docker.m.daocloud.io/library/caddy:2-alpine
|
||||||
|
|
||||||
|
FROM ${NODE_BUILDER_IMAGE} AS frontend-builder
|
||||||
|
|
||||||
|
WORKDIR /app/frontend
|
||||||
|
|
||||||
|
# 先安装依赖,利用 Docker 层缓存 / Install dependencies first for Docker cache
|
||||||
|
COPY frontend/package.json frontend/package-lock.json ./
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
COPY frontend ./
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM ${CADDY_BASE_IMAGE}
|
||||||
|
|
||||||
|
COPY Caddyfile /etc/caddy/Caddyfile
|
||||||
|
COPY --from=frontend-builder /app/frontend/dist /usr/share/caddy
|
||||||
|
|
||||||
|
EXPOSE 80 443
|
||||||
|
|
||||||
|
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
.PHONY: start dev backend frontend install stop frontend-build docker-pull-caddy docker-build docker-up docker-down docker-logs
|
.PHONY: start dev backend frontend install stop docker-build docker-up docker-down docker-logs docker-ps docker-config
|
||||||
|
|
||||||
ifneq (,$(wildcard .env))
|
ifneq (,$(wildcard .env))
|
||||||
include .env
|
include .env
|
||||||
export
|
export
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CADDY_RUNTIME_IMAGE ?= affiliate-caddy:2
|
|
||||||
CADDY_SOURCE_IMAGE ?= caddy:2
|
|
||||||
CADDY_FALLBACK_IMAGES ?= docker.m.daocloud.io/library/caddy:2 registry.cn-hangzhou.aliyuncs.com/caddy/caddy:2
|
|
||||||
|
|
||||||
# 一键启动前后端(推荐)
|
# 一键启动前后端(推荐)
|
||||||
start dev:
|
start dev:
|
||||||
@bash ./start.sh
|
@bash ./start.sh
|
||||||
@@ -29,31 +25,12 @@ stop:
|
|||||||
@-lsof -tiTCP:5173 -sTCP:LISTEN | xargs kill 2>/dev/null || true
|
@-lsof -tiTCP:5173 -sTCP:LISTEN | xargs kill 2>/dev/null || true
|
||||||
@echo "已尝试停止 8080 / 5173 端口服务"
|
@echo "已尝试停止 8080 / 5173 端口服务"
|
||||||
|
|
||||||
# Docker 部署相关命令
|
# Docker 部署:宿主机只需要 Docker/Compose,前端与后端都在镜像内构建
|
||||||
frontend-build:
|
docker-build:
|
||||||
@echo "构建前端静态文件..."
|
@echo "构建 Docker 镜像..."
|
||||||
cd frontend && npm ci && npm run build
|
docker compose build
|
||||||
|
|
||||||
docker-pull-caddy:
|
docker-up:
|
||||||
@set -e; \
|
|
||||||
echo "准备 Caddy 运行镜像: $(CADDY_RUNTIME_IMAGE)"; \
|
|
||||||
for image in $(CADDY_SOURCE_IMAGE) $(CADDY_FALLBACK_IMAGES); do \
|
|
||||||
echo "尝试拉取 Caddy 镜像: $$image"; \
|
|
||||||
if docker pull "$$image"; then \
|
|
||||||
docker tag "$$image" "$(CADDY_RUNTIME_IMAGE)"; \
|
|
||||||
echo "已将 $$image 标记为 $(CADDY_RUNTIME_IMAGE)"; \
|
|
||||||
exit 0; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
echo "错误: Caddy 镜像拉取失败,可在 .env 中设置 CADDY_SOURCE_IMAGE 或 CADDY_FALLBACK_IMAGES"; \
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
docker-build: frontend-build docker-pull-caddy
|
|
||||||
@echo "构建后端 Docker 镜像..."
|
|
||||||
docker build -f Dockerfile.backend -t affiliate-backend:latest .
|
|
||||||
@echo "构建完成,可执行: docker compose up -d --build"
|
|
||||||
|
|
||||||
docker-up: frontend-build docker-pull-caddy
|
|
||||||
@echo "启动 Docker Compose 服务..."
|
@echo "启动 Docker Compose 服务..."
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
|
|
||||||
@@ -64,3 +41,9 @@ docker-down:
|
|||||||
docker-logs:
|
docker-logs:
|
||||||
@echo "查看 backend 和 caddy 日志..."
|
@echo "查看 backend 和 caddy 日志..."
|
||||||
docker compose logs -f backend caddy
|
docker compose logs -f backend caddy
|
||||||
|
|
||||||
|
docker-ps:
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
docker-config:
|
||||||
|
docker compose config
|
||||||
|
|||||||
+12
-6
@@ -3,13 +3,17 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile.backend
|
dockerfile: Dockerfile.backend
|
||||||
|
args:
|
||||||
|
GO_BUILDER_IMAGE: ${GO_BUILDER_IMAGE:-docker.m.daocloud.io/library/golang:1.26-alpine}
|
||||||
|
BACKEND_RUNTIME_IMAGE: ${BACKEND_RUNTIME_IMAGE:-docker.m.daocloud.io/library/alpine:3.22}
|
||||||
|
image: affiliate-backend:latest
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
environment:
|
environment:
|
||||||
- PORT=8080
|
- PORT=8080
|
||||||
- JWT_SECRET=${JWT_SECRET}
|
- JWT_SECRET=${JWT_SECRET}
|
||||||
- DB_PATH=/data/app.db
|
- DB_PATH=/data/app.db
|
||||||
- MODE=release
|
- GIN_MODE=${GIN_MODE:-release}
|
||||||
- OPEN_API_KEY=${OPEN_API_KEY}
|
- OPEN_API_KEY=${OPEN_API_KEY}
|
||||||
- OPEN_API_SECRET=${OPEN_API_SECRET}
|
- OPEN_API_SECRET=${OPEN_API_SECRET}
|
||||||
- OPEN_SIGN_SKEW=${OPEN_SIGN_SKEW:-300}
|
- OPEN_SIGN_SKEW=${OPEN_SIGN_SKEW:-300}
|
||||||
@@ -25,17 +29,19 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
|
|
||||||
caddy:
|
caddy:
|
||||||
image: ${CADDY_RUNTIME_IMAGE:-affiliate-caddy:2}
|
build:
|
||||||
pull_policy: never
|
context: .
|
||||||
|
dockerfile: Dockerfile.caddy
|
||||||
|
args:
|
||||||
|
NODE_BUILDER_IMAGE: ${NODE_BUILDER_IMAGE:-docker.m.daocloud.io/library/node:22-alpine}
|
||||||
|
CADDY_BASE_IMAGE: ${CADDY_BASE_IMAGE:-docker.m.daocloud.io/library/caddy:2-alpine}
|
||||||
|
image: affiliate-caddy:latest
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
volumes:
|
volumes:
|
||||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
|
||||||
- ./frontend/dist:/usr/share/caddy
|
|
||||||
- caddy-data:/data
|
- caddy-data:/data
|
||||||
- caddy-config:/config
|
- caddy-config:/config
|
||||||
command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
|
|
||||||
depends_on:
|
depends_on:
|
||||||
backend:
|
backend:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
Reference in New Issue
Block a user