From 30c7e0062f48abb05d2db8dd4a74be44552cd6a5 Mon Sep 17 00:00:00 2001 From: zack Date: Thu, 17 Jul 2025 19:46:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20=E9=87=8D=E5=86=99=20Docker=20?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E6=96=87=E6=A1=A3=E5=92=8C=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重写 docs/deployment.md,专注于 Docker 部署 - 更新 README.md,添加功能特性和管理命令 - 新增 docs/docker-quickstart.md 快速开始指南 - 优化文档结构,提供更清晰的部署流程 - 添加故障排除和维护指南 --- README.md | 124 +++++++---- docker-compose.yml | 7 +- docs/deployment.md | 449 +++++++++++++++++++++++--------------- docs/docker-quickstart.md | 222 +++++++++++++++++++ 4 files changed, 573 insertions(+), 229 deletions(-) create mode 100644 docs/docker-quickstart.md diff --git a/README.md b/README.md index 5522a55..18de2ef 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,109 @@ # SMS Forwarder -一个将 iOS 短信转发到 Android 设备的通知服务器。 +🚀 一个将 iOS 短信转发到 Android 设备的高性能通知服务器 -## 功能特性 +[![Docker](https://img.shields.io/badge/Docker-支持-blue?logo=docker)](https://www.docker.com/) +[![Python](https://img.shields.io/badge/Python-3.10+-green?logo=python)](https://www.python.org/) +[![FastAPI](https://img.shields.io/badge/FastAPI-框架-red?logo=fastapi)](https://fastapi.tiangolo.com/) +[![License](https://img.shields.io/badge/License-MIT-yellow)](LICENSE) -- 接收来自 iPhone 快捷指令的短信内容 -- 支持多种推送方式(Pushbullet、FCM、Gotify、ntfy 等) -- 基于 FastAPI 的高性能 HTTP 服务器 -- 使用 Apprise 库支持 80+ 种通知服务 -- YAML 配置文件,支持多推送目标 -- API 密钥认证,确保安全性 -- 完整的日志记录和错误处理 +## ✨ 功能特性 -## 快速开始 +- 📱 **iPhone 集成**:通过快捷指令自动转发短信 +- 🔔 **多种推送**:支持 Gotify、ntfy、Pushbullet 等 80+ 种通知服务 +- ⚡ **低延迟**:Gotify 1-3秒,ntfy 5-15秒延迟 +- 🐳 **Docker 部署**:一键部署,环境隔离 +- 🔒 **安全认证**:API 密钥 + IP 白名单 + 速率限制 +- 📊 **监控完善**:健康检查、状态监控、详细日志 +- 🎯 **高性能**:基于 FastAPI,支持高并发 +- 🛠️ **易于管理**:提供完整的管理脚本 -### 1. 环境要求 +## 🚀 快速开始(推荐 Docker) -- Python 3.10+ -- uv 包管理器 - -### 2. 安装 +### 1. 克隆项目 ```bash -# 克隆项目 -git clone -cd notification - -# 使用 uv 安装依赖 -uv sync +git clone https://gitea.nosuchip.de/zack/sms_forwarder.git +cd sms_forwarder ``` -### 3. 配置 - -复制配置文件模板并编辑: +### 2. 配置服务 ```bash +# 复制配置文件 cp config.example.yaml config.yaml + +# 编辑配置(必须修改 API 密钥和推送服务) +nano config.yaml ``` -编辑 `config.yaml` 文件,配置你的推送服务。 - -### 4. 运行 +### 3. 一键部署 ```bash -# 开发模式 -uv run uvicorn sms_forwarder.main:app --reload --host 0.0.0.0 --port 8000 +# 自动部署(推荐) +./scripts/deploy.sh -# 生产模式 -uv run sms-forwarder +# 或手动部署 +docker-compose up -d ``` -## 支持的推送服务 +### 4. 验证部署 -- **Pushbullet** - 推荐,设置简单 -- **FCM (Firebase Cloud Messaging)** - Google 官方推送 -- **Gotify** - 自托管推送服务 -- **ntfy** - 开源推送服务 -- **Discord、Telegram、Slack** 等 80+ 种服务 +```bash +# 测试服务 +./scripts/test-docker.sh -## iPhone 快捷指令配置 +# 查看状态 +./scripts/docker-manage.sh status +``` -详见 [iPhone 配置指南](docs/iphone-setup.md) +服务启动后访问: +- 🌐 **API 文档**:http://localhost:12152/docs +- 💚 **健康检查**:http://localhost:12152/health +- 📊 **服务状态**:http://localhost:12152/status -## API 文档 +## 📋 支持的推送服务 -服务器启动后访问 `http://localhost:8000/docs` 查看 API 文档。 +| 服务 | 延迟 | 特点 | 推荐度 | +|------|------|------|--------| +| **Gotify** | 1-3秒 | 自托管,完全控制 | ⭐⭐⭐⭐⭐ | +| **ntfy** | 5-15秒 | 免费,无需注册 | ⭐⭐⭐⭐ | +| **Pushbullet** | 30秒-2分钟 | 设置简单 | ⭐⭐⭐ | +| **其他** | 变化 | Discord、Telegram、Slack 等 80+ 种 | ⭐⭐ | -## 许可证 +## 📱 客户端配置 -MIT License +### iPhone 快捷指令 +详见 [iPhone 配置指南](docs/simple-iphone-setup.md) + +### Android 客户端 +- **Gotify**:[F-Droid](https://f-droid.org/packages/com.github.gotify/) | [GitHub](https://github.com/gotify/android) +- **ntfy**:[Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) | [F-Droid](https://f-droid.org/packages/io.heckel.ntfy/) + +## 🛠️ 管理命令 + +```bash +# 服务管理 +./scripts/docker-manage.sh status # 查看状态 +./scripts/docker-manage.sh logs # 查看日志 +./scripts/docker-manage.sh restart # 重启服务 +./scripts/docker-manage.sh test # 测试通知 + +# 部署管理 +./scripts/deploy.sh # 重新部署 +./scripts/test-docker.sh # 完整测试 +``` + +## 📚 文档 + +- 📖 [部署指南](docs/deployment.md) - 详细的 Docker 部署说明 +- 📱 [iPhone 配置](docs/simple-iphone-setup.md) - 快捷指令设置 +- 🔧 [高级配置](docs/iphone-setup.md) - 完整配置选项 + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 📄 许可证 + +MIT License - 详见 [LICENSE](LICENSE) 文件 diff --git a/docker-compose.yml b/docker-compose.yml index e13ed37..b58f0cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,14 +33,11 @@ services: image: gotify/server container_name: gotify ports: - - "8080:80" + - "24545:80" volumes: - - gotify_data:/app/data + - ./gotify_data:/app/data environment: - GOTIFY_DEFAULTUSER_PASS=admin restart: unless-stopped profiles: - gotify - -volumes: - gotify_data: diff --git a/docs/deployment.md b/docs/deployment.md index c2e75d7..48dd800 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -1,264 +1,351 @@ -# 部署指南 +# SMS Forwarder 部署指南 -本指南介绍如何部署 SMS Forwarder 服务器。 +本指南介绍如何使用 Docker 部署 SMS Forwarder 服务器。 -## 部署方式 +## 推荐部署方式:Docker -### 1. 本地部署 +Docker 部署具有以下优势: +- ✅ 环境一致性,无依赖问题 +- ✅ 一键部署,简单快速 +- ✅ 自动重启和健康检查 +- ✅ 资源隔离和限制 +- ✅ 易于备份和迁移 -#### 环境要求 -- Python 3.10+ -- uv 包管理器 +## 快速开始 -#### 安装步骤 +### 1. 环境要求 + +- Docker 20.10+ +- Docker Compose 2.0+ +- 2GB+ 可用内存 +- 开放端口 12152 + +### 2. 克隆项目 ```bash -# 1. 克隆项目 -git clone -cd notification +git clone https://gitea.nosuchip.de/zack/sms_forwarder.git +cd sms_forwarder +``` -# 2. 安装依赖 -uv sync +### 3. 配置服务 -# 3. 复制配置文件 +```bash +# 复制配置文件模板 cp config.example.yaml config.yaml -# 4. 编辑配置文件 +# 编辑配置文件 nano config.yaml - -# 5. 运行服务器 -uv run sms-forwarder ``` -### 2. Docker 部署 - -#### 创建 Dockerfile - -```dockerfile -FROM python:3.10-slim - -WORKDIR /app - -# 安装 uv -RUN pip install uv - -# 复制项目文件 -COPY . . - -# 安装依赖 -RUN uv sync - -# 创建日志目录 -RUN mkdir -p logs - -# 暴露端口 -EXPOSE 8000 - -# 启动命令 -CMD ["uv", "run", "sms-forwarder"] -``` - -#### 构建和运行 +### 4. 一键部署 ```bash -# 构建镜像 -docker build -t sms-forwarder . - -# 运行容器 -docker run -d \ - --name sms-forwarder \ - -p 8000:8000 \ - -v $(pwd)/config.yaml:/app/config.yaml \ - -v $(pwd)/logs:/app/logs \ - sms-forwarder +# 执行自动部署脚本 +./scripts/deploy.sh ``` -### 3. systemd 服务部署 +部署脚本会自动: +- 检查 Docker 环境 +- 构建应用镜像 +- 启动服务容器 +- 运行健康检查 +- 显示服务信息 -#### 创建服务文件 +## 手动部署步骤 + +如果你不想使用自动部署脚本,可以手动执行以下步骤: + +### 1. 构建镜像 ```bash -sudo nano /etc/systemd/system/sms-forwarder.service +docker build -t sms-forwarder:latest . ``` -```ini -[Unit] -Description=SMS Forwarder Service -After=network.target +### 2. 启动服务 -[Service] -Type=simple -User=your-user -WorkingDirectory=/path/to/sms-forwarder -Environment=PATH=/path/to/sms-forwarder/.venv/bin -ExecStart=/path/to/sms-forwarder/.venv/bin/python -m sms_forwarder.main -Restart=always -RestartSec=10 - -[Install] -WantedBy=multi-user.target +#### 只启动 SMS Forwarder +```bash +docker-compose up -d ``` -#### 启用服务 +#### 同时启动 SMS Forwarder 和 Gotify +```bash +docker-compose --profile gotify up -d +``` + +### 3. 验证部署 ```bash -sudo systemctl daemon-reload -sudo systemctl enable sms-forwarder -sudo systemctl start sms-forwarder -sudo systemctl status sms-forwarder +# 检查容器状态 +docker-compose ps + +# 查看日志 +docker-compose logs -f sms-forwarder + +# 测试健康检查 +curl http://localhost:12152/health ``` -## 配置推送服务 +## 配置说明 -### Pushbullet 配置 +### 核心配置项 -1. 访问 [Pushbullet](https://www.pushbullet.com/) -2. 注册账号并在 Android 设备上安装应用 -3. 获取 Access Token: - - 访问 https://www.pushbullet.com/#settings/account - - 创建 Access Token -4. 在配置文件中添加: - -```yaml -notifications: - services: - - name: "pushbullet" - url: "pbul://your-access-token-here" - enabled: true -``` - -### FCM 配置 - -1. 创建 Firebase 项目 -2. 获取服务器密钥和项目 ID -3. 在 Android 应用中集成 FCM -4. 获取设备 token -5. 配置: - -```yaml -notifications: - services: - - name: "fcm" - url: "fcm://project-id@server-key/device-token" - enabled: true -``` - -### Gotify 配置 - -1. 部署 Gotify 服务器 -2. 创建应用并获取 token -3. 配置: +编辑 `config.yaml` 文件,配置以下关键项: ```yaml +# 服务器配置 +server: + host: "0.0.0.0" + port: 12152 + api_key: "your-secret-api-key" # 必须修改 + +# 通知服务配置 notifications: services: + # Gotify(推荐,低延迟) - name: "gotify" - url: "gotify://your-server.com/app-token" + url: "gotifys://your-domain.com/YOUR_APP_TOKEN" + enabled: true + + # ntfy(备用) + - name: "ntfy" + url: "ntfy://your-unique-topic/" enabled: true ``` -## 安全配置 +### 推送服务选择 -### 1. 生成强 API 密钥 +1. **自建 Gotify**(最推荐) + - 延迟:1-3 秒 + - 完全自主控制 + - 启动方式:`docker-compose --profile gotify up -d` + +2. **ntfy**(简单易用) + - 延迟:5-15 秒 + - 无需自建服务器 + - 在 Android 上安装 ntfy 应用并订阅主题 + +## 服务管理 + +### 使用管理脚本 + +项目提供了便捷的管理脚本: ```bash -# 使用 Python 生成随机密钥 -python -c "import secrets; print(secrets.token_urlsafe(32))" +# 查看所有可用命令 +./scripts/docker-manage.sh help + +# 常用命令 +./scripts/docker-manage.sh status # 查看服务状态 +./scripts/docker-manage.sh logs # 查看实时日志 +./scripts/docker-manage.sh test # 发送测试通知 +./scripts/docker-manage.sh restart # 重启服务 +./scripts/docker-manage.sh stop # 停止服务 ``` -### 2. 配置防火墙 +### 手动管理命令 ```bash -# 只允许特定 IP 访问 -sudo ufw allow from YOUR_IPHONE_IP to any port 8000 +# 查看容器状态 +docker-compose ps + +# 查看日志 +docker-compose logs -f sms-forwarder + +# 重启服务 +docker-compose restart sms-forwarder + +# 停止所有服务 +docker-compose down + +# 重新构建镜像 +docker-compose build --no-cache ``` -### 3. 使用 HTTPS +## 测试部署 -#### 使用 nginx 反向代理 +### 自动测试 -```nginx -server { - listen 443 ssl; - server_name your-domain.com; - - ssl_certificate /path/to/cert.pem; - ssl_certificate_key /path/to/key.pem; - - location / { - proxy_pass http://127.0.0.1:8000; - 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; - } -} +```bash +# 使用测试脚本 +./scripts/test-docker.sh +``` + +### 手动测试 + +```bash +# 1. 健康检查 +curl http://localhost:12152/health + +# 2. 查看服务状态 +curl http://localhost:12152/status + +# 3. 发送测试通知 +curl -X POST "http://localhost:12152/notify/simple" \ + -H "Content-Type: application/json" \ + -d '{ + "api_key": "your-api-key", + "content": "测试通知", + "sender": "测试" + }' +``` + +## 生产环境配置 + +### 1. 安全设置 + +```yaml +# config.yaml +security: + # 限制访问 IP(可选) + allowed_ips: ["192.168.1.100"] # 你的 iPhone IP + # 请求频率限制 + rate_limit: 60 +``` + +### 2. 使用强 API 密钥 + +```bash +# 生成强密钥 +python3 -c "import secrets; print(secrets.token_urlsafe(32))" +``` + +### 3. 反向代理(可选) + +如果需要 HTTPS 或域名访问,可以使用 nginx: + +```bash +# 启动带 nginx 的配置 +docker-compose -f docker-compose.prod.yml --profile nginx up -d ``` ## 监控和维护 -### 1. 日志监控 +### 1. 日志管理 ```bash # 查看实时日志 -tail -f logs/sms_forwarder.log +docker-compose logs -f sms-forwarder + +# 查看最近 100 行日志 +docker-compose logs --tail=100 sms-forwarder # 查看错误日志 -grep ERROR logs/sms_forwarder.log +docker-compose logs sms-forwarder | grep ERROR ``` -### 2. 健康检查 +### 2. 资源监控 ```bash -# 检查服务状态 -curl http://localhost:8000/health +# 查看容器资源使用 +docker stats sms-forwarder --no-stream -# 检查系统状态 -curl http://localhost:8000/status +# 查看详细信息 +./scripts/docker-manage.sh stats ``` -### 3. 性能监控 - -可以使用以下工具监控服务器性能: -- Prometheus + Grafana -- htop / top -- systemd journal - -### 4. 备份配置 +### 3. 数据备份 ```bash -# 定期备份配置文件 -cp config.yaml config.yaml.backup.$(date +%Y%m%d) +# 备份配置和数据 +tar -czf sms_forwarder_backup_$(date +%Y%m%d).tar.gz \ + config.yaml logs/ data/ gotify_data/ + +# 恢复备份 +tar -xzf sms_forwarder_backup_20240117.tar.gz ``` ## 故障排除 ### 常见问题 -1. **服务启动失败** - - 检查配置文件语法 - - 确认端口未被占用 - - 查看详细错误日志 +1. **容器启动失败** + ```bash + # 查看详细错误信息 + docker-compose logs sms-forwarder -2. **通知发送失败** - - 验证推送服务配置 - - 检查网络连接 - - 确认 API 密钥有效 + # 检查配置文件 + docker-compose config + ``` -3. **高内存使用** - - 检查日志文件大小 - - 考虑添加日志轮转 - - 监控请求频率 +2. **端口被占用** + ```bash + # 检查端口占用 + netstat -tlnp | grep 12152 -### 调试命令 + # 修改端口(在 docker-compose.yml 中) + ports: + - "12153:12152" # 使用不同的外部端口 + ``` + +3. **通知发送失败** + ```bash + # 检查服务状态 + curl http://localhost:12152/status + + # 查看详细日志 + docker-compose logs -f sms-forwarder + + # 测试网络连接 + docker-compose exec sms-forwarder curl -I https://ntfy.sh + ``` + +4. **配置文件问题** + ```bash + # 验证 YAML 语法 + python3 -c "import yaml; yaml.safe_load(open('config.yaml'))" + + # 重新生成配置 + cp config.example.yaml config.yaml + ``` + +### 性能优化 + +1. **资源限制调整** + ```yaml + # docker-compose.yml + deploy: + resources: + limits: + memory: 512M # 增加内存限制 + cpus: '1.0' # 增加 CPU 限制 + ``` + +2. **日志轮转** + ```yaml + # docker-compose.yml + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + ``` + +## 更新和维护 + +### 更新应用 ```bash -# 检查端口占用 -netstat -tlnp | grep 8000 +# 1. 拉取最新代码 +git pull -# 检查进程状态 -ps aux | grep sms-forwarder +# 2. 重新构建和部署 +./scripts/deploy.sh -# 测试配置文件 -uv run python -c "from sms_forwarder.config import get_config; print(get_config())" +# 或手动更新 +docker-compose build --no-cache +docker-compose up -d +``` + +### 定期维护 + +```bash +# 清理未使用的 Docker 资源 +docker system prune -f + +# 查看磁盘使用 +du -sh logs/ data/ gotify_data/ + +# 备份重要数据 +./scripts/backup.sh # 如果有备份脚本 ``` diff --git a/docs/docker-quickstart.md b/docs/docker-quickstart.md new file mode 100644 index 0000000..c06fa25 --- /dev/null +++ b/docs/docker-quickstart.md @@ -0,0 +1,222 @@ +# Docker 快速开始指南 + +本指南将帮助你在 5 分钟内使用 Docker 部署 SMS Forwarder。 + +## 🎯 目标 + +- ✅ 在 VPS 上部署 SMS Forwarder +- ✅ 配置推送服务(Gotify 或 ntfy) +- ✅ 设置 iPhone 快捷指令 +- ✅ 实现短信自动转发 + +## 📋 前提条件 + +- VPS 服务器(1GB+ 内存) +- Docker 和 Docker Compose +- 域名(可选,用于 HTTPS) + +## 🚀 部署步骤 + +### 1. 克隆项目 + +```bash +# SSH 到你的 VPS +ssh user@your-vps + +# 克隆项目 +git clone https://gitea.nosuchip.de/zack/sms_forwarder.git +cd sms_forwarder +``` + +### 2. 配置服务 + +```bash +# 复制配置文件 +cp config.example.yaml config.yaml + +# 编辑配置 +nano config.yaml +``` + +**必须修改的配置项**: + +```yaml +server: + api_key: "your-secret-api-key-here" # 生成强密钥 + +notifications: + services: + # 选择一种推送方式 + - name: "ntfy" + url: "ntfy://your-unique-topic-name/" + enabled: true +``` + +### 3. 生成 API 密钥 + +```bash +# 生成强密钥 +python3 -c "import secrets; print(secrets.token_urlsafe(32))" +``` + +将生成的密钥填入 `config.yaml` 的 `server.api_key` 字段。 + +### 4. 选择推送方式 + +#### 方案 A:使用 ntfy(推荐新手) + +```yaml +notifications: + services: + - name: "ntfy" + url: "ntfy://sms-forward-$(whoami)-$(date +%s)/" + enabled: true +``` + +在 Android 设备上: +1. 安装 ntfy 应用 +2. 订阅主题:`sms-forward-$(whoami)-$(date +%s)` + +#### 方案 B:自建 Gotify(推荐进阶) + +```bash +# 启动 SMS Forwarder + Gotify +docker-compose --profile gotify up -d +``` + +然后: +1. 访问 `http://your-vps:24545` +2. 登录(admin/admin) +3. 创建应用获取 Token +4. 更新配置文件中的 Gotify URL + +### 5. 部署服务 + +```bash +# 一键部署 +./scripts/deploy.sh +``` + +或手动部署: + +```bash +# 构建并启动 +docker-compose up -d + +# 查看状态 +docker-compose ps +``` + +### 6. 测试部署 + +```bash +# 运行测试 +./scripts/test-docker.sh +``` + +如果测试通过,你应该在 Android 设备上收到测试通知。 + +## 📱 配置 iPhone + +### 1. 创建快捷指令 + +1. 打开 iPhone "快捷指令" 应用 +2. 点击 "+" 创建新快捷指令 +3. 添加 "获取我的快捷指令的输入" 动作 +4. 添加 "获取 URL 内容" 动作 + +### 2. 配置 HTTP 请求 + +- **URL**: `http://your-vps:12152/notify/simple` +- **方法**: POST +- **请求体**: JSON +- **标头**: `Content-Type: application/json` + +**请求体内容**: +```json +{ + "api_key": "your-api-key-here", + "content": "快捷指令输入" +} +``` + +### 3. 设置自动化 + +1. 点击 "自动化" → "+" +2. 选择 "收到信息时" +3. 选择 "任何人" 或特定联系人 +4. 选择你创建的快捷指令 +5. 关闭 "运行前询问" + +## 🔧 管理和维护 + +### 常用命令 + +```bash +# 查看服务状态 +./scripts/docker-manage.sh status + +# 查看实时日志 +./scripts/docker-manage.sh logs + +# 重启服务 +./scripts/docker-manage.sh restart + +# 发送测试通知 +./scripts/docker-manage.sh test +``` + +### 更新服务 + +```bash +# 拉取最新代码 +git pull + +# 重新部署 +./scripts/deploy.sh +``` + +## 🛡️ 安全建议 + +1. **使用强 API 密钥** +2. **限制访问 IP**(在 config.yaml 中配置) +3. **使用 HTTPS**(配置域名和 SSL 证书) +4. **定期备份配置** + +## 🆘 故障排除 + +### 服务无法启动 + +```bash +# 查看错误日志 +docker-compose logs sms-forwarder + +# 检查配置文件 +docker-compose config +``` + +### 通知发送失败 + +```bash +# 检查网络连接 +docker-compose exec sms-forwarder curl -I https://ntfy.sh + +# 验证配置 +curl http://localhost:12152/status +``` + +### iPhone 快捷指令不工作 + +1. 检查网络连接 +2. 确认 API 密钥正确 +3. 查看服务器日志 +4. 测试 API 端点 + +## 🎉 完成 + +如果一切正常,你现在应该能够: +- ✅ 在 iPhone 上收到短信时自动触发快捷指令 +- ✅ 快捷指令将短信内容发送到你的服务器 +- ✅ 服务器将通知推送到你的 Android 设备 + +享受你的短信转发服务吧!🎊