域名: community.tensorhub.cn
服务器 IP: 159.65.97.63
前端路径: /www/wwwroot/community.tensorhub.cn
项目根目录: /www/wwwroot/TensorHubCommunity(git clone)
- 服务器已安装宝塔面板(推荐 7.9+)
- 宝塔面板中已安装 Nginx
- 本地安装了
ssh、git、node、rsync - 域名
community.tensorhub.cn的管理权限
在你的域名管理后台添加以下 DNS 记录:
| 类型 | 主机记录 | 记录值 | TTL |
|---|---|---|---|
| A | community |
159.65.97.63 |
600 |
⚠️ DNS 生效通常需要几分钟到数小时,确认生效后再继续:ping community.tensorhub.cn应解析到
159.65.97.63。
在宝塔面板中:
- 软件商店 → 安装 Nginx(如未安装)
- 软件商店 → 安装 Docker 管理器(如未安装)
- 宝塔面板 → 网站 → 添加站点
- 域名填
community.tensorhub.cn - 根目录设为
/www/wwwroot/community.tensorhub.cn - PHP 版本选 纯静态
- 点击提交
ssh root@159.65.97.63
cd /www/wwwroot
git clone https://github.com/Septemc/TensorHubCommunity.git
cd TensorHubCommunity
# 创建上传目录
mkdir -p uploads
chmod 777 uploads# 克隆项目到本地(如果还没克隆)
git clone https://github.com/Septemc/TensorHubCommunity.git
cd TensorHubCommunity
# 给部署脚本添加执行权限
chmod +x deploy/deploy.baota.sh
# 执行完整部署
./deploy/deploy.baota.sh fullfull 命令会自动完成:
- ✅ 初始化服务器(安装 Docker、创建目录)
- ✅ 生成安全密码
- ✅ 同步项目文件到服务器
- ✅ 配置环境变量
- ✅ 本地构建前端并同步到站点目录
- ✅ 构建并启动后端 Docker 容器
- ✅ 运行数据库迁移
- ✅ 健康检查
⚠️ 请务必保存脚本输出的密码信息!
部署完成后,还需要在宝塔面板中配置 Nginx 和 SSL 证书(见下方)。
ssh root@159.65.97.63
# 安装 Docker(如果宝塔未安装)
curl -fsSL https://get.docker.com | sh
systemctl enable docker && systemctl start docker
# 安装 Docker Compose 插件
apt-get install -y docker-compose-plugin
# 克隆项目
cd /www/wwwroot
git clone https://github.com/Septemc/TensorHubCommunity.git
cd TensorHubCommunity
# 创建上传目录
mkdir -p uploads
chmod 777 uploads
exitssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
cp .env.baota.example .env
nano .env必须修改的配置项:
| 环境变量 | 说明 | 生成方式 |
|---|---|---|
POSTGRES_PASSWORD |
数据库密码 | openssl rand -hex 16 |
TENSORHUB_DATABASE_URL |
数据库连接串(密码需同步) | 替换密码部分 |
TENSORHUB_JWT_SECRET_KEY |
JWT 密钥 | python3 -c "import secrets; print(secrets.token_hex(32))" |
TENSORHUB_BOOTSTRAP_ADMIN_PASSWORD |
管理员密码 | 设置一个强密码 |
TENSORHUB_COOKIE_SECURE |
Cookie 安全标志 | 必须设为 true |
TENSORHUB_COOKIE_DOMAIN |
Cookie 域名 | community.tensorhub.cn |
cd frontend
npm install
npm run build
# 同步到服务器站点目录
rsync -avz --delete dist/ root@159.65.97.63:/www/wwwroot/community.tensorhub.cn/ssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
# 构建并启动
docker compose -f docker-compose.baota.yml up -d --build
# 数据库迁移已在容器启动时自动执行
# 如需手动运行迁移,可执行:
# docker compose -f docker-compose.baota.yml exec backend alembic upgrade head
# 查看状态
docker compose -f docker-compose.baota.yml ps- 宝塔面板 → 网站 → 点击站点名
community.tensorhub.cn - 点击 配置文件
- 删除全部内容,替换为项目中
deploy/nginx/baota_default.conf的内容 - 点击 保存
- 重启 Nginx
# 在服务器上
scp /www/wwwroot/TensorHubCommunity/deploy/nginx/baota_default.conf /www/server/panel/vhost/nginx/community.tensorhub.cn.conf
nginx -t && nginx -s reload宝塔 Nginx 配置的核心要点:
| 配置项 | 说明 |
|---|---|
location /api/ |
反向代理到后端 http://127.0.0.1:8100 |
location /uploads/ |
映射到 /www/wwwroot/TensorHubCommunity/uploads/ |
location / |
SPA 回退,所有前端路由返回 index.html |
location /assets/ |
静态资源长缓存 |
| HTTP→HTTPS | 由宝塔面板管理(申请SSL后自动添加) |
在宝塔面板申请 SSL 证书后,会自动在配置文件中生成 443 端口的 server 块。你必须确保 443 server 块中也包含以下 location 配置:
# 在 443 server 块中添加:
location /api/ {
proxy_pass http://127.0.0.1:8100/api/;
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;
proxy_read_timeout 120s;
proxy_connect_timeout 10s;
}
location /uploads/ {
alias /www/wwwroot/TensorHubCommunity/uploads/;
expires 7d;
add_header Cache-Control "public, immutable";
}
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.html;
}- 宝塔面板 → 网站 → 点击站点名
- 点击 SSL 标签
- 选择 Let's Encrypt
- 勾选
community.tensorhub.cn - 点击 申请
- 开启 强制 HTTPS
宝塔面板会自动续期 Let's Encrypt 证书。
./deploy/deploy.baota.sh full # 完整首次部署
./deploy/deploy.baota.sh deploy # 代码更新后重新部署
./deploy/deploy.baota.sh build-fe # 仅构建前端并同步
./deploy/deploy.baota.sh start # 启动后端服务
./deploy/deploy.baota.sh stop # 停止后端服务
./deploy/deploy.baota.sh restart # 重启后端服务
./deploy/deploy.baota.sh logs # 查看后端日志
./deploy/deploy.baota.sh status # 查看服务状态
./deploy/deploy.baota.sh db-backup # 备份数据库
./deploy/deploy.baota.sh nginx # 显示 Nginx 配置指引在服务器上拉取最新代码,然后重新部署:
ssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
git pull
# 停止旧容器
docker compose -f docker-compose.baota.yml down
# 重新构建并启动(--build 会重建镜像,包含新代码)
docker compose -f docker-compose.baota.yml up -d --build
# 等待服务启动完成,查看状态
docker compose -f docker-compose.baota.yml ps
# 查看后端日志,确认迁移成功
docker compose -f docker-compose.baota.yml logs --tail=50 backend前端也需要重新构建:
# 在本地
cd frontend
npm install
npm run build
rsync -avz --delete dist/ root@159.65.97.63:/www/wwwroot/community.tensorhub.cn/cd frontend
npm run build
rsync -avz --delete dist/ root@159.65.97.63:/www/wwwroot/community.tensorhub.cn/ssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
# 实时日志
docker compose -f docker-compose.baota.yml logs -f backend
# 最近100行
docker compose -f docker-compose.baota.yml logs --tail=100 backendssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
# 创建备份
docker compose -f docker-compose.baota.yml exec db \
pg_dump -U postgres tensorhub > /tmp/backup_$(date +%Y%m%d_%H%M%S).sql
# 恢复备份
cat /tmp/backup_20240101_120000.sql | \
docker compose -f docker-compose.baota.yml exec -T db \
psql -U postgres tensorhub当后端模型有变更时:
# 本地生成迁移文件
cd backend
alembic revision --autogenerate -m "描述"
# 在服务器上执行迁移
ssh root@159.65.97.63
cd /www/wwwroot/TensorHubCommunity
docker compose -f docker-compose.baota.yml exec backend alembic upgrade headssh root@159.65.97.63
# 检查后端服务
cd /www/wwwroot/TensorHubCommunity
docker compose -f docker-compose.baota.yml ps
# 检查 Nginx 配置
nginx -t
# 检查端口监听
ss -tlnp | grep -E '80|443|8100'- 后端容器未启动或未就绪
- 检查:
docker compose -f docker-compose.baota.yml logs backend
- 检查
index.html是否在站点目录:ls /www/wwwroot/community.tensorhub.cn/ - 检查 Nginx 配置的
root路径是否正确 - 检查浏览器控制台是否有资源加载错误
- 确认
/www/wwwroot/TensorHubCommunity/uploads/目录存在且有权限 - 确认 Nginx 配置中
/uploads/路径正确映射
如果出现 Bind for 127.0.0.1:8100 failed: port is already allocated 错误:
# 方法1:停止所有 docker-compose 服务
cd /www/wwwroot/TensorHubCommunity
docker compose down # 停止原始 docker-compose.yml 的服务
docker compose -f docker-compose.baota.yml down # 停止 baota 版服务
# 方法2:查找并杀死占用端口的进程
ss -tlnp | grep :8100
kill <PID>
# 然后重新启动
docker compose -f docker-compose.baota.yml up -d- 检查
.env中POSTGRES_PASSWORD和TENSORHUB_DATABASE_URL密码一致 - 检查 db 容器是否正常:
docker compose -f docker-compose.baota.yml ps
Internet → 宝塔 Nginx (80/443)
├── / → /www/wwwroot/community.tensorhub.cn (Vue SPA 前端)
├── /assets/ → 静态资源(长缓存)
├── /uploads/ → /www/wwwroot/TensorHubCommunity/uploads/
└── /api/ → http://127.0.0.1:8100 (Docker 后端)
服务器文件布局:
/www/wwwroot/TensorHubCommunity/ ← git clone 项目(后端代码 + Docker 配置)
/www/wwwroot/community.tensorhub.cn/ ← 前端构建产物(npm run build 输出)
Docker Network:
backend:8000 → db:5432 (PostgreSQL)