# TopFans 后端服务器部署指南 本指南适用于在全新的 Linux 服务器上从零开始部署 TopFans 后端项目。 ## 目录 - [系统要求](#系统要求) - [第一步:服务器基础环境配置](#第一步服务器基础环境配置) - [第二步:安装 Go 环境](#第二步安装-go-环境) - [第三步:安装 PostgreSQL 数据库](#第三步安装-postgresql-数据库) - [第四步:安装 Protobuf 编译器](#第四步安装-protobuf-编译器) - [第五步:部署后端代码](#第五步部署后端代码) - [第六步:配置环境变量](#第六步配置环境变量) - [第七步:编译并安装二进制文件](#第七步编译并安装二进制文件) - [第八步:配置进程守护(systemd)](#第八步配置进程守护systemd) - [第九步:启动与验证](#第九步启动与验证) - [更新部署](#更新部署) - [故障排查](#故障排查) - [性能优化建议](#性能优化建议) - [多机部署说明](#多机部署说明) --- ## 系统要求 ### 硬件要求 - **CPU**: 2 核及以上 - **内存**: 4 GB 及以上(推荐 8 GB) - **磁盘**: 20 GB 及以上可用空间 - **网络**: 稳定的互联网连接 ### 操作系统 - Ubuntu 20.04 LTS / 22.04 LTS(推荐) - CentOS 7 / 8 - Debian 10 / 11 ### 服务端口 | 服务 | 端口 | 协议 | |---|---|---| | Gateway(HTTP REST API)| 8080 | HTTP | | User Service | 20000 | Dubbo/Triple | | Gallery Service | 20001 | Dubbo/Triple | | Social Service | 20002 | Dubbo/Triple | | Asset Service | 20003 | Dubbo/Triple | | Activity Service | 20004 | Dubbo/Triple | | PostgreSQL | 5432 | TCP(仅内网访问) | --- ## 第一步:服务器基础环境配置 ``` ssh root@101.132.250.62 >n73qBnCja-,#VF+Wq ``` ### 1.1 更新系统包 ```bash # Ubuntu/Debian sudo apt update && sudo apt upgrade -y # CentOS/RHEL sudo yum update -y ``` ### 1.2 安装基础工具 ```bash # Ubuntu/Debian sudo apt install -y git curl wget vim build-essential unzip # CentOS/RHEL sudo yum install -y git curl wget vim gcc gcc-c++ make unzip ``` ### 1.3 配置防火墙 ```bash # Ubuntu/Debian(ufw) sudo ufw allow 8080/tcp sudo ufw allow 20000:20004/tcp sudo ufw enable # CentOS/RHEL(firewalld) sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --permanent --add-port=20000-20004/tcp sudo firewall-cmd --reload ``` > **安全提示**: 5432 端口(PostgreSQL)不应对公网开放,仅允许服务器本机访问。 --- ## 第二步:安装 Go 环境 ### 2.1 下载并安装 Go ```bash cd /tmp wget https://go.dev/dl/go1.25.6.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.25.6.linux-amd64.tar.gz rm go1.25.6.linux-amd64.tar.gz ``` ### 2.2 配置环境变量 ```bash vim ~/.bashrc # 在文件末尾添加: export PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin export GOPROXY=https://goproxy.cn,direct export GO111MODULE=on source ~/.bashrc ``` ### 2.3 验证安装 ```bash go version # 预期输出: go version go1.25.6 linux/amd64 ``` --- ## 第三步:安装 PostgreSQL 数据库 ### 3.1 安装 PostgreSQL ```bash # Ubuntu/Debian sudo apt install -y postgresql postgresql-contrib sudo systemctl start postgresql sudo systemctl enable postgresql # CentOS/RHEL sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql14-server postgresql14-contrib sudo /usr/pgsql-14/bin/postgresql-14-setup initdb sudo systemctl start postgresql-14 sudo systemctl enable postgresql-14 ``` ### 3.2 创建数据库和用户 ```bash sudo -u postgres psql ``` ```sql -- 创建数据库 CREATE DATABASE "top-fans"; -- 创建用户(与 common.env 中 DB_USER / DB_PASSWORD 保持一致) CREATE USER topfans_user WITH PASSWORD 'your_secure_password_here'; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE "top-fans" TO topfans_user; \q ``` ### 3.3 验证连接 ```bash psql -h localhost -U topfans_user -d top-fans psql -h localhost -U haihuizhu -d top-fans 密码:Z^Bz8kbH.h~mMZ~! # 输入密码后能成功连接即代表配置正确 ``` --- ## 第四步:安装 Protobuf 编译器 ### 4.1 安装 protoc ```bash # Ubuntu/Debian sudo apt install -y protobuf-compiler # 或手动安装最新版(CentOS 或需要特定版本时) cd /tmp wget https://github.com/protocolbuffers/protobuf/releases/download/v27.2/protoc-27.2-linux-x86_64.zip sudo unzip protoc-27.2-linux-x86_64.zip -d /usr/local rm protoc-27.2-linux-x86_64.zip protoc --version ``` ### 4.2 安装 Go protoc 插件 ```bash go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install github.com/dubbogo/protoc-gen-go-triple/v3@latest which protoc-gen-go which protoc-gen-go-triple ``` --- ## 第五步:部署后端代码 ### 5.1 创建部署目录 ```bash # 二进制文件统一存放于 /opt/topfans sudo mkdir -p /opt/topfans sudo chown root:root /opt/topfans # 配置文件存放于 /etc/topfans sudo mkdir -p /etc/topfans sudo chown root:root /etc/topfans sudo chmod 750 /etc/topfans ``` ### 5.2 克隆代码仓库 ```bash mkdir -p ~/projects cd ~/projects git clone https://github.com/your-org/TopFans.git cd TopFans/backend ``` ### 5.3 下载 Go 依赖 项目使用 Go Workspace(`go.work`),各模块独立管理依赖,需在每个模块目录下分别执行: ```bash BASE=~/projects/TopFans/backend # 主模块(共享 pkg) cd $BASE && go mod download # Gateway cd $BASE/gateway && go mod download # 各 Service for svc in userService socialService galleryService assetService activityService; do cd $BASE/services/$svc && go mod download done ``` --- ## 第六步:配置环境变量(模板配置在deploy文件夹中 项目采用**分层环境变量**策略:公共配置一份,各服务私有配置一份,部署时分别写入 `/etc/topfans/`。 ### 6.1 公共配置(所有服务共享) ```bash sudo vim /etc/topfans/common.env ``` ```ini # ==================== 公共配置 ==================== ENV=production LOG_LEVEL=info # PostgreSQL 连接(多机部署时改为数据库服务器 IP) DB_HOST=localhost DB_PORT=5432 DB_USER=haihuizhu DB_PASSWORD=Z^Bz8kbH.h~mMZ~! DB_NAME=top-fans ``` ### 6.2 各服务私有配置 #### User Service ```bash sudo vim /etc/topfans/user.env ``` ```ini PORT=20000 ``` #### Gallery Service ```bash sudo vim /etc/topfans/gallery.env ``` ```ini PORT=20001 USER_SERVICE_URL=tri://localhost:20000 ASSET_SERVICE_URL=tri://localhost:20003 ``` #### Social Service ```bash sudo vim /etc/topfans/social.env ``` ```ini PORT=20002 USER_SERVICE_URL=tri://localhost:20000 ASSET_SERVICE_URL=tri://localhost:20003 ``` #### Asset Service ```bash sudo vim /etc/topfans/asset.env ``` ```ini PORT=20003 USER_SERVICE_URL=tri://localhost:20000 # 阿里云 OSS(替换为真实值) OSS_REGION=cn-shanghai OSS_BUCKET_NAME=top-fans-test OSS_ACCESS_KEY_ID=LTAI5tNaAjTNiHnefMCG3q4J OSS_ACCESS_KEY_SECRET=48wwZvNkUn1PO1xWjV4HuE5JjB6G7c OSS_ROLE_ARN=acs:ram::1387642798143585:role/top-fans-oss-user ``` #### Activity Service ```bash sudo vim /etc/topfans/activity.env ``` ```ini # ==================== Activity Service 私有配置 ==================== # 多机部署时将此文件放到 activity 服务器的 /etc/topfans/activity.env # 服务端口 PORT=20004 # 下游服务地址(多机部署时改为对应服务器内网IP) USER_SERVICE_URL=tri://localhost:20000 GALLERY_SERVICE_URL=tri://localhost:20001 ``` #### Gateway ```bash sudo vim /etc/topfans/gateway.env ``` ```ini GIN_MODE=release SERVER_PORT=8080 # JWT 密钥(生产环境务必替换为随机强密码) JWT_SECRET=your_secure_jwt_secret_here # 下游服务地址(多机部署时改为对应服务器内网 IP) DUBBO_USER_SERVICE_URL=tri://localhost:20000 DUBBO_GALLERY_SERVICE_URL=tri://localhost:20001 DUBBO_SOCIAL_SERVICE_URL=tri://localhost:20002 DUBBO_ASSET_SERVICE_URL=tri://localhost:20003 DUBBO_ACTIVITY_SERVICE_URL=tri://localhost:20004 ``` ### 6.3 保护配置文件权限 ```bash # 仅允许 topfans 用户读取 sudo chmod 640 /etc/topfans/*.env sudo chown root:root /etc/topfans/*.env ``` --- ## 第七步:编译并安装二进制文件 ### 7.1 编译 Proto 文件(如有 .proto 变更) ```bash cd ~/projects/TopFans/backend bash scripts/compile-proto.sh # 验证生成结果 ls pkg/proto/*/ ``` ### 7.2 编译所有服务 ```bash BASE=~/projects/TopFans/backend # Gateway cd $BASE/gateway go build -ldflags="-s -w" -o /opt/topfans/gateway . # User Service cd $BASE/services/userService go build -ldflags="-s -w" -o /opt/topfans/user-service . # Gallery Service cd $BASE/services/galleryService go build -ldflags="-s -w" -o /opt/topfans/gallery-service . # Social Service cd $BASE/services/socialService go build -ldflags="-s -w" -o /opt/topfans/social-service . # Asset Service cd $BASE/services/assetService go build -ldflags="-s -w" -o /opt/topfans/asset-service . # Activity Service cd $BASE/services/activityService go build -ldflags="-s -w" -o /opt/topfans/activity-service . ``` ### 7.3 验证二进制文件 ```bash ls -lh /opt/topfans/ # 预期看到 6 个可执行文件: # gateway user-service gallery-service social-service asset-service activity-service ``` --- ## 第八步:配置进程守护(systemd) `deploy/systemd/` 目录下已提供所有服务的 systemd 模板,直接复制后启用即可。 ### 8.1 安装 systemd 服务文件 ```bash BASE=~/projects/TopFans/backend sudo cp $BASE/deploy/systemd/topfans-user.service /etc/systemd/system/ sudo cp $BASE/deploy/systemd/topfans-gallery.service /etc/systemd/system/ sudo cp $BASE/deploy/systemd/topfans-social.service /etc/systemd/system/ sudo cp $BASE/deploy/systemd/topfans-asset.service /etc/systemd/system/ sudo cp $BASE/deploy/systemd/topfans-activity.service /etc/systemd/system/ sudo cp $BASE/deploy/systemd/topfans-gateway.service /etc/systemd/system/ ``` 每个服务文件的核心内容如下(以 User Service 为例): ```ini [Unit] Description=TopFans User Service After=network.target postgresql.service [Service] User=topfans WorkingDirectory=/opt/topfans EnvironmentFile=/etc/topfans/common.env EnvironmentFile=/etc/topfans/user.env ExecStart=/opt/topfans/user-service Restart=on-failure RestartSec=5s StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` > **说明**: `ExecStart` 只指定二进制路径,不传任何 flag。服务启动时自动读取 `EnvironmentFile` 中的环境变量作为 flag 默认值(优先级:CLI flag > ENV > 硬编码默认值)。 ### 8.2 重载并启用所有服务 ```bash sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable topfans-user topfans-gallery topfans-social \ topfans-asset topfans-activity topfans-gateway ``` --- ## 第九步:启动与验证 ### 9.1 按依赖顺序启动服务 ```bash # 1. 先启动无依赖的基础服务 sudo systemctl start topfans-user sudo systemctl start topfans-asset # 2. 启动依赖基础服务的上层服务 sudo systemctl start topfans-gallery sudo systemctl start topfans-social sudo systemctl start topfans-activity # 3. 最后启动 Gateway sudo systemctl start topfans-gateway ``` ### 9.2 验证服务状态 ```bash # 查看所有服务状态 sudo systemctl status topfans-user topfans-gallery topfans-social \ topfans-asset topfans-activity topfans-gateway # 检查端口监听 ss -tlnp | grep -E '8080|2000[0-4]' ``` ### 9.3 测试 API ```bash # 健康检查(Gateway) curl -i http://localhost:8080/health # 测试登录接口 curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"test","password":"test"}' ``` ### 9.4 查看日志 ```bash # 实时跟踪单个服务日志 sudo journalctl -u topfans-gateway -f # 查看最近 100 行 sudo journalctl -u topfans-user -n 100 # 同时查看多个服务日志 sudo journalctl -u topfans-user -u topfans-social -f ``` --- ## 更新部署 ```bash BASE=~/projects/TopFans/backend # 1. 拉取最新代码 cd $BASE && git pull origin main # 2. 重新编译(如有 .proto 变更先执行) # bash scripts/compile-proto.sh # 3. 重新编译所有二进制文件 cd $BASE/gateway && go build -ldflags="-s -w" -o /opt/topfans/gateway . cd $BASE/services/userService && go build -ldflags="-s -w" -o /opt/topfans/user-service . cd $BASE/services/galleryService && go build -ldflags="-s -w" -o /opt/topfans/gallery-service . cd $BASE/services/socialService && go build -ldflags="-s -w" -o /opt/topfans/social-service . cd $BASE/services/assetService && go build -ldflags="-s -w" -o /opt/topfans/asset-service . cd $BASE/services/activityService && go build -ldflags="-s -w" -o /opt/topfans/activity-service . # 4. 重启所有服务 sudo systemctl restart topfans-user topfans-gallery topfans-social \ topfans-asset topfans-activity topfans-gateway # 5. 确认服务全部正常 sudo systemctl status topfans-* ``` --- ## 故障排查 ### 问题 1: 服务无法启动 ```bash # 查看详细错误日志 sudo journalctl -u topfans-gateway -xe # 检查端口是否被占用 sudo ss -tlnp | grep 8080 # 手动执行二进制,直接查看输出 sudo -u topfans \ env $(cat /etc/topfans/common.env /etc/topfans/gateway.env | grep -v '^#') \ /opt/topfans/gateway ``` ### 问题 2: 数据库连接失败 ```bash # 确认 PostgreSQL 运行中 sudo systemctl status postgresql # 验证连接参数(与 common.env 一致) psql -h localhost -U topfans_user -d top-fans # 检查 common.env 中的数据库配置 sudo cat /etc/topfans/common.env | grep DB_ ``` ### 问题 3: Dubbo 服务连接失败 ```bash # 检查下游服务是否运行并监听端口 sudo ss -tlnp | grep -E '2000[0-4]' # 检查服务日志 sudo journalctl -u topfans-user -n 50 # 确认服务私有 env 中的 URL 配置正确 sudo cat /etc/topfans/social.env ``` ### 问题 4: 环境变量未生效 ```bash # 查看 systemd 实际注入的环境变量 sudo systemctl show topfans-user --property=Environment # 手动验证 env 文件语法(不应含 export 前缀) sudo cat /etc/topfans/common.env ``` ### 问题 5: Proto 文件编译失败 ```bash # 检查工具是否安装 protoc --version which protoc-gen-go which protoc-gen-go-triple # 手动编译单个 proto 文件测试 cd ~/projects/TopFans/backend protoc --proto_path=proto \ --go_out=pkg/proto/user \ --go_opt=paths=source_relative \ user.proto ``` --- ## 性能优化建议 ### 1. 数据库优化 ```bash sudo vim /etc/postgresql/14/main/postgresql.conf # 根据服务器内存调整(以下为 8 GB 内存示例) shared_buffers = 2GB effective_cache_size = 6GB maintenance_work_mem = 512MB work_mem = 32MB max_connections = 200 sudo systemctl restart postgresql ``` ### 2. 系统参数优化 ```bash sudo vim /etc/security/limits.conf # 添加: * soft nofile 65535 * hard nofile 65535 sudo vim /etc/sysctl.conf # 添加: net.core.somaxconn = 1024 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.ip_local_port_range = 10000 65000 sudo sysctl -p ``` ### 3. 日志轮转 ```bash sudo vim /etc/logrotate.d/topfans ``` ``` /var/log/topfans/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0644 topfans topfans } ``` --- ## 监控与备份 ### 服务健康检查脚本 ```bash vim ~/health-check.sh ``` ```bash #!/bin/bash SERVICES=(topfans-user topfans-gallery topfans-social topfans-asset topfans-activity topfans-gateway) LOG=/var/log/topfans-health.log for svc in "${SERVICES[@]}"; do if ! systemctl is-active --quiet "$svc"; then echo "$(date '+%F %T'): $svc is down, restarting..." >> "$LOG" systemctl restart "$svc" fi done ``` ```bash chmod +x ~/health-check.sh # 每 5 分钟检查一次 (crontab -l 2>/dev/null; echo "*/5 * * * * /home/topfans/health-check.sh") | crontab - ``` ### 数据库备份脚本 ```bash vim ~/backup-db.sh ``` ```bash #!/bin/bash BACKUP_DIR="/home/topfans/backups" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" pg_dump -h localhost -U topfans_user -d top-fans > "$BACKUP_DIR/topfans_$DATE.sql" gzip "$BACKUP_DIR/topfans_$DATE.sql" # 保留最近 7 天 find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete echo "$(date '+%F %T'): Backup done: topfans_$DATE.sql.gz" >> /var/log/topfans-backup.log ``` ```bash chmod +x ~/backup-db.sh # 每天凌晨 2 点备份 (crontab -l 2>/dev/null; echo "0 2 * * * /home/topfans/backup-db.sh") | crontab - ``` --- ## 多机部署说明 当业务量增长需要将服务拆分到多台服务器时,只需修改各服务器上对应服务私有 env 文件中的下游地址,将 `localhost` 替换为目标服务器的**内网 IP**,无需改动代码。 ### 示例:双机部署(DB 服务器 + 应用服务器) **DB 服务器**(IP: `10.0.0.10`):仅运行 PostgreSQL。 **应用服务器**(IP: `10.0.0.20`):运行所有后端服务,修改 `common.env` 中的 DB 地址: ```ini # /etc/topfans/common.env(应用服务器) DB_HOST=10.0.0.10 # 改为 DB 服务器内网 IP ``` ### 示例:三机部署(拆分 Asset/Gallery 服务) | 服务器 | 运行服务 | |---|---| | `10.0.0.20`(应用1)| userService, socialService, activityService, gateway | | `10.0.0.21`(应用2)| galleryService, assetService | | `10.0.0.10`(DB)| PostgreSQL | 在应用1服务器的 `social.env` 和 `activity.env` 中: ```ini # /etc/topfans/social.env(应用1服务器) ASSET_SERVICE_URL=tri://10.0.0.21:20003 # 指向应用2内网 IP ``` 在应用1的 `gateway.env` 中: ```ini # /etc/topfans/gateway.env(应用1服务器) DUBBO_GALLERY_SERVICE_URL=tri://10.0.0.21:20001 DUBBO_ASSET_SERVICE_URL=tri://10.0.0.21:20003 ``` > **后续扩展**: 如需引入服务注册与发现(如 Nacos),各服务的 `configs/dubbo.yaml` 已预留占位配置,启用时取消注释并在 `main.go` 中调用 `config.Load()` 即可。 --- ## 安全建议 1. **强密码**: `DB_PASSWORD`、`JWT_SECRET` 使用 32 位以上随机字符串 2. **最小权限**: 服务以 `topfans` 用户运行,不使用 root 3. **env 文件权限**: `chmod 640`,仅 `topfans` 用户可读 4. **防火墙**: 仅对外开放 8080,Dubbo 端口(20000-20004)限内网访问 5. **HTTPS**: 生产环境通过 Nginx 反向代理对外暴露 443 端口 6. **定期更新**: 及时更新系统包和 Go 依赖 7. **备份验证**: 每月手动恢复一次备份,验证其可用性