257 lines
5.7 KiB
Markdown
257 lines
5.7 KiB
Markdown
# Debian Docker 部署说明
|
||
|
||
这份文档说明如何把 Daily News for Markyan04 部署到你的个人 Debian 服务器上,通过 Docker Compose 每天早上自动生成并发送日报。
|
||
|
||
## 部署目标
|
||
|
||
每天早上 08:00,按 `Asia/Shanghai` 时区执行:
|
||
|
||
```text
|
||
采集新闻 -> 生成中文日报 -> 归档到 newspaper/ -> 发送到 markyan04@163.com
|
||
```
|
||
|
||
收件人已经在 `config/delivery.yaml` 中配置为:
|
||
|
||
```text
|
||
markyan04@163.com
|
||
```
|
||
|
||
## 服务器前置条件
|
||
|
||
服务器需要安装 Docker 和 Docker Compose plugin。
|
||
|
||
Debian 常见安装方式:
|
||
|
||
```bash
|
||
sudo apt-get update
|
||
sudo apt-get install -y ca-certificates curl gnupg
|
||
sudo install -m 0755 -d /etc/apt/keyrings
|
||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
sudo apt-get update
|
||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||
```
|
||
|
||
如果希望当前用户直接运行 Docker,可以执行:
|
||
|
||
```bash
|
||
sudo usermod -aG docker "$USER"
|
||
```
|
||
|
||
执行后需要退出 SSH 并重新登录,用户组才会生效。
|
||
|
||
## 复制仓库到服务器
|
||
|
||
建议放到 `/srv/apps/newspaper`:
|
||
|
||
```bash
|
||
sudo mkdir -p /srv/apps/newspaper
|
||
sudo chown -R "$USER":"$USER" /srv/apps/newspaper
|
||
rsync -av --exclude .env /path/to/Newspaper/ /srv/apps/newspaper/
|
||
cd /srv/apps/newspaper
|
||
```
|
||
|
||
如果你用 `scp`、`git clone` 或 Synology 同步目录,也可以,只要最终目录结构完整即可。
|
||
|
||
## 创建 `.env`
|
||
|
||
复制模板:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
nano .env
|
||
```
|
||
|
||
填写:
|
||
|
||
```text
|
||
DEEPSEEK_API_KEY=你的 DeepSeek API Key
|
||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
DEEPSEEK_MODEL=deepseek-v4-pro
|
||
GITHUB_TOKEN=可选,GitHub 只读 token,用于提高开源项目搜索限额
|
||
|
||
NEWSPAPER_SMTP_HOST=smtp.163.com
|
||
NEWSPAPER_SMTP_PORT=465
|
||
NEWSPAPER_SMTP_USERNAME=你的发件邮箱
|
||
NEWSPAPER_SMTP_PASSWORD=你的邮箱授权码
|
||
NEWSPAPER_FROM_EMAIL=你的发件邮箱
|
||
NEWSPAPER_FROM_NAME=Daily News for Markyan04
|
||
NEWSPAPER_SMTP_SECURITY=ssl
|
||
|
||
NEWSPAPER_SCHEDULE_TIME=08:00
|
||
TZ=Asia/Shanghai
|
||
```
|
||
|
||
注意:
|
||
|
||
- 如果使用 163 邮箱发件,需要在邮箱设置中开启 SMTP/IMAP 服务。
|
||
- `GITHUB_TOKEN` 可以留空;如果 GitHub / 开源项目栏目经常空白,建议填一个只读 token。
|
||
- `NEWSPAPER_SMTP_PASSWORD` 应填写邮箱授权码,不是网页登录密码。
|
||
- 如果使用其他邮箱或邮件服务商,请按服务商文档替换 SMTP host、port 和 security。
|
||
- 不要把 `.env` 提交到仓库,也不要把授权码发到聊天里。
|
||
|
||
## 构建镜像
|
||
|
||
```bash
|
||
docker compose build
|
||
```
|
||
|
||
## 检查配置
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily check-config
|
||
```
|
||
|
||
期望输出:
|
||
|
||
```text
|
||
config/newspaper.yaml: OK
|
||
config/sources.yaml: OK
|
||
config/delivery.yaml: OK
|
||
newspaper archive: newspaper/
|
||
```
|
||
|
||
## 只生成日报,不发送
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily generate
|
||
```
|
||
|
||
检查归档目录:
|
||
|
||
```bash
|
||
ls -lh newspaper/
|
||
```
|
||
|
||
应该看到:
|
||
|
||
```text
|
||
YYYY-MM-DD-daily-news-for-markyan04.md
|
||
YYYY-MM-DD-daily-news-for-markyan04.html
|
||
YYYY-MM-DD-daily-news-for-markyan04.meta.json
|
||
```
|
||
|
||
建议第一次先打开 `.md` 或 `.html` 检查:
|
||
|
||
- 正文是否为中文。
|
||
- 每条新闻是否有来源链接。
|
||
- 新闻是否带有发布时间、更新时间或采集时间。
|
||
- AI 栏目是否是新鲜内容,而不是旧概念拼贴。
|
||
- 传统新闻是否覆盖了真实的新进展,而不是泛泛复述旧背景。
|
||
|
||
## 发送已生成的日报
|
||
|
||
如果你已经生成了某一天的日报,可以单独发送:
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily send --date YYYY-MM-DD
|
||
```
|
||
|
||
例如:
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily send --date 2026-07-04
|
||
```
|
||
|
||
## 生成并发送一次
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily run
|
||
```
|
||
|
||
这个命令会完成:
|
||
|
||
```text
|
||
采集 -> 生成 -> 归档 -> 发送
|
||
```
|
||
|
||
## 启动每日定时任务
|
||
|
||
```bash
|
||
docker compose up -d scheduler
|
||
```
|
||
|
||
查看日志:
|
||
|
||
```bash
|
||
docker compose logs -f scheduler
|
||
```
|
||
|
||
`scheduler` 服务会常驻运行,每天本地时间 08:00 执行一次。
|
||
|
||
## 停止每日定时任务
|
||
|
||
```bash
|
||
docker compose down
|
||
```
|
||
|
||
## 可选方案:使用 Debian 主机 cron
|
||
|
||
如果你不想让 `scheduler` 容器常驻,也可以用 Debian 主机的 cron。
|
||
|
||
先创建日志目录:
|
||
|
||
```bash
|
||
mkdir -p /srv/apps/newspaper/logs
|
||
```
|
||
|
||
编辑 crontab:
|
||
|
||
```bash
|
||
crontab -e
|
||
```
|
||
|
||
加入:
|
||
|
||
```text
|
||
0 8 * * * cd /srv/apps/newspaper && docker compose run --rm newspaper hongyu-daily run >> logs/cron.log 2>&1
|
||
```
|
||
|
||
注意:不要同时启用主机 cron 和 `scheduler` 容器,否则每天可能会重复发送。
|
||
|
||
## 更新部署
|
||
|
||
当你把新代码复制到服务器后:
|
||
|
||
```bash
|
||
cd /srv/apps/newspaper
|
||
docker compose build
|
||
docker compose up -d scheduler
|
||
```
|
||
|
||
如果只想手动跑一次:
|
||
|
||
```bash
|
||
docker compose run --rm newspaper hongyu-daily run
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
### Docker 构建失败
|
||
|
||
先确认服务器能访问 Python 包源和 Debian 软件源。
|
||
|
||
```bash
|
||
docker compose build --no-cache
|
||
```
|
||
|
||
### 邮件发送失败
|
||
|
||
优先检查:
|
||
|
||
- SMTP host 和 port 是否正确。
|
||
- `NEWSPAPER_SMTP_SECURITY` 是否应为 `ssl` 或 `starttls`。
|
||
- 邮箱是否开启 SMTP/IMAP。
|
||
- `NEWSPAPER_SMTP_PASSWORD` 是否是授权码。
|
||
- 服务器是否允许连接 SMTP 端口。
|
||
|
||
### 生成日报失败
|
||
|
||
优先检查:
|
||
|
||
- `DEEPSEEK_API_KEY` 是否正确。
|
||
- DeepSeek API 账户是否有额度。
|
||
- 服务器是否能访问 `https://api.deepseek.com`。
|
||
- `config/sources.yaml` 中的来源是否大面积无法访问。
|