🚀 Ledger 部署指南
本文档提供 Ledger 账本服务的完整部署指南,涵盖开发、测试和生产环境的部署方案。
🎯 部署架构
系统要求
| 组件 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 1 核心 | 2+ 核心 | 支持并发处理 |
| 内存 | 512MB | 1GB+ | 包含数据库连接池 |
| 存储 | 1GB | 10GB+ | 日志和数据存储 |
| 数据库 | MySQL 5.7+ | MySQL 8.0+ | 生产环境推荐 |
部署架构图
🐳 Docker 部署
单机部署
1. 构建镜像
bash
# 克隆项目
git clone https://github.com/FixIterate/lz-stash.git
cd lz-stash
# 构建 Docker 镜像
docker build -t lzt:latest .2. 准备配置文件
yaml
# config.yaml
server:
port: 8080
host: "0.0.0.0"
database:
driver: mysql
host: mysql
port: 3306
name: ledger_db
user: ledger_user
password: "your_password"
max_connections: 10
max_idle_connections: 5
logging:
level: info
format: json3. Docker Compose 部署
yaml
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: ledger_db
MYSQL_USER: ledger_user
MYSQL_PASSWORD: userpassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 5s
retries: 10
ledger:
image: lzt:latest
depends_on:
mysql:
condition: service_healthy
ports:
- "8080:8080"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=ledger_user
- DB_PASSWORD=userpassword
- DB_NAME=ledger_db
volumes:
- ./config.yaml:/app/config.yaml
command: ["./lzt", "ledger", "server", "--config", "/app/config.yaml"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
volumes:
mysql_data:4. 启动服务
bash
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f ledger
# 检查服务状态
docker-compose ps☸️ Kubernetes 部署
生产环境部署
1. 配置文件 (ConfigMap)
yaml
# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ledger-config
namespace: default
data:
config.yaml: |
server:
port: 8080
host: "0.0.0.0"
database:
driver: mysql
host: mysql-service
port: 3306
name: ledger_db
user: ledger_user
max_connections: 20
max_idle_connections: 10
logging:
level: info
format: json2. 密钥管理 (Secret)
yaml
# k8s/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ledger-secret
namespace: default
type: Opaque
data:
db-password: <base64-encoded-password>
db-root-password: <base64-encoded-root-password>3. 服务部署 (Deployment)
yaml
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ledger-service
namespace: default
labels:
app: ledger
spec:
replicas: 3
selector:
matchLabels:
app: ledger
template:
metadata:
labels:
app: ledger
spec:
containers:
- name: ledger
image: lzt:latest
ports:
- containerPort: 8080
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: ledger-secret
key: db-password
volumeMounts:
- name: config-volume
mountPath: /app/config.yaml
subPath: config.yaml
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
volumes:
- name: config-volume
configMap:
name: ledger-config4. 服务暴露 (Service)
yaml
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: ledger-service
namespace: default
spec:
selector:
app: ledger
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP5. 入口控制器 (Ingress)
yaml
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ledger-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- api.yourcompany.com
secretName: ledger-tls
rules:
- host: api.yourcompany.com
http:
paths:
- path: /api/v1/ledger
pathType: Prefix
backend:
service:
name: ledger-service
port:
number: 80部署命令
bash
# 创建命名空间
kubectl create namespace ledger
# 应用配置
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/ingress.yaml
# 检查部署状态
kubectl get pods -l app=ledger
kubectl get services
kubectl get ingress🔧 环境配置
开发环境
yaml
# config/development.yaml
server:
port: 8080
debug: true
database:
driver: sqlite
name: "ledger_dev.db"
logging:
level: debug
format: text测试环境
yaml
# config/testing.yaml
server:
port: 8080
database:
driver: mysql
host: test-mysql
port: 3306
name: ledger_test
user: test_user
password: "test_password"
logging:
level: info
format: json生产环境
yaml
# config/production.yaml
server:
port: 8080
read_timeout: 30s
write_timeout: 30s
database:
driver: mysql
host: prod-mysql-cluster
port: 3306
name: ledger_prod
user: prod_user
# password 通过环境变量提供
max_connections: 50
max_idle_connections: 25
connection_max_lifetime: 300s
logging:
level: warn
format: json
metrics:
enabled: true
port: 9090📊 监控和健康检查
健康检查端点
go
// 服务健康检查
GET /health
{
"status": "healthy",
"timestamp": "2024-01-15T10:30:00Z",
"version": "v1.0.0",
"database": "connected",
"uptime": "2h15m30s"
}
// 就绪性检查
GET /ready
{
"ready": true,
"checks": {
"database": "pass",
"migrations": "pass"
}
}Prometheus 监控
yaml
# 在 Kubernetes 中启用 ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: ledger-monitor
spec:
selector:
matchLabels:
app: ledger
endpoints:
- port: metrics
interval: 30s
path: /metrics🔄 CI/CD 集成
GitHub Actions 部署
yaml
# .github/workflows/deploy.yml
name: Deploy to Production
on:
push:
tags:
- 'v*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and push Docker image
run: |
docker build -t ghcr.io/FixIterate/lzt:${{ github.ref_name }} .
docker push ghcr.io/FixIterate/lzt:${{ github.ref_name }}
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/ledger-service \
ledger=ghcr.io/FixIterate/lzt:${{ github.ref_name }}
kubectl rollout status deployment/ledger-service🚨 故障排除
常见问题
1. 数据库连接失败
bash
# 检查数据库连接
kubectl exec -it ledger-pod -- ./lzt ledger init --dry-run
# 查看数据库日志
kubectl logs mysql-pod2. 服务启动失败
bash
# 查看服务日志
kubectl logs -l app=ledger
# 检查配置文件
kubectl describe configmap ledger-config3. 性能问题
bash
# 查看资源使用情况
kubectl top pods -l app=ledger
# 查看服务指标
curl http://localhost:9090/metrics日志分析
bash
# 查看错误日志
kubectl logs -l app=ledger | grep ERROR
# 实时查看日志
kubectl logs -f -l app=ledger📚 相关文档
💡 部署建议: 生产环境部署前,建议先在测试环境验证所有配置和流程,确保系统的稳定性和可靠性。