部署指南
本文档提供了 Go-ES 项目的完整部署指南,包括环境准备、应用构建、数据库和 Elasticsearch 设置以及服务启动流程。
环境要求
部署 Go-ES 项目需要以下软件环境:
- Go 1.21 或更高版本
- MySQL 5.7 或更高版本
- Elasticsearch 8.x
- Docker 和 Docker Compose(可选,用于容器化部署)
部署前准备
1. 安装 Go 环境
访问 Go 官方网站 下载并安装适合您操作系统的 Go 版本。
安装完成后,验证安装:
go version
2. 安装 MySQL
可以通过以下方式安装 MySQL:
- 在 Linux 上使用包管理器安装
- 在 Windows 或 macOS 上使用官方安装程序
- 使用 Docker 运行 MySQL 容器
启动 MySQL 服务后,创建数据库:
CREATE DATABASE go_es CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 安装 Elasticsearch
本项目提供了一个便捷的脚本 es.sh
用于使用 Docker 快速部署 Elasticsearch 和 Kibana:
# 赋予脚本执行权限
chmod +x es.sh
# 运行脚本
./es.sh
该脚本会:
- 检查 Docker 和 Docker Compose 是否已安装
- 创建必要的目录结构
- 生成 Docker Compose 配置文件
- 启动 Elasticsearch 和 Kibana 容器
如果您希望手动安装 Elasticsearch,可以参考 Elasticsearch 官方文档。
应用部署
1. 获取源代码
从 Git 仓库克隆项目:
git clone https://github.com/saixiaoxi/go-es.git
cd go-es
2. 配置应用
复制示例配置文件并修改:
cp config.example.yaml config.yaml
编辑 config.yaml
文件,配置应用参数:
# 应用配置
app:
env: production # 设置环境为生产环境
port: 8080 # 应用端口
# 数据库配置
database:
host: localhost # 修改为您的数据库主机
port: 3306 # 数据库端口
user: root # 数据库用户名
password: your_password # 修改为您的数据库密码
name: go_es # 数据库名称
# Elasticsearch 配置
elasticsearch:
addresses: # 修改为您的 ES 地址
- http://localhost:9200
username: "" # 如果有认证,填写用户名
password: "" # 如果有认证,填写密码
index_prefix: go_es_ # 索引前缀
3. 构建应用
在项目根目录下构建应用:
# 下载依赖
go mod tidy
# 构建应用
go build -o bin/go-es cmd/api/main.go
4. 启动应用
# 直接运行
./bin/go-es
# 或者在开发环境直接使用 go run
go run cmd/api/main.go
应用启动后,将在配置的端口上运行,并自动连接数据库和 Elasticsearch:
- API 服务地址:
http://localhost:8080/api/v1
- Swagger 文档地址:
http://localhost:8080/swagger/index.html
容器化部署
为简化部署流程,我们提供了使用 Docker 和 Docker Compose 的完整部署方案。
创建 Dockerfile
在项目根目录创建 Dockerfile
:
# 构建阶段
FROM golang:1.21-alpine AS builder
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY go.mod go.sum ./
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o go-es cmd/api/main.go
# 运行阶段
FROM alpine:latest
# 安装 CA 证书
RUN apk --no-cache add ca-certificates
# 设置工作目录
WORKDIR /app
# 从构建阶段复制二进制文件
COPY --from=builder /app/go-es .
# 复制配置文件
COPY config.example.yaml config.yaml
# 暴露端口
EXPOSE 8080
# 运行应用
CMD ["./go-es"]
创建 Docker Compose 配置
创建 docker-compose.yml
文件,包含完整的应用栈:
version: '3'
services:
# MySQL 服务
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: go_es
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppassword"]
interval: 5s
timeout: 5s
retries: 5
# Elasticsearch 服务
elasticsearch:
image: elasticsearch:8.12.2
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.type=single-node"
- "ELASTIC_PASSWORD=elastic_password"
- "xpack.security.enabled=true"
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200"]
interval: 30s
timeout: 10s
retries: 5
# Kibana 服务
kibana:
image: kibana:8.12.2
environment:
- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
- "I18N_LOCALE=zh-CN"
ports:
- "5601:5601"
depends_on:
- elasticsearch
# 应用服务
app:
build: .
restart: always
ports:
- "8080:8080"
depends_on:
- mysql
- elasticsearch
environment:
- TZ=Asia/Shanghai
volumes:
- ./config.yaml:/app/config.yaml
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/api/v1/health"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql-data:
es-data:
启动容器化应用
使用 Docker Compose 启动整个应用栈:
# 构建并启动服务
docker-compose up -d
# 查看容器状态
docker-compose ps
# 查看应用日志
docker-compose logs -f app
生产环境部署建议
对于生产环境,我们建议以下部署实践:
1. 使用反向代理
在前端放置 Nginx 反向代理,提供以下功能:
- TLS 终止 (HTTPS)
- 负载均衡
- 静态资源服务
- 请求限流
Nginx 配置示例:
server {
listen 80;
server_name api.example.com;
# 重定向到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name api.example.com;
# SSL 配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 反向代理到应用
location /api/ {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Swagger 文档
location /swagger/ {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 数据库优化
对于生产环境 MySQL,建议:
- 启用连接池
- 优化 MySQL 配置参数
- 设置适当的缓存大小
- 配置定期备份策略
3. Elasticsearch 集群
对于生产环境 Elasticsearch,建议:
- 部署至少 3 节点的集群
- 使用专用主节点和数据节点
- 配置索引生命周期管理
- 配置安全认证和授权
4. 监控和日志
建立完善的监控和日志系统:
- 使用 Prometheus + Grafana 监控应用指标
- 使用 ELK 栈收集和分析日志
- 设置合适的告警阈值和通知渠道
故障排查
常见问题解决
-
应用无法连接数据库
- 检查数据库连接参数
- 确认数据库服务运行状态
- 检查防火墙或网络限制
-
应用无法连接 Elasticsearch
- 检查 Elasticsearch 地址和认证信息
- 确认 Elasticsearch 服务运行状态
- 检查 Elasticsearch 日志是否有错误
-
API 请求返回 500 错误
- 检查应用日志查找详细错误信息
- 验证请求参数是否正确
- 确保数据库和 Elasticsearch 可用
-
搜索结果不准确
- 检查索引映射和分析器配置
- 尝试重建索引(
POST /api/v1/products/reindex
) - 验证搜索查询参数