diff --git a/.github/workflows/build-daily-book.yml b/.github/workflows/build-daily-book.yml new file mode 100644 index 0000000..d78cb63 --- /dev/null +++ b/.github/workflows/build-daily-book.yml @@ -0,0 +1,131 @@ +name: Build Daily Journal with mdBook + +on: + # 每天UTC时间8点自动触发 (对应北京时间下午4点) + # 如果需要北京时间早上8点,请设置为 0 0 * * * + schedule: + # 这里的 cron 表示每5分钟执行一次,用于测试。 + # 如果要实现 “每天UTC时间8点” ,应改为 '0 8 * * *' + - cron: 0 0 * * * + + # 手动触发 + workflow_dispatch: + +jobs: + build-book: + runs-on: ubuntu-latest + + env: + IMAGE_PROXY_URL: ${{ vars.IMAGE_PROXY_URL }} # 从仓库变量中读取 + + # 需要写入权限来提交生成的文件 + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + # 明确指定要检出的分支 + ref: 'book' # <-- (3) 请将 'main' 替换为你的目标分支名 + + - name: Install mdBook + run: | + mkdir -p $HOME/.cargo/bin + export PATH=$HOME/.cargo/bin:$PATH + curl -sL https://github.com/rust-lang/mdBook/releases/download/v0.4.51/mdbook-v0.4.51-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C $HOME/.cargo/bin + + - name: Replace image URLs in daily notes + run: | + echo "开始替换 daily/ 目录下的 Markdown 文件内容..." + echo "使用的代理前缀: ${{ env.IMAGE_PROXY_URL }}" # 在日志中打印变量以供调试 + # 使用 find 和 sed 高效地批量替换 + # -exec sed ... {} + 会将所有找到的文件传递给一个 sed 命令,效率更高 + # 使用 `|` 作为 sed 的分隔符,以避免与 URL 中的 `/`冲突 + find daily -type f -name "*.md" -exec sed -i \ + -e 's|upload.chinaz.com|pic.chinaz.com|g' \ + -e 's|https://pic.chinaz.com|${{ env.IMAGE_PROXY_URL }}https://pic.chinaz.com|g' {} + + echo "URL 替换完成。" + + - name: Generate SUMMARY.md + id: generate_summary + run: | + # 确保 src 目录存在 + mkdir -p src + # 复制daily到目标目录 + cp -r daily/ src/ + # 定义 SUMMARY.md 的路径 + SUMMARY_FILE="src/SUMMARY.md" + + # 查找最新的日刊文件 + LATEST_DAILY_FILE=$(ls -1 daily/*.md | sort -r | head -n 1) + + if [ -z "$LATEST_DAILY_FILE" ]; then + echo "错误:在 'daily' 目录中没有找到任何 .md 文件。" + exit 1 + fi + + # 获取最新日刊的文件名,例如 2025-06-12.md + LATEST_FILENAME=$(basename "$LATEST_DAILY_FILE") + + # 将最新的日刊复制到 src 目录,作为 "Today" 页面 + cp "$LATEST_DAILY_FILE" "src/$LATEST_FILENAME" + + # 开始写入 SUMMARY.md + echo "# Summary" > "$SUMMARY_FILE" + echo "" >> "$SUMMARY_FILE" + echo "[Today]($LATEST_FILENAME)" >> "$SUMMARY_FILE" + echo "" >> "$SUMMARY_FILE" + + # --- 生成按月分组的列表 --- + current_month="" + # 反向排序文件列表,实现日期从新到旧 + for file in $(ls -1 daily/*.md | sort -r); do + # 从文件名 'daily/YYYY-MM-DD.md' 中提取月份 'YYYY-MM' + month=$(echo "$file" | cut -d'/' -f2 | cut -d'-' -f1,2) + + # 如果是新的月份,则添加一个月份标题 + if [ "$month" != "$current_month" ]; then + echo "# $month" >> "$SUMMARY_FILE" + current_month=$month + fi + + # 提取链接标题 'MM-DD' + link_title=$(echo "$file" | cut -d'/' -f2 | cut -d'.' -f1 | cut -d'-' -f2,3) + + # 写入日刊条目 + echo "- [${link_title}-日刊]($file)" >> "$SUMMARY_FILE" + done + + echo "SUMMARY.md 已成功生成。" + cat "$SUMMARY_FILE" # 在日志中打印生成的内容以供调试 + + - name: Build the book + run: | + mdbook build + + - name: Organize output files + run: | + # 清理旧的 today 目录(如果存在),以防万一 + rm -rf today + # 创建 today 目录并将构建产物移入 + mkdir -p today + mv book today/ + + - name: Commit and push changes + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + + # 添加所有新生成或修改的文件 + # 包括 src/SUMMARY.md, src/YYYY-MM-DD.md 和 today/book/ 目录 + git add src/SUMMARY.md today/book + + # 检查是否有文件变更 + if git diff --staged --quiet; then + echo "没有文件变更,无需提交。" + else + echo "检测到文件变更,正在提交..." + git commit -m "docs: 自动构建日刊书籍 (`date -u`)" + git push + fi diff --git a/README.md b/README.md index 76d0693..0dc5976 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ AI 或许能模仿你过去的喜好,却难以捕捉你此刻的灵感与洞见。 -`手动勾选`这一步,正是为了保留这份属于“人”的、不断演进的独特视角。它确保了日报的灵魂`你的思想和判断力`,始终贯穿其中,让每一份日报都成为你当日思考的真实快照。 +`手动勾选`这一步,正是为了保留这份属于“人”的、不断演进的独特视角。它确保了日报的灵魂-`你的思想和判断力`,始终贯穿其中,让每一份日报都成为你当日思考的真实快照。 当然,我们也完全支持并欢迎社区开发者探索全自动化的实现方式。如果你有更棒的想法,请随时提交 Pull Request! diff --git a/book.toml b/book.toml new file mode 100644 index 0000000..b8648e9 --- /dev/null +++ b/book.toml @@ -0,0 +1,9 @@ +[book] +authors = [] +language = "zh" +src = "src" +title = "By 何夕2077" +create-missing = true + +[output.html] +git-repository-url = "https://github.com/justlovemaki/CloudFlare-AI-Insight-Daily" # 替换成你的仓库地址 diff --git a/cron-docker/Dockerfile b/cron-docker/Dockerfile index 198a948..7b4f02a 100644 --- a/cron-docker/Dockerfile +++ b/cron-docker/Dockerfile @@ -62,7 +62,7 @@ CMD ["crond", "-f", "-l", "8"] # 构建镜像命令 docker build -t ai-daily-cron-job . -# 启动容器命令 docker run -d --name ai-daily-cron ai-daily-cron-job +# 启动容器命令 docker run -d --name ai-daily-cron -p 4399:4399 --restart always ai-daily-cron-job # 调试容器命令 docker run -it --rm --entrypoint /bin/sh ai-daily-cron-job # 调试生成脚本 /app/scripts/build.sh /app/scripts/work # 进容器调试 docker exec -it ai-daily-cron /bin/sh diff --git a/cron-docker/entrypoint.sh b/cron-docker/entrypoint.sh index fd5cec5..db16f88 100644 --- a/cron-docker/entrypoint.sh +++ b/cron-docker/entrypoint.sh @@ -15,6 +15,8 @@ fi echo "执行首次构建..." /app/scripts/build.sh /app/scripts/work +mdbook serve --open -p 4399 -n 0.0.0.0 /app/scripts/work & + echo "--- 初始化完成,启动 cron 服务 ---" # 2. 执行 Dockerfile CMD 中定义的命令 (即 "crond -f -l 8") diff --git a/cron-docker/scripts/build.sh b/cron-docker/scripts/build.sh index fb233cd..75ffcba 100644 --- a/cron-docker/scripts/build.sh +++ b/cron-docker/scripts/build.sh @@ -38,7 +38,7 @@ rm -rf "$REPO_NAME" # 4. Fetch: Clone the latest content from GitHub. echo "--> Cloning repository from $REPO_URL..." -git clone "$REPO_URL" +git clone -b book "$REPO_URL" # Define the path to the cloned repository for easier access. PROJECT_DIR="$WORK_DIR/$REPO_NAME" @@ -58,21 +58,21 @@ rm -rf "$PROJECT_DIR/podcast" echo "--> Running custom scripts..." ./replace.sh "$PROJECT_DIR/daily" ./gen.sh "$PROJECT_DIR/daily" -mdbook build "$WORK_DIR" +# mdbook build "$WORK_DIR" # 6. Package & Upload echo "--> Waiting for generation to complete..." # This pause assumes the generation script might have background tasks. # A more robust solution would be to wait for a specific file or process. -sleep 10 +# sleep 10 echo "--> Packaging the 'book' directory..." # Create a gzipped tar archive of the 'book' directory's contents. -tar -cvf archive.tar.gz book/* +# tar -cvf archive.tar.gz book/* echo "--> Uploading the archive..." # Upload the archive using a custom script. # Note: Ensure github.sh is in the $WORK_DIR or in your PATH. -./github.sh upload "archive.tar.gz" "today/archive.tar.gz" "pushbook" +# ./github.sh upload "archive.tar.gz" "today/archive.tar.gz" "pushbook" echo "--- Workflow completed successfully! ---" \ No newline at end of file diff --git a/cron-docker/scripts/work/book.toml b/cron-docker/scripts/work/book.toml index 0c5830d..d9a8e6e 100644 --- a/cron-docker/scripts/work/book.toml +++ b/cron-docker/scripts/work/book.toml @@ -3,4 +3,7 @@ authors = [] language = "zh" src = "CloudFlare-AI-Insight-Daily" title = "By 何夕2077" -create-missing = true \ No newline at end of file +create-missing = true + +[output.html] +git-repository-url = "https://github.com/justlovemaki/CloudFlare-AI-Insight-Daily" # 替换成你的仓库地址 \ No newline at end of file diff --git a/cron-docker/scripts/work/github.sh b/cron-docker/scripts/work/github.sh index 08f6b52..6e9db11 100644 --- a/cron-docker/scripts/work/github.sh +++ b/cron-docker/scripts/work/github.sh @@ -6,7 +6,7 @@ GITHUB_TOKEN=${GITHUB_TOKEN} # 替换 YOUR_GITHUB_PAT 或设置环境变量 OWNER=${OWNER} # 你的 GitHub 用户名或组织名 REPO=${REPO_NAME} # 你的仓库名称 -BRANCH="main" # 目标分支 (可能是 main, master 等) +BRANCH="book" # 目标分支 (可能是 main, master 等) set -e # 如果任何命令失败,脚本将退出 set -o pipefail # 如果管道中的任何命令失败,则整个管道失败 diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 306b3be..65cca21 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -145,30 +145,83 @@ TWITTER_FETCH_PAGES = "2" ``` 部署成功后,Wrangler 会返回一个公开的 `*.workers.dev` 域名,您的 AI 洞察日报服务已在线上运行! -### 🗓️ 定时生成 Pages 站点 (可选) +### 🗓️ 定时生成日报站点 (可选) -如果您希望将每日报告自动发布为 GitHub Pages 静态网站,可以按照以下步骤配置一个 Docker 定时任务。 +#### 方案一:🌐 使用 GitHub Actions 自动部署 (推荐) -1. **前提条件**: 确保您的目标 GitHub 仓库已开启 GitHub Actions 和 GitHub Pages 功能。仓库中应包含 `unzip_and_commit.yml` 工作流文件。 +此方案利用 GitHub 的免费资源,实现全自动、零成本的日报站点部署,是大多数用户的首选。 -2. **修改配置**: 进入 `cron-docker` 目录。 - * 编辑 `Dockerfile`,修改 `ENV` 部分为您自己的仓库信息和可选的图片代理地址。 - * 编辑 `scripts/work/book.toml`,修改 `title` 和 `src` 路径。 - * (可选) 修改 `Dockerfile` 中的 cron 表达式以自定义每日执行时间。 +> **📌 前置要求**: +> * 您的目标 GitHub 仓库已开通 GitHub Actions 功能。 +> * 在仓库的 `Settings` -> `Pages` 中,选择 `GitHub Actions` 作为部署源 (Source)。 +> * 确保 `.github/workflows/` 目录下已包含 `build-daily-book.yml` 等工作流文件。 + +##### 部署步骤 + +1. **🔧 配置工作流文件** + * 打开 `.github/workflows/build-daily-book.yml` 文件,找到所有涉及到 `book` 分支的地方,将其修改为您计划用于存放日报站点的分支名称(例如 `gh-pages`)。 + * (可选) 修改文件顶部的定时任务时间,以自定义每日执行时间 + +2. **🔧 调整mdbook配置文件** + * 打开 `book.toml`文件, + * 修改 `title` 为您的日报站点标题。 + * 修改 `git-repository-url` 为您的 GitHub 仓库地址。 + +3. **💡 (可选) 配置图片代理** + 如果遇到部署后图片无法显示的问题,可以配置一个图片代理来解决。 + * 在您的 GitHub 仓库页面,进入 `Settings` -> `Secrets and variables` -> `Actions`。 + * 在 `Variables` 标签页,点击 `New repository variable`。 + * 创建一个名为 `IMAGE_PROXY_URL` 的变量,值为您的代理服务地址,例如 `https://your-proxy.com/`。 + +4. **🚀 触发 Action 并验证** + * 手动触发一次 `build-daily-book` 工作流,或等待其定时自动执行。 + * 任务成功后,稍等片刻,即可通过您的 GitHub Pages 地址访问。 + * 访问地址格式通常为:`https://<你的用户名>.github.io/<你的仓库名>/today/book/` + +--- + +#### 方案二:🐳 使用 Docker 进行本地或服务器部署 + +此方案适合希望将日报站点部署在自己服务器或本地环境的用户,拥有更高的控制权。 + +##### 部署步骤 + +1. **📝 修改配置文件** + 在 `cron-docker` 目录下,您需要根据自己的情况修改以下文件: + + * **`Dockerfile`**: + * 修改 GITHUB相关变量 为您自己的 GitHub 仓库地址。 + * (可选) 修改 `ENV IMAGE_PROXY_URL` 为您的图片代理地址。 + * (可选) 修改第6步的 `cron` 表达式,以自定义每日执行时间 (默认为 UTC 时间)。 + + * **`修改默认分支`**: + * 打开`scripts/build.sh`,修改第四步git clone -b book "$REPO_URL",调整为你的分支 + * 打开`scripts/work/github.sh`,修改BRANCH="book",调整为你的分支 + + * **`scripts/work/book.toml`**: + * 修改 `title` 为您的日报站点标题。 + * 修改 `git-repository-url` 为您的 GitHub 仓库地址。 + +2. **🛠️ 构建并运行 Docker 容器** + 在您的终端中执行以下命令: -3. **构建并运行 Docker 容器**: ```bash # 进入 cron-docker 目录 cd cron-docker - # 构建 Docker 镜像 + # 构建 Docker 镜像,并命名为 ai-daily-cron-job docker build -t ai-daily-cron-job . - # 在后台启动容器 - docker run -d --name ai-daily-cron ai-daily-cron-job + # 在后台以守护进程模式 (-d) 启动容器 + docker run -d --name ai-daily-cron -p 4399:4399 --restart always ai-daily-cron-job ``` + > **提示**:`-p 4399:80` 命令会将容器的 80 端口映射到主机的 4399 端口,您可以根据需要修改主机端口。 -4. **验证部署**: 定时任务触发后,会自动生成内容并推送到您的仓库。稍等片刻,即可通过您的 GitHub Pages 地址(例如 `https://.github.io//today/book/`)访问生成的日报。 +3. **✅ 验证部署** + 打开浏览器,访问 `http://127.0.0.1:4399`。如果能看到生成的日报站点,则表示本地部署成功。 + +4. **🌐 (可选) 配置公网访问** + 如果您需要让外网也能访问到这个站点,可以将您的服务器端口暴露到公网。推荐使用 [Cloudflare Tunnels](https://www.cloudflare.com/products/tunnel/) 等工具,可以安全、便捷地实现内网穿透。 ### ❓ F.A.Q