添加Docker部署配置:backend Dockerfile、Caddyfile、docker-compose.yml,支持腾云云服务器部署域名skin.khhao.com,使用Caddy反向代理 + HTTPS
This commit is contained in:
+4
-21
@@ -1,27 +1,10 @@
|
|||||||
# ========== 后端(Go)==========
|
|
||||||
# 服务端口
|
|
||||||
PORT=8080
|
PORT=8080
|
||||||
# Gin 模式:debug / release
|
JWT_SECRET=your_very_secure_jwt_secret_here_change_me_in_production
|
||||||
GIN_MODE=debug
|
|
||||||
# SQLite 数据库路径(相对 backend 工作目录,或写绝对路径)
|
|
||||||
DB_PATH=data/app.db
|
DB_PATH=data/app.db
|
||||||
# JWT 密钥(生产务必更换)
|
MODE=release
|
||||||
JWT_SECRET=affiliate-dash-dev-secret-change-me
|
|
||||||
|
|
||||||
# 皮肤源头开放接口鉴权
|
|
||||||
# X-Api-Key 标识(可给对接方)
|
|
||||||
OPEN_API_KEY=sk_source_dev_key_change_me
|
OPEN_API_KEY=sk_source_dev_key_change_me
|
||||||
# HMAC 签名密钥(仅服务端与对接方本地使用,不要放前端)
|
|
||||||
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
|
||||||
# 开放接口详细调试日志:1 开启 / 0 关闭(默认 GIN_MODE=debug 时开启)
|
OPEN_API_DEBUG=false
|
||||||
OPEN_API_DEBUG=1
|
|
||||||
# 日志文件(相对 backend 工作目录);非空则控制台 + 文件双写,留空则仅控制台
|
|
||||||
LOG_FILE=logs/app.log
|
LOG_FILE=logs/app.log
|
||||||
|
# For Caddy production, no need for frontend env since built static
|
||||||
# ========== 前端(Vite / 一键启动)==========
|
|
||||||
# 前端开发端口
|
|
||||||
FRONTEND_PORT=5173
|
|
||||||
# 开发代理到后端地址(可选,默认 http://localhost:8080)
|
|
||||||
VITE_API_PROXY_TARGET=http://localhost:8080
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
# admin off # disable admin if wanted
|
||||||
|
}
|
||||||
|
|
||||||
|
skin.khhao.com {
|
||||||
|
# Reverse proxy all /api* requests to the backend service
|
||||||
|
reverse_proxy /api* backend:8080
|
||||||
|
|
||||||
|
# Serve static files for the frontend (SPA)
|
||||||
|
file_server / {
|
||||||
|
root * /usr/share/caddy
|
||||||
|
try_files {path} {path}/index.html
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
FROM golang:1.26-alpine AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy Go files
|
||||||
|
COPY backend/go.mod backend/go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
COPY backend ./backend
|
||||||
|
WORKDIR /app/backend
|
||||||
|
|
||||||
|
# Build the Go binary
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -o /server ./cmd/server
|
||||||
|
|
||||||
|
# Final stage
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
RUN apk --no-cache add ca-certificates tzdata
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --from=builder /server ./server
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Run the server
|
||||||
|
CMD ["./server"]
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
.PHONY: start dev backend frontend install stop
|
.PHONY: start dev backend frontend install stop docker-build docker-up docker-down
|
||||||
|
|
||||||
# 一键启动前后端(推荐)
|
# 一键启动前后端(推荐)
|
||||||
start dev:
|
start dev:
|
||||||
@@ -19,3 +19,22 @@ stop:
|
|||||||
@-lsof -tiTCP:8080 -sTCP:LISTEN | xargs kill 2>/dev/null || true
|
@-lsof -tiTCP:8080 -sTCP:LISTEN | xargs kill 2>/dev/null || true
|
||||||
@-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-build:
|
||||||
|
@echo "Building backend Docker image..."
|
||||||
|
docker build -f Dockerfile.backend -t affiliate-backend:latest .
|
||||||
|
@echo "Frontend must be built separately: cd frontend && npm run build"
|
||||||
|
@echo "Then run: docker compose up -d --build"
|
||||||
|
|
||||||
|
docker-up:
|
||||||
|
@echo "Starting services with docker-compose..."
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
docker-down:
|
||||||
|
@echo "Stopping and removing containers..."
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
docker-logs:
|
||||||
|
@echo "Showing backend and caddy logs..."
|
||||||
|
docker compose logs -f backend caddy
|
||||||
@@ -27,7 +27,7 @@ func Setup(h *Handlers) *gin.Engine {
|
|||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
|
||||||
r.Use(cors.New(cors.Config{
|
r.Use(cors.New(cors.Config{
|
||||||
AllowOrigins: []string{"http://localhost:5173", "http://127.0.0.1:5173"},
|
AllowOrigins: []string{"*"},
|
||||||
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
|
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
|
||||||
AllowHeaders: []string{"Origin", "Content-Type", "Authorization", "X-Api-Key", "X-Timestamp", "X-Nonce", "X-Sign"},
|
AllowHeaders: []string{"Origin", "Content-Type", "Authorization", "X-Api-Key", "X-Timestamp", "X-Nonce", "X-Sign"},
|
||||||
ExposeHeaders: []string{"Content-Length"},
|
ExposeHeaders: []string{"Content-Length"},
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.backend
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
environment:
|
||||||
|
- PORT=8080
|
||||||
|
- JWT_SECRET=${JWT_SECRET}
|
||||||
|
- DB_PATH=/data/app.db
|
||||||
|
- MODE=release
|
||||||
|
- OPEN_API_KEY=${OPEN_API_KEY}
|
||||||
|
- OPEN_API_SECRET=${OPEN_API_SECRET}
|
||||||
|
- OPEN_SIGN_SKEW=${OPEN_SIGN_SKEW:-300}
|
||||||
|
- OPEN_API_DEBUG=${OPEN_API_DEBUG:-false}
|
||||||
|
- LOG_FILE=/data/app.log
|
||||||
|
volumes:
|
||||||
|
- backend-data:/data
|
||||||
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
caddy:
|
||||||
|
image: caddy:2
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
- "443:443"
|
||||||
|
volumes:
|
||||||
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
- ./frontend/dist:/usr/share/caddy
|
||||||
|
command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
backend-data:
|
||||||
Reference in New Issue
Block a user