首次提交:初始化项目代码

This commit is contained in:
sunct
2026-07-31 15:24:14 +08:00
commit 8d3c97bd01
73 changed files with 11720 additions and 0 deletions
@@ -0,0 +1,20 @@
# 多阶段构建,减小最终镜像体积
FROM golang:1.22-alpine AS builder
WORKDIR /src
# 先复制 go.mod / go.sum 并下载依赖,利用 Docker 缓存
COPY go.mod go.sum* ./
RUN go mod download
COPY . .
# 静态二进制,方便在 alpine 中运行
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/auth-service ./cmd/auth-service
FROM alpine:3.19
RUN apk --no-cache add ca-certificates tzdata && adduser -D -u 10001 app
WORKDIR /app
COPY --from=builder /out/auth-service /app/auth-service
USER app
EXPOSE 8081
ENTRYPOINT ["/app/auth-service"]
@@ -0,0 +1,17 @@
FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY go.mod go.sum* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/file-service ./cmd/file-service
FROM alpine:3.19
RUN apk --no-cache add ca-certificates tzdata && adduser -D -u 10002 app
WORKDIR /app
COPY --from=builder /out/file-service /app/file-service
USER app
EXPOSE 8082
ENTRYPOINT ["/app/file-service"]
+11
View File
@@ -0,0 +1,11 @@
# 部署指南:在能访问外网的 Linux 服务器上执行
# 1) 替换 yourdomain.com / yourname / your-email@example.com
# 2) docker login && docker build -f deployments/docker/auth-service.Dockerfile -t yourname/auth-service:v1 .
# 3) docker build -f deployments/docker/file-service.Dockerfile -t yourname/file-service:v1 .
# 4) docker push yourname/auth-service:v1 && docker push yourname/file-service:v1
# 5) kubectl apply -f deployments/k8s/
---
apiVersion: v1
kind: Namespace
metadata:
name: cloudnest
+61
View File
@@ -0,0 +1,61 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-service
namespace: cloudnest
labels:
app: auth-service
spec:
replicas: 1
selector:
matchLabels:
app: auth-service
template:
metadata:
labels:
app: auth-service
spec:
containers:
- name: auth-service
# 替换 yourname 为你的 Docker Hub 用户名
# 若在服务器本地构建,把 imagePullPolicy 改为 Never
image: yourname/auth-service:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8081
name: http
env:
- name: AUTH_PORT
value: "8081"
- name: JWT_SECRET
value: "cloudnest-secret-key"
- name: MYSQL_DSN
value: "root:cloudnest123@tcp(mysql:3306)/cloudnest?charset=utf8mb4&parseTime=True&loc=Local"
- name: REDIS_ADDR
value: "redis:6379"
resources:
limits:
memory: "128Mi"
cpu: "300m"
requests:
memory: "64Mi"
cpu: "50m"
readinessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: auth-service
namespace: cloudnest
spec:
selector:
app: auth-service
ports:
- port: 8081
targetPort: 8081
name: http
+66
View File
@@ -0,0 +1,66 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: file-service
namespace: cloudnest
labels:
app: file-service
spec:
replicas: 1
selector:
matchLabels:
app: file-service
template:
metadata:
labels:
app: file-service
spec:
containers:
- name: file-service
# 替换 yourname 为你的 Docker Hub 用户名
image: yourname/file-service:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8082
name: http
env:
- name: FILE_PORT
value: "8082"
- name: JWT_SECRET
value: "cloudnest-secret-key"
- name: MINIO_ENDPOINT
value: "minio:9000"
- name: MINIO_ACCESS_KEY
value: "minioadmin"
- name: MINIO_SECRET_KEY
value: "minioadmin"
- name: MINIO_BUCKET
value: "cloudnest-files"
- name: MINIO_USE_SSL
value: "false"
resources:
limits:
memory: "128Mi"
cpu: "300m"
requests:
memory: "64Mi"
cpu: "50m"
readinessProbe:
httpGet:
path: /healthz
port: 8082
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: file-service
namespace: cloudnest
spec:
selector:
app: file-service
ports:
- port: 8082
targetPort: 8082
name: http
+56
View File
@@ -0,0 +1,56 @@
# CloudNest Ingress 路由 + Let's Encrypt 自动证书
# 1) 将所有 yourdomain.com 替换成你的真实域名
# 2) 提前按部署指南 5.5 启用 certResolver: letsencrypt
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: strip-prefix
namespace: cloudnest
spec:
stripPrefix:
prefixes:
- /auth
- /files
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: cloudnest-ingress
namespace: cloudnest
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.yourdomain.com`) && PathPrefix(`/auth`)
kind: Rule
middlewares:
- name: strip-prefix
services:
- name: auth-service
port: 8081
- match: Host(`api.yourdomain.com`) && PathPrefix(`/files`)
kind: Rule
middlewares:
- name: strip-prefix
services:
- name: file-service
port: 8082
tls:
certResolver: letsencrypt
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: minio-console
namespace: cloudnest
spec:
entryPoints:
- websecure
routes:
- match: Host(`minio.yourdomain.com`)
kind: Rule
services:
- name: minio
port: 9001
tls:
certResolver: letsencrypt
+72
View File
@@ -0,0 +1,72 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
namespace: cloudnest
labels:
app: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:latest
args:
- server
- /data
- --console-address
- ":9001"
env:
- name: MINIO_ROOT_USER
value: "minioadmin"
- name: MINIO_ROOT_PASSWORD
value: "minioadmin"
ports:
- containerPort: 9000
name: api
- containerPort: 9001
name: console
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "100m"
readinessProbe:
httpGet:
path: /minio/health/live
port: 9000
initialDelaySeconds: 10
periodSeconds: 10
volumeMounts:
- name: minio-data
mountPath: /data
volumes:
- name: minio-data
hostPath:
path: /data/minio
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: minio
namespace: cloudnest
spec:
selector:
app: minio
ports:
- name: api
port: 9000
targetPort: 9000
- name: console
port: 9001
targetPort: 9001
+66
View File
@@ -0,0 +1,66 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: cloudnest
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "cloudnest123"
- name: MYSQL_DATABASE
value: "cloudnest"
ports:
- containerPort: 3306
name: mysql
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "100m"
readinessProbe:
exec:
command: ["mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-pcloudnest123"]
initialDelaySeconds: 15
periodSeconds: 10
livenessProbe:
exec:
command: ["mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-pcloudnest123"]
initialDelaySeconds: 30
periodSeconds: 20
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
hostPath:
path: /data/mysql
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: cloudnest
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
name: mysql
+43
View File
@@ -0,0 +1,43 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: cloudnest
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
name: redis
resources:
limits:
memory: "64Mi"
cpu: "200m"
requests:
memory: "32Mi"
cpu: "50m"
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: cloudnest
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
name: redis