LOADING
870 字
4 分钟
Astro + Decap CMS 从 GitHub 迁移到 Gitea 完整指南

Astro + Decap CMS 从 GitHub 迁移到 Gitea 完整指南

本文记录了将 Twilight 博客项目从 GitHub 迁移到自托管 Gitea 的完整过程,以及遇到的常见问题和解决方案。

背景

Twilight 是一个基于 Astro 框架的博客项目,使用 Decap CMS(原 Netlify CMS)作为后台管理系统。出于数据自主可控的考虑,决定将代码仓库从 GitHub 迁移到自托管的 Gitea 服务器。

迁移步骤

1. 配置 Decap CMS 后端

修改 .decap.yml 配置文件,将后端从 GitHub 改为 Gitea:

backend:
name: gitea
repo: gowls/blog
app_id: your-client-id # Gitea OAuth 应用的 Client ID
api_root: https://git.gowls.site/api/v1
base_url: https://git.gowls.site
auth_endpoint: https://git.gowls.site/login/oauth/authorize
branch: main

关键配置说明:

字段说明
app_idGitea OAuth 应用提供的 Client ID
api_rootGitea API 地址,格式为 /api/v1
base_urlGitea 实例的根地址
auth_endpointOAuth 授权端点地址

2. 创建 Gitea Actions 工作流

将 GitHub Actions 工作流迁移到 Gitea,创建 .gitea/workflows/deploy.yml

name: Deploy to Pages
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
- name: Install dependencies
run: pnpm install
- name: Build
run: pnpm run build
env:
GITHUB_ACTIONS: false
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
deploy:
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
steps:
- name: Deploy to Pages
uses: actions/deploy-pages@v4

3. 禁用 GitHub OAuth 代理

由于 Gitea 支持 PKCE 认证,不需要额外的 OAuth 代理。在 astro.config.mjs 中禁用:

decapCmsOauth({
configPath: "./.decap.yml",
decapCMSVersion: "3.9.0",
enable: false, // Gitea 使用 PKCE,不需要 OAuth 代理
}),

4. 创建 Gitea OAuth 应用

在 Gitea 中创建 OAuth 应用:

  1. 登录 Gitea → 设置应用
  2. 点击 创建 OAuth2 应用
  3. 填写以下信息:
    • 应用名称:Twilight Blog
    • 重定向 URI
      • 本地开发:http://localhost:4321/admin/
      • 线上部署:https://blog.gowls.cn/admin/
  4. 重要取消勾选 “Confidential Client”(机密客户端)

⚠️ 注意:Decap CMS 使用 PKCE 认证,必须取消 Confidential Client 选项,否则会报 “invalid empty client secret” 错误。

5. 配置 CORS

由于 Decap CMS 从博客域名向 Gitea API 发送请求,需要配置 CORS。

编辑 Gitea 的 custom/conf/app.ini

[cors]
ENABLED = true
ALLOW_DOMAIN = blog.gowls.cn,localhost:4321
ALLOW_SUBDOMAIN = true
METHODS = GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS
ALLOW_CREDENTIALS = false
MAX_AGE = 30m

修改后重启 Gitea 服务。

6. 删除 GitHub 相关配置

删除 .github 目录及所有 GitHub 相关配置:

Terminal window
rm -rf .github

常见问题与解决方案

问题 1:Client ID not registered

原因.decap.ymlapp_id 未填写正确的 Client ID。

解决:确保 app_id 与 Gitea OAuth 应用提供的 Client ID 一致。

问题 2:Unregistered Redirect URI

原因:Gitea OAuth 应用中未配置正确的重定向 URI。

解决:在 Gitea OAuth 应用中添加:

  • 本地开发:http://localhost:4321/admin/
  • 线上部署:https://blog.gowls.cn/admin/

注意末尾的 / 是必需的。

问题 3:Failed to fetch

原因:CORS 跨域问题,浏览器阻止了跨域请求。

解决:在 Gitea 服务器配置 CORS(见上文第 5 步)。

问题 4:invalid empty client secret

原因:Gitea OAuth 应用勾选了 “Confidential Client”,但 PKCE 认证不需要 client secret。

解决:取消勾选 “Confidential Client” 选项。

问题 5:sha not found [main/content/posts]

原因:远程仓库中 src/content/posts 目录不存在或为空。

解决:创建一篇示例文章并推送到仓库:

Terminal window
mkdir -p src/content/posts
# 创建示例文章
git add src/content/posts
git commit -m "添加示例文章"
git push

总结

迁移完成后,配置清单如下:

配置项文件/位置
后端配置.decap.yml
CI/CD.gitea/workflows/deploy.yml
OAuth 应用Gitea 设置 → 应用
CORScustom/conf/app.ini
博客地址twilight.config.yaml

通过这次迁移,博客项目完全实现了自主可控,代码托管、后台管理、CI/CD 都可以在自己的服务器上运行,不再依赖第三方平台。


参考资料:

Astro + Decap CMS 从 GitHub 迁移到 Gitea 完整指南
/posts/migrate-github-to-gitea/
作者
Twilight
发布于
2026-06-26
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录
技能展示
文章
日记
时间线
相册
项目展示
分类
标签
目录