diff --git a/.github/workflows/deploy-blog.yml b/.github/workflows/deploy-blog.yml deleted file mode 100644 index 47a3b31..0000000 --- a/.github/workflows/deploy-blog.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Deploy Hugo Blog - -on: - schedule: - - cron: '0 6 * * *' # 每天早上 6 点(UTC)执行一次 - push: - branches: - - main # 当 main 分支有新提交时执行 - -jobs: - build: - # 使用默认环境,并在最新的 Ubuntu 系统上运行 - environment: default - runs-on: ubuntu-latest - - steps: - # 1. 克隆当前博客仓库代码(包含完整历史记录) - - name: 克隆当前博客仓库 - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - # 2. 安装 Hugo 静态站点生成器(extended 版本支持 Sass/SCSS 等扩展功能) - - name: 安装 Hugo - uses: peaceiris/actions-hugo@v3 - with: - hugo-version: '0.145.0' - extended: true - - # 3. 克隆私有 wiki 仓库,作为博客内容的来源 - - name: 克隆私有 wiki 仓库 - run: | - # 遇到错误立即退出,并确保管道中任一命令失败时退出 - set -eo pipefail - # 清除旧的 wiki 临时目录,避免残留影响 - rm -rf /tmp/wiki - # 使用 secrets 中存储的认证信息从私有仓库克隆 wiki 到 /tmp/wiki - git clone https://${{ secrets.GITEA_REPO_READ }}@git.7wate.org/zhouzhongping/wiki.git /tmp/wiki - - # 4. 将 wiki 中的博客内容拷贝到 Hugo 的 content/posts 目录中 - - name: 拷贝 wiki 内容到 content/posts - run: | - set -eo pipefail - WIKI_BLOG_DIR="/tmp/wiki/Personal/Blog" - TARGET_DIR="content/posts" - if [ -d "$WIKI_BLOG_DIR" ]; then - cp -r "$WIKI_BLOG_DIR"/* "$TARGET_DIR"/ || { echo "拷贝失败"; exit 1; } - else - echo "目录 $WIKI_BLOG_DIR 不存在,拷贝失败" - exit 1 - fi - - # 5. 使用 Hugo 构建静态站点,并启用资源压缩优化 - - name: 构建 Hugo 静态站点 - run: | - set -eo pipefail - hugo --minify - - # 6. 使用 gh-pages Action 将生成的静态站点部署到指定分支(此处为 html 分支) - - name: 部署站点到 gh-pages 分支 - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_branch: html - publish_dir: ./public \ No newline at end of file diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 0000000..85bcd97 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,53 @@ +name: Deploy Hugo to GitHub Pages + +on: + schedule: + - cron: "0 22 * * *" + push: + branches: + - main + +concurrency: + group: deploy-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + environment: production + env: + TZ: Asia/Shanghai + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Hugo + uses: peaceiris/actions-hugo@v3 + with: + hugo-version: '0.147.0' + extended: true + + - name: Clone private wiki repository + run: | + rm -rf /tmp/wiki && git clone "${{ secrets.GITEA_REPO_CLONE }}" /tmp/wiki + if [ -d "/tmp/wiki/Personal/Blog" ]; then + cp -r /tmp/wiki/Personal/Blog/* content/posts/ || exit 1 + else + echo "Wiki content not found" + exit 1 + fi + + - name: Build Hugo site + run: hugo --minify + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public + cname: zopiya.com + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' diff --git a/content/about.md b/content/about.md index 8a37853..da9ec78 100644 --- a/content/about.md +++ b/content/about.md @@ -23,7 +23,7 @@ layout: "about" 博客不设评论区,短期内也暂无开放计划。 -但如果你有什么想说的,欢迎通过邮件联系:[zhouzhongping@7wate.com](mailto:zhouzhongping@7wate.com) +但如果你有什么想说的,欢迎通过邮件联系:[i@zopiya.com](mailto:i@zopiya.com) 你也可以使用 Delta Chat 与我匿名通信:[点此扫码加好友](https://static.7wate.com/2025/03/26/bf7226c87704f.png) diff --git a/hugo.toml b/hugo.toml index e39d099..fbfa748 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,131 +1,181 @@ -# 网站基本信息 -baseURL = "https://blog.7wate.com/" -languageCode = "zh-cn" -title = "向阳而生" -theme = "typo" -defaultContentLanguage = "zh-cn" -hasCJKLanguage = true -enableEmoji = true -canonifyURLs = true +#──────────────────────────────────────────── +# 1. 全局基础设置 +#──────────────────────────────────────────── +# baseURL = "https://zopiya.com/" +languageCode = "zh" +title = "向阳而生" +theme = "typo" +defaultContentLanguage = "zh" +hasCJKLanguage = true +enableEmoji = true +canonifyURLs = true +timeout = "300s" +enableRobotsTXT = true -# 构建性能 -timeout = "300s" +#──────────────────────────────────────────── +# 2. 模块化(可选,推荐 Hugo Modules 管理主题) +#──────────────────────────────────────────── +# [module] +# [[module.imports]] +# path = "github.com/7wate/typo" -# 永久链接结构 +#──────────────────────────────────────────── +# 3. URL 与国际化 +#──────────────────────────────────────────── [permalinks] posts = ":slug/" -# 自定义分类标签 +# 如果未来要做多语言,这里可启用 +# enableMultilingual = true +# [languages] +# [languages.zh] +# languageName = "中文" +# weight = 1 +# [languages.en] +# languageName = "English" +# weight = 2 + +#──────────────────────────────────────────── +# 4. 自定义分类、标签、系列 +#──────────────────────────────────────────── [taxonomies] - tag = "tags" - category = "categories" - series = "series" + tag = "tags" + category = "categories" + series = "series" -# 菜单设置 -[[params.menu]] -name = "首页" -url = "/" -weight = 1 +#──────────────────────────────────────────── +# 5. 输出格式与输出控制 +#──────────────────────────────────────────── +[outputFormats] + [outputFormats.RSS] + mediaType = "application/rss+xml" + baseName = "rss" + isHTML = false + isPlainText = false + noUgly = true + rel = "alternate" -[[params.menu]] -name = "文辑" -url = "/posts/" -weight = 2 + [outputFormats.Feed] + mediaType = "application/rss+xml" + baseName = "feed" + isHTML = false + isPlainText = false + noUgly = true + rel = "alternate" -[[params.menu]] -name = "片语" -url = "https://memos.7wate.com/explore" -newTab = true -weight = 3 +[outputs] + home = ["HTML", "RSS", "Feed", "SITEMAP", "ROBOTS"] -[[params.menu]] -name = "关于" -url = "/about/" -newTab = true -weight = 4 - -# Typo 主题参数 +#──────────────────────────────────────────── +# 6. 主题参数 +#──────────────────────────────────────────── [params] -description = "愿我们都能:执着于热爱,纯粹于当下。" -theme = "auto" -colorPalette = "base16-default" -# 可选颜色:default, catpuccin, gruvebox, eink, base16-default, base16-eighties, base16-ocean, base16-mocha, base16-cupcake. + description = "愿我们都能:执着于热爱,纯粹于当下。" + theme = "auto" + colorPalette = "base16-default" + hideHeader = true + readTime = true + paginationSize = 10 + listSummaries = false + # 若启用 listSummaries = true,需要指定 summaryLength + # summaryLength = 70 + listDateFormat = "2006 Jan" + homeDateFormat = "2 Jan" + homeIntroTitle = "👋👋👋" + homeIntroContent = """愿我们都能:执着于热爱,纯粹于当下。""" + homeCollectionTitle = "文辑" + homeCollection = "posts" -# 首页设置 -homeIntroTitle = "👋👋👋" -homeIntroContent = """ -愿我们都能:执着于热爱,纯粹于当下。 -""" + [params.breadcrumbs] + enabled = true + showCurrentPage = true + home = "首页" -# 文辑设置 -homeCollectionTitle = "文辑" -homeCollection = "posts" + [params.umami] + enable = true + websiteId = "ce53db0e-af27-4703-ba19-d4792c8cff78" + # 建议托管到 CDN 域名,或根目录以减少跨域请求 + jsLocation = "https://umami.7wate.com/script.js" -# 文章设置 -hideHeader = true -readTime = true -paginationSize = 7 -listSummaries = false -listDateFormat = "2006 Jan" -homeDateFormat = "2 Jan" +#──────────────────────────────────────────── +# 7. 菜单与社交 +#──────────────────────────────────────────── +[[params.menu]] + name = "首页" + url = "/" + weight = 1 -# 面包屑导航 -[params.breadcrumbs] -enabled = true -showCurrentPage = true -home = "首页" +[[params.menu]] + name = "文辑" + url = "/posts/" + weight = 2 -# 社交链接 -[[params.social]] -name = "github" -url = "https://github.com/7wate" +[[params.menu]] + name = "片语" + url = "https://memos.7wate.com/explore" + newTab = true + weight = 3 + +[[params.menu]] + name = "关于" + url = "/about/" + newTab = true + weight = 4 [[params.social]] -name = "gmail" -url = "mailto:zhouzhongping@7wate.com" + name = "github" + url = "https://github.com/zopiya" [[params.social]] -name = "rss" -url = "https://blog.7wate.com/index.xml" + name = "gmail" + url = "mailto:i@zopiya.com" -# Markdown 与高亮设置 +[[params.social]] + name = "rss" + # 通常 RSS 放在 /rss.xml 而非 /index.xml + url = "/rss.xml" + +#──────────────────────────────────────────── +# 8. Markdown 与高亮 +#──────────────────────────────────────────── [markup] [markup.highlight] style = "algol" [markup.goldmark.renderer] - unsafe = false + unsafe = true # 生产环境建议设为 false -# 安全设置 +#──────────────────────────────────────────── +# 9. 安全与隐私 +#──────────────────────────────────────────── [security] enableInlineShortcodes = true -# 站点地图(SEO) -[sitemap] - changefreq = "weekly" - priority = 0.5 - filename = "sitemap.xml" - -# RSS 订阅 -[services] - [services.rss] - limit = 7 - -# 网站分析 -[params.umami] -enable = true -websiteId = "ce53db0e-af27-4703-ba19-d4792c8cff78" -jsLocation = "https://umami.7wate.com/script.js" - -# 隐私与 GDPR [privacy] [privacy.googleAnalytics] - anonymizeIP = true + anonymizeIP = true respectDoNotTrack = true useSessionStorage = false - disable = false + disable = true # 如不使用 GA,建议删掉整个块 -# 构建压缩设置 +#──────────────────────────────────────────── +# 10. 构建压缩与优化 +#──────────────────────────────────────────── [minify] - disableXML = true - minifyOutput = true \ No newline at end of file + disableXML = false + minifyOutput = true + +#──────────────────────────────────────────── +# 11. 站点地图(SEO) +#──────────────────────────────────────────── +[sitemap] + changefreq = "weekly" + priority = 0.5 + filename = "sitemap.xml" + +#──────────────────────────────────────────── +# 12. RSS 服务 +#──────────────────────────────────────────── +[services] + [services.rss] + limit = 7 # -1 表示不限制条目数 \ No newline at end of file diff --git a/layouts/home.feed.xml b/layouts/home.feed.xml new file mode 100644 index 0000000..9daf80d --- /dev/null +++ b/layouts/home.feed.xml @@ -0,0 +1,59 @@ +{{- $authorEmail := "" }} +{{- with site.Params.author }} +{{- if reflect.IsMap . }} +{{- with .email }} +{{- $authorEmail = . }} +{{- end }} +{{- end }} +{{- end }} + +{{- $authorName := "" }} +{{- with site.Params.author }} +{{- if reflect.IsMap . }} +{{- with .name }} +{{- $authorName = . }} +{{- end }} +{{- else }} +{{- $authorName = . }} +{{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = .Site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} + + + {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on + {{ end }}{{ .Site.Title }}{{ end }} + {{ .Permalink }} + Recent + content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ + .Site.Title }} + Hugo + {{ + site.Language.LanguageCode }}{{ with $authorEmail }} {{.}}{{ with + $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} {{ + . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with .Site.Copyright }} {{ + . }}{{ end }}{{ if not .Date.IsZero }} {{ (index + $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ + end }} {{- with .OutputFormats.Get "RSS" }} {{ printf "" + .Permalink .MediaType | safeHTML }} {{- end }} {{- range $pages }} + {{ .Title }} + {{ .Permalink }} + {{ .PublishDate.Format + "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} {{- with $authorEmail }}{{ + . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} {{ .Permalink }} + {{ + .Summary | transform.XMLEscape | safeHTML }} + {{- end }} + \ No newline at end of file diff --git a/layouts/home.rss.xml b/layouts/home.rss.xml new file mode 100644 index 0000000..9daf80d --- /dev/null +++ b/layouts/home.rss.xml @@ -0,0 +1,59 @@ +{{- $authorEmail := "" }} +{{- with site.Params.author }} +{{- if reflect.IsMap . }} +{{- with .email }} +{{- $authorEmail = . }} +{{- end }} +{{- end }} +{{- end }} + +{{- $authorName := "" }} +{{- with site.Params.author }} +{{- if reflect.IsMap . }} +{{- with .name }} +{{- $authorName = . }} +{{- end }} +{{- else }} +{{- $authorName = . }} +{{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = .Site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} + + + {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on + {{ end }}{{ .Site.Title }}{{ end }} + {{ .Permalink }} + Recent + content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ + .Site.Title }} + Hugo + {{ + site.Language.LanguageCode }}{{ with $authorEmail }} {{.}}{{ with + $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} {{ + . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with .Site.Copyright }} {{ + . }}{{ end }}{{ if not .Date.IsZero }} {{ (index + $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ + end }} {{- with .OutputFormats.Get "RSS" }} {{ printf "" + .Permalink .MediaType | safeHTML }} {{- end }} {{- range $pages }} + {{ .Title }} + {{ .Permalink }} + {{ .PublishDate.Format + "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} {{- with $authorEmail }}{{ + . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} {{ .Permalink }} + {{ + .Summary | transform.XMLEscape | safeHTML }} + {{- end }} + \ No newline at end of file diff --git a/layouts/robots.txt b/layouts/robots.txt new file mode 100644 index 0000000..f2bafac --- /dev/null +++ b/layouts/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / +RSS: {{ .Site.BaseURL }}index.xml +Sitemap: {{ .Site.BaseURL }}sitemap.xml