修复错误
This commit is contained in:
+6
-1
@@ -7,4 +7,9 @@ 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
|
||||||
# For Caddy production, no need for frontend env since built static
|
# 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 生产环境无需前端运行时环境变量,前端会构建为静态文件
|
||||||
|
|||||||
@@ -1,14 +1,20 @@
|
|||||||
{
|
{
|
||||||
# admin off # disable admin if wanted
|
# 如需关闭管理接口,可取消下一行注释 / Uncomment to disable admin API
|
||||||
|
# admin off
|
||||||
}
|
}
|
||||||
|
|
||||||
skin.khhao.com {
|
skin.khhao.com {
|
||||||
# Reverse proxy all /api* requests to the backend service
|
encode gzip zstd
|
||||||
reverse_proxy /api* backend:8080
|
|
||||||
|
|
||||||
# Serve static files for the frontend (SPA)
|
# API 请求反向代理到后端服务 / Proxy API requests to backend
|
||||||
file_server / {
|
handle /api* {
|
||||||
|
reverse_proxy backend:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
# 前端 SPA 静态文件 / Serve frontend SPA
|
||||||
|
handle {
|
||||||
root * /usr/share/caddy
|
root * /usr/share/caddy
|
||||||
try_files {path} {path}/index.html
|
try_files {path} {path}/ /index.html
|
||||||
|
file_server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-6
@@ -2,26 +2,26 @@ FROM golang:1.26-alpine AS builder
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy Go files
|
# 复制 Go 依赖文件 / Copy Go dependency files
|
||||||
COPY backend/go.mod backend/go.sum ./
|
COPY backend/go.mod backend/go.sum ./
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
||||||
COPY backend ./backend
|
COPY backend ./backend
|
||||||
WORKDIR /app/backend
|
WORKDIR /app/backend
|
||||||
|
|
||||||
# Build the Go binary
|
# 构建 Go 二进制文件 / Build Go binary
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -o /server ./cmd/server
|
RUN CGO_ENABLED=0 GOOS=linux go build -o /server ./cmd/server
|
||||||
|
|
||||||
# Final stage
|
# 最终运行镜像 / Runtime image
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
RUN apk --no-cache add ca-certificates tzdata
|
RUN apk --no-cache add ca-certificates tzdata curl
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY --from=builder /server ./server
|
COPY --from=builder /server ./server
|
||||||
# Expose port
|
# 暴露服务端口 / Expose service port
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
# Run the server
|
# 启动服务 / Run server
|
||||||
CMD ["./server"]
|
CMD ["./server"]
|
||||||
@@ -1,4 +1,13 @@
|
|||||||
.PHONY: start dev backend frontend install stop docker-build docker-up docker-down
|
.PHONY: start dev backend frontend install stop frontend-build docker-pull-caddy docker-build docker-up docker-down docker-logs
|
||||||
|
|
||||||
|
ifneq (,$(wildcard .env))
|
||||||
|
include .env
|
||||||
|
export
|
||||||
|
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:
|
||||||
@@ -20,21 +29,38 @@ 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 deployment targets
|
# Docker 部署相关命令
|
||||||
docker-build:
|
frontend-build:
|
||||||
@echo "Building backend Docker image..."
|
@echo "构建前端静态文件..."
|
||||||
docker build -f Dockerfile.backend -t affiliate-backend:latest .
|
cd frontend && npm ci && npm run build
|
||||||
@echo "Frontend must be built separately: cd frontend && npm run build"
|
|
||||||
@echo "Then run: docker compose up -d --build"
|
|
||||||
|
|
||||||
docker-up:
|
docker-pull-caddy:
|
||||||
@echo "Starting services with docker-compose (pulls Caddy image if needed)..."
|
@set -e; \
|
||||||
docker compose up -d
|
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 服务..."
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
docker-down:
|
docker-down:
|
||||||
@echo "Stopping and removing containers..."
|
@echo "停止并移除容器..."
|
||||||
docker compose down
|
docker compose down
|
||||||
|
|
||||||
docker-logs:
|
docker-logs:
|
||||||
@echo "Showing backend and caddy logs..."
|
@echo "查看 backend 和 caddy 日志..."
|
||||||
docker compose logs -f backend caddy
|
docker compose logs -f backend caddy
|
||||||
+9
-10
@@ -1,10 +1,3 @@
|
|||||||
# Docker Compose for affiliate_dash (skin.khhao.com)
|
|
||||||
# In China, Docker Hub pull often hits rate limits on mirrors (e.g. docker.xuanyuan.me).
|
|
||||||
# Fix: Run "docker pull caddy:2" first, or use a mirror like registry.cn-hangzhou.aliyuncs.com/caddy/caddy:2
|
|
||||||
# Recommended: manually pull first, then docker compose up -d (no --build for caddy)
|
|
||||||
|
|
||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
backend:
|
backend:
|
||||||
build:
|
build:
|
||||||
@@ -26,23 +19,29 @@ services:
|
|||||||
- backend-data:/data
|
- backend-data:/data
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
|
|
||||||
caddy:
|
caddy:
|
||||||
image: caddy:2
|
image: ${CADDY_RUNTIME_IMAGE:-affiliate-caddy:2}
|
||||||
|
pull_policy: never
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
volumes:
|
volumes:
|
||||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
- ./frontend/dist:/usr/share/caddy
|
- ./frontend/dist:/usr/share/caddy
|
||||||
|
- caddy-data:/data
|
||||||
|
- caddy-config:/config
|
||||||
command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
|
command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend
|
backend:
|
||||||
|
condition: service_healthy
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
backend-data:
|
backend-data:
|
||||||
|
caddy-data:
|
||||||
|
caddy-config:
|
||||||
|
|||||||
Reference in New Issue
Block a user