diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..19a108b --- /dev/null +++ b/readme.md @@ -0,0 +1,605 @@ +# 云升数码 - 部署教程 + +> 一文搞定从零到线上的完整部署流程,支持 Linux / Windows / Docker 三种方式 + +--- + +## 📋 目录 + +- [准备工作](#准备工作) +- [方式一:Linux 一键部署(推荐)](#方式一linux-一键部署推荐) +- [方式二:Windows 部署](#方式二windows-部署) +- [方式三:Docker 容器化部署](#方式三docker-容器化部署) +- [域名与 SSL 配置](#域名与-ssl-配置) +- [后台初始化](#后台初始化) +- [常用维护命令](#常用维护命令) +- [故障排查](#故障排查) +- [进阶配置](#进阶配置) + +--- + +## 🎯 准备工作 + +### 服务器要求 + +| 组件 | 最低配置 | 推荐配置 | +|------|----------|----------| +| CPU | 1 核 | 2 核+ | +| 内存 | 1 GB | 2 GB+ | +| 硬盘 | 10 GB | 50 GB+ (SSD) | +| 系统 | Ubuntu 22.04+ / Debian 12+ / CentOS 9+ / Windows Server 2019+ | Ubuntu 24.04 LTS | +| 带宽 | 5 Mbps | 20 Mbps+ | + +### 必备条件 + +- ✅ 一台云服务器(腾讯云/阿里云/华为云/轻量应用服务器均可) +- ✅ 一个已备案域名(中国大陆节点必须备案) +- ✅ 域名已解析到服务器公网 IP(A 记录) +- ✅ SSH 客户端(Windows 推荐 Terminal / Tabby,Mac/Linux 自带 Terminal) + +--- + +## 🚀 方式一:Linux 一键部署(推荐) + +### 适用系统 + +- Ubuntu 22.04 / 24.04 LTS +- Debian 12 (Bookworm) +- CentOS / Rocky Linux / AlmaLinux 9+ + +### 步骤 1:连接服务器 + +```bash +# 使用 SSH 连接(替换为你的服务器 IP) +ssh root@your-server-ip + +# 或使用密钥登录 +ssh -i ~/.ssh/id_rsa root@your-server-ip +``` + +### 步骤 2:下载并运行安装脚本 + +```bash +# 1. 克隆项目仓库 +git clone https://git.grxiao.cn/yuns/plerr-open.git +cd plerr-open + +# 2. 赋予脚本执行权限 +chmod +x scripts/install.sh + +# 3. 运行一键安装(需要 root 权限) +sudo ./scripts/install.sh +``` + +### 步骤 3:按提示输入信息 + +脚本会交互式询问: + +```bash +请输入域名 (例: yunsheng.digital): your-domain.com +请输入邮箱 (用于 SSL 证书): admin@your-domain.com +``` + +> 💡 **提示**:如果不想交互,可直接传参: +> ```bash +> sudo ./scripts/install.sh your-domain.com admin@your-domain.com +> ``` + +### 步骤 4:等待部署完成 + +脚本会自动完成以下工作(约 3-5 分钟): + +1. 📦 安装系统依赖 +2. ⬇️ 下载 PocketBase v0.22.0 +3. ⚙️ 配置 systemd 服务 +4. 🌐 配置 Nginx 反向代理 +5. 🔒 申请 Let's Encrypt SSL 证书 +6. 🛡️ 配置防火墙 & Fail2Ban +7. 📝 创建维护脚本 & 定时任务 +8. 🚀 启动所有服务 + +### 步骤 5:访问验证 + +部署成功后会显示: + +```bash +========================================== + 部署完成! +========================================== + +📋 重要信息: + - 网站地址: https://your-domain.com + - 后台管理: https://your-domain.com/_/ + - 管理员账号: admin@yunsheng.digital + - 管理员密码: YunSheng@2024!Admin + - PocketBase 数据目录: /opt/pocketbase/pb_data + - 前端构建目录: /opt/pocketbase/pb_public +``` + +立即访问 `https://your-domain.com` 查看网站,访问 `https://your-domain.com/_/` 进入后台管理。 + +--- + +## 🪟 方式二:Windows 部署 + +### 适用系统 + +- Windows 10/11 (专业版/企业版) +- Windows Server 2019/2022 + +### 前置要求 + +```powershell +# 1. 以管理员身份打开 PowerShell +# 2. 启用脚本执行策略 +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +# 3. 安装 Chocolatey (如果未安装) +Set-ExecutionPolicy Bypass -Scope Process -Force +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 +iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) +refreshenv +``` + +### 运行安装脚本 + +```powershell +# 1. 克隆仓库 +git clone https://git.grxiao.cn/yuns/plerr-open.git +cd plerr-open + +# 2. 运行安装脚本 (管理员 PowerShell) +.\scripts\install.ps1 + +# 或传参 +.\scripts\install.ps1 -Domain "your-domain.com" -Email "admin@your-domain.com" +``` + +### Windows 特有说明 + +| 组件 | 说明 | +|------|------| +| PocketBase | 通过 NSSM 作为 Windows 服务运行 | +| Nginx | 通过 NSSM 作为 Windows 服务运行 | +| SSL 证书 | 使用 Certbot (Chocolatey 安装) | +| 定时任务 | 使用 Windows 任务计划程序 | +| 日志查看 | `C:\pocketbase\logs\` | + +--- + +## 🐳 方式三:Docker 容器化部署 + +### 前置要求 + +```bash +# 安装 Docker & Docker Compose +curl -fsSL https://get.docker.com | bash +systemctl enable docker --now + +# 安装 Docker Compose v2 +docker compose version +``` + +### 快速启动 + +```bash +# 1. 进入 docker 目录 +cd docker + +# 2. 复制环境变量模板 +cp .env.example .env + +# 3. 编辑配置 +vim .env +``` + +**`.env` 关键配置:** + +```env +# 域名配置 +DOMAIN=your-domain.com +EMAIL=admin@your-domain.com + +# PocketBase 配置 +PB_ENCRYPTION_KEY=your-32-char-base64-key +PB_ADMIN_EMAIL=admin@yunsheng.digital +PB_ADMIN_PASSWORD=YourStrongPassword123! + +# 时区 +TZ=Asia/Shanghai +``` + +### 生成加密密钥 + +```bash +# 生成 32 字节 Base64 密钥 +openssl rand -base64 32 +``` + +### 启动服务 + +```bash +# 构建并启动 +docker compose up -d --build + +# 查看日志 +docker compose logs -f + +# 查看状态 +docker compose ps +``` + +### Docker Compose 服务说明 + +| 服务 | 端口 | 说明 | +|------|------|------| +| pocketbase | 8090 | 后端 API + Admin UI + 静态文件 | +| nginx | 80/443 | 反向代理 + SSL 终止 + 静态文件缓存 | +| certbot | - | 自动申请/续期 Let's Encrypt 证书 | + +--- + +## 🌐 域名与 SSL 配置 + +### 域名解析 + +在域名服务商控制台添加记录: + +| 记录类型 | 主机记录 | 记录值 | TTL | +|----------|----------|--------|-----| +| A | @ | 你的服务器公网 IP | 600 | +| A | www | 你的服务器公网 IP | 600 | + +> ⏳ 解析生效通常需要 1-10 分钟,可用 `dig your-domain.com` 验证 + +### SSL 证书 + +**自动模式(推荐):** 一键脚本 / Docker 会自动申请 Let's Encrypt 证书并配置自动续期。 + +**手动申请:** + +```bash +# Linux (Certbot + Nginx) +sudo certbot --nginx -d your-domain.com -d www.your-domain.com + +# 仅申请证书 (不修改 Nginx 配置) +sudo certbot certonly --nginx -d your-domain.com -d www.your-domain.com + +# 测试自动续期 +sudo certbot renew --dry-run +``` + +**证书路径:** + +- Linux: `/etc/letsencrypt/live/your-domain.com/` +- Windows: `C:\Certbot\live\your-domain.com\` +- Docker: `/etc/letsencrypt/live/your-domain.com/` (容器内) + +--- + +## 🔧 后台初始化 + +### 首次登录 + +1. 访问 `https://your-domain.com/_/` +2. 使用默认账号登录: + - **邮箱**: `admin@yunsheng.digital` + - **密码**: `YunSheng@2024!Admin` + +### 必做安全设置 + +⚠️ **请立即完成以下操作:** + +1. **修改管理员密码** + - 点击右上角头像 → Profile → Change Password + +2. **修改加密密钥备份** + - Linux: `cat /etc/systemd/system/pocketbase.service | grep PB_ENCRYPTION_KEY` + - 保存到安全位置(迁移服务器必需) + +3. **配置站点基本信息** + - Settings → Site Settings → 填写站点名称、描述、Logo、ICP 备案号等 + +4. **启用背景音乐(可选)** + - Settings → Background Music → 上传音频文件或填写外链 + +5. **创建分类与标签** + - Collections → categories / tags → New Record + +6. **发布第一篇文章** + - Collections → posts → New Record → 使用 TipTap 编辑器撰写 + +--- + +## 🛠️ 常用维护命令 + +### Linux (systemd) + +```bash +# 服务管理 +systemctl status pocketbase # 查看状态 +systemctl restart pocketbase # 重启 +systemctl stop pocketbase # 停止 +systemctl start pocketbase # 启动 + +# Nginx +systemctl status nginx +systemctl reload nginx # 重载配置 (无中断) +nginx -t # 测试配置 + +# 查看日志 +journalctl -u pocketbase -f # 实时日志 +journalctl -u pocketbase -n 100 # 最近 100 行 +tail -f /var/log/nginx/access.log +tail -f /var/log/nginx/error.log + +# 备份 +/usr/local/bin/yunsheng-backup + +# 更新 +/usr/local/bin/yunsheng-update + +# 状态检查 +/usr/local/bin/yunsheng-status +``` + +### Windows (PowerShell) + +```powershell +# 服务管理 +net start PocketBase +net stop PocketBase +Restart-Service PocketBase + +net start nginx +net stop nginx + +# 查看日志 +Get-Content C:\pocketbase\logs\stdout.log -Wait +Get-Content C:\nginx\logs\error.log -Wait + +# 备份 +C:\pocketbase\scripts\backup.bat + +# 更新 +C:\pocketbase\scripts\update.bat + +# 状态 +C:\pocketbase\scripts\status.bat +``` + +### Docker + +```bash +# 服务管理 +docker compose ps +docker compose restart pocketbase +docker compose restart nginx + +# 查看日志 +docker compose logs -f pocketbase +docker compose logs -f nginx + +# 备份 (进入容器执行) +docker compose exec pocketbase pocketbase dump --dir=/pb_data --output=/backup/pb_$(date +%Y%m%d).zip + +# 更新镜像 +docker compose pull +docker compose up -d --build + +# 进入容器 +docker compose exec pocketbase sh +``` + +--- + +## 🔍 故障排查 + +### 1. 网站无法访问 (502 Bad Gateway) + +**原因**:PocketBase 服务未运行 + +```bash +# 检查服务状态 +systemctl status pocketbase + +# 查看错误日志 +journalctl -u pocketbase -n 50 + +# 常见解决: +# - 端口 8090 被占用: ss -tlnp | grep 8090 +# - 权限问题: chown -R www-data:www-data /opt/pocketbase +# - 加密密钥错误: 检查 systemd 服务文件中的 PB_ENCRYPTION_KEY +``` + +### 2. 静态资源 404 (CSS/JS/图片加载失败) + +**原因**:前端构建产物未部署或 Nginx root 路径错误 + +```bash +# 检查构建产物 +ls -la /opt/pocketbase/pb_public/ + +# 应该看到 index.html、assets/ 目录 +# 如果为空,重新构建前端: +cd /path/to/project/apps/web +pnpm build +cp -r dist/* /opt/pocketbase/pb_public/ + +# 检查 Nginx 配置 root 路径 +grep -n "root" /etc/nginx/sites-enabled/yunsheng-digital +``` + +### 3. SSL 证书申请失败 + +```bash +# 检查域名解析 +dig your-domain.com +short +# 必须返回服务器公网 IP + +# 检查 80 端口可达性 +curl -I http://your-domain.com/.well-known/acme-challenge/test + +# 手动申请 (调试模式) +certbot certonly --nginx -d your-domain.com -v --dry-run +``` + +### 4. 文件上传失败 / 体积过大 + +**修改上传限制:** + +```bash +# 1. PocketBase 启动参数 (systemd 服务文件) +ExecStart=... --maxUploadSize=104857600 # 100MB + +# 2. Nginx 配置 +client_max_body_size 100M; + +# 3. 重启生效 +systemctl daemon-reload +systemctl restart pocketbase nginx +``` + +### 5. 数据库损坏 / 锁定 + +```bash +# 停止服务 +systemctl stop pocketbase + +# 备份当前数据 +cp -r /opt/pocketbase/pb_data /opt/pocketbase/pb_data.backup.$(date +%Y%m%d) + +# 尝试修复 (PocketBase 内置) +/opt/pocketbase/pocketbase migrate --dir=/opt/pocketbase/pb_data --migrationsDir=/opt/pocketbase/pb_migrations + +# 或从备份恢复 +/opt/pocketbase/pocketbase restore --dir=/opt/pocketbase/pb_data --input=/backup/pb_backup.zip + +# 重启 +systemctl start pocketbase +``` + +### 6. 内存不足 (OOM Killer) + +```bash +# 检查内存 +free -h + +# 添加 Swap (临时缓解) +fallocate -l 2G /swapfile +chmod 600 /swapfile +mkswap /swapfile +swapon /swapfile +echo '/swapfile none swap sw 0 0' >> /etc/fstab + +# 限制 PocketBase 内存 (systemd) +MemoryLimit=512M +``` + +--- + +## ⚙️ 进阶配置 + +### 1. 配置 CDN (Cloudflare / 阿里云 CDN / 腾讯云 CDN) + +**优势**:隐藏源站 IP、DDoS 防护、静态资源加速 + +**关键设置**: + +``` +# Cloudflare 示例 +SSL/TLS 模式: Full (Strict) +开启: Automatic HTTPS Rewrites, Always Use HTTPS +缓存规则: + - 静态资源 (*.js, *.css, *.png, *.jpg 等) -> Cache Everything, Edge TTL: 1 年 + - HTML 页面 -> Bypass Cache (或短 TTL) + - /api/* -> Bypass Cache + - /_/ * -> Bypass Cache (Admin UI) +``` + +**Nginx 配合 CDN 获取真实 IP**: + +```nginx +# 在 http 块中添加 +set_real_ip_from 103.21.244.0/22; # Cloudflare IP 段 +set_real_ip_from 103.22.200.0/22; +# ... 更多 Cloudflare IP +real_ip_header CF-Connecting-IP; +``` + +### 2. 开启 HTTP/3 (QUIC) + +```nginx +# Nginx 1.25+ 支持 +server { + listen 443 quic reuseport; + listen 443 ssl http2; + # ... +} +``` + +### 3. 配置对象存储 (S3 兼容) 存储上传文件 + +**PocketBase 支持 S3 存储后端**: + +```bash +# 启动参数添加 +--s3Endpoint=https://s3.your-provider.com \ +--s3Bucket=your-bucket \ +--s3AccessKey=YOUR_ACCESS_KEY \ +--s3SecretKey=YOUR_SECRET_KEY \ +--s3Region=auto +``` + +### 4. 迁移到 PostgreSQL (高并发场景) + +PocketBase v0.22+ 实验性支持 PostgreSQL: + +```bash +# 启动参数 +--dsn="postgres://user:pass@host:5432/dbname?sslmode=require" +``` + +> ⚠️ 迁移需谨慎,建议先测试环境验证 + +### 5. 多服务器负载均衡 + +``` + ┌─────────────┐ + 用户 ───→ CDN/WAF ───→ Nginx (LB) ───→ PocketBase #1 + │ └─────────────┘ + │ ┌─────────────┐ + └──────────────→ PocketBase #2 + └─────────────┘ +``` + +**注意**: +- PocketBase 需要共享同一数据库 (PostgreSQL) +- 实时订阅 需要 Redis 适配器 (开发中) +- 静态文件需共享存储 (NFS/S3) + +--- + +## 📦 更新日志 + +| 版本 | 日期 | 说明 | +|------|------|------| +| v1.0.0 | 2024-01-15 | 初始版本发布 | + +--- + +## 🤝 获取帮助 + +- **GitHub Issues**: [提交问题](https://git.grxiao.cn/yuns/plerr-open/issues) +- **文档中心**: [docs.yunsheng.digital](https://docs.yunsheng.digital) +- **邮件支持**: tech@yunsheng.digital + +--- + +## 📄 许可证 + +MIT License - 详见 [LICENSE](../LICENSE) + +--- + +> 💡 **提示**:部署遇到问题?请先查看 [故障排查](#故障排查) 章节,大多数问题都能自行解决。如果仍无法解决,请提供完整的错误日志和服务器环境信息提交 Issue。