Skip to content
On this page

阿里云服务器部署 Gitea

写在前面

这篇文档记录的是我在阿里云服务器上部署 Gitea 的完整过程。
目标不是搭一个复杂的代码平台,而是先为 Obsidian KnowledgeVault 搭好一个稳定的 Git 同步中转站。

当前这套环境的目标很明确:

  • Obsidian 做本地知识库
  • Gitea 做云端仓库
  • Mac -> 云端 -> Windows 形成一键同步链路

当前环境

部署这套服务时,我的环境大致如下:

  • 云服务器:阿里云 ECS
  • 系统:CentOS 7
  • 反向代理:Caddy
  • 域名:git.silentdream.top
  • 数据库:SQLite
  • 部署方式:Docker

在这台资源不算高的机器上,我没有继续引入 PostgreSQL 或 MySQL,而是先选择更轻量的 SQLite 方案。

部署思路

当前采用的整体思路如下:

  1. 使用 Docker 运行 Gitea
  2. 使用 rootless 镜像
  3. 通过 Caddy 提供 HTTPS 访问
  4. 通过 git.silentdream.top 暴露对外入口
  5. 先使用 HTTPS 完成 Git push / pull

对应的 Gitea Web 端口最终使用:

text
3001 -> 3000

这里有一个实际调整过程:

  • 最开始我尝试只绑定 127.0.0.1:3001
  • 但由于当前 Caddy 运行在 Docker 容器中,反代到宿主机时遇到了 502
  • 最终改为 3001:3000 后,反向代理链路恢复正常

Docker Compose 配置

最终使用的核心配置如下:

yaml
services:
  gitea:
    image: docker.gitea.com/gitea:1.25.5-rootless
    container_name: gitea
    restart: unless-stopped
    ports:
      - "3001:3000"
      - "127.0.0.1:2222:2222"
    volumes:
      - gitea-data:/var/lib/gitea
      - gitea-config:/etc/gitea
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

volumes:
  gitea-data:
  gitea-config:

这里我最终没有继续使用宿主机目录 bind mount,而是改用了 Docker named volumes。

原因很简单:
rootless 镜像下,bind mount 实际遇到了权限问题,而 named volumes 更稳定。

第一次启动时的关键现象

Gitea 容器成功启动后,日志里可以看到它已经进入安装页状态:

text
Prepare to run install page
Listen: http://0.0.0.0:3000
AppURL(ROOT_URL): http://localhost:3000/

这一步说明:

  • 容器本身已经正常运行
  • Web 服务已经起来
  • 接下来要做的是通过正式域名进入安装页,而不是直接按默认 localhost 继续完成安装

接入 Caddy

当前使用的反代方式是把 git.silentdream.top 指向宿主机上的 Gitea 端口:

text
git.silentdream.top {
    reverse_proxy host.docker.internal:3001
}

因为当前 Caddy 本身也运行在 Docker 容器里,所以这里不能简单写 localhost:3001

安装页与初始化

当反向代理链路打通后,就可以通过正式域名访问安装页:

text
https://git.silentdream.top

安装页界面如下:

Gitea 安装页

初始化时我主要确认了这些设置:

  • 数据库使用 SQLite
  • 站点标题按需填写
  • 使用正式域名作为访问入口
  • 创建自己的管理员账号

安装配置页面如下:

Gitea 初始化配置

关键配置检查

初始化完成后,最重要的不是“页面能打开”,而是确认服务端配置是否正确。

尤其是 [server] 段的这些字段:

ini
ROOT_URL = https://git.silentdream.top/
DOMAIN = git.silentdream.top
HTTP_PORT = 3000
SSH_DOMAIN = git.silentdream.top
SSH_PORT = 2222
START_SSH_SERVER = true

其中最关键的是:

ini
ROOT_URL = https://git.silentdream.top/

如果这项配置错误,后续最容易出现:

  • 页面跳转异常
  • clone 地址错误
  • 某些生成链接不正确

仓库创建

当初始化完成后,我创建了知识库同步专用仓库:

text
knowledge-vault

仓库创建界面如下:

knowledge-vault 仓库创建

这个仓库后续专门用来存放我的 KnowledgeVault,不和博客源码、脚本仓库混在一起。

当前阶段结论

完成这一步之后,我已经具备了:

  • 一个可用的 Gitea 服务入口
  • 一个可访问的正式域名
  • 一个可用于同步 Obsidian 知识库的私有仓库

这为后续的:

  • Mac 推送
  • Windows 拉取
  • Git 历史保留

提供了基础设施。

这一步里最值得记录的坑

这次部署里最关键的一个坑是:

rootless + bind mount 的目录权限问题。

最开始我遇到的报错是:

text
/var/lib/gitea/git is not writable
docker setup failed

最终修正方式不是继续死磕宿主机目录权限,而是:

  • 放弃 bind mount
  • 改用 Docker named volumes

这一步让容器快速恢复稳定,也更适合当前阶段的部署目标。

下一步

完成 Gitea 部署后,下一步就可以进入:

  • 本地 KnowledgeVault 初始化 Git 仓库
  • Mac -> Gitea -> Windows 一键同步流程

也就是把整个知识库真正接到日常使用链路里。

Built with VitePress