阿里云服务器部署 Gitea
写在前面
这篇文档记录的是我在阿里云服务器上部署 Gitea 的完整过程。
目标不是搭一个复杂的代码平台,而是先为 Obsidian KnowledgeVault 搭好一个稳定的 Git 同步中转站。
当前这套环境的目标很明确:
- 用
Obsidian做本地知识库 - 用
Gitea做云端仓库 - 用
Mac -> 云端 -> Windows形成一键同步链路
当前环境
部署这套服务时,我的环境大致如下:
- 云服务器:阿里云 ECS
- 系统:
CentOS 7 - 反向代理:
Caddy - 域名:
git.silentdream.top - 数据库:
SQLite - 部署方式:
Docker
在这台资源不算高的机器上,我没有继续引入 PostgreSQL 或 MySQL,而是先选择更轻量的 SQLite 方案。
部署思路
当前采用的整体思路如下:
- 使用
Docker运行Gitea - 使用
rootless镜像 - 通过
Caddy提供 HTTPS 访问 - 通过
git.silentdream.top暴露对外入口 - 先使用
HTTPS完成 Git push / pull
对应的 Gitea Web 端口最终使用:
3001 -> 3000
这里有一个实际调整过程:
- 最开始我尝试只绑定
127.0.0.1:3001 - 但由于当前
Caddy运行在 Docker 容器中,反代到宿主机时遇到了502 - 最终改为
3001:3000后,反向代理链路恢复正常
Docker Compose 配置
最终使用的核心配置如下:
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 容器成功启动后,日志里可以看到它已经进入安装页状态:
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 端口:
git.silentdream.top {
reverse_proxy host.docker.internal:3001
}
因为当前 Caddy 本身也运行在 Docker 容器里,所以这里不能简单写 localhost:3001。
安装页与初始化
当反向代理链路打通后,就可以通过正式域名访问安装页:
https://git.silentdream.top
安装页界面如下:

初始化时我主要确认了这些设置:
- 数据库使用
SQLite - 站点标题按需填写
- 使用正式域名作为访问入口
- 创建自己的管理员账号
安装配置页面如下:

关键配置检查
初始化完成后,最重要的不是“页面能打开”,而是确认服务端配置是否正确。
尤其是 [server] 段的这些字段:
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
其中最关键的是:
ROOT_URL = https://git.silentdream.top/
如果这项配置错误,后续最容易出现:
- 页面跳转异常
- clone 地址错误
- 某些生成链接不正确
仓库创建
当初始化完成后,我创建了知识库同步专用仓库:
knowledge-vault
仓库创建界面如下:

这个仓库后续专门用来存放我的 KnowledgeVault,不和博客源码、脚本仓库混在一起。
当前阶段结论
完成这一步之后,我已经具备了:
- 一个可用的
Gitea服务入口 - 一个可访问的正式域名
- 一个可用于同步 Obsidian 知识库的私有仓库
这为后续的:
Mac推送Windows拉取- Git 历史保留
提供了基础设施。
这一步里最值得记录的坑
这次部署里最关键的一个坑是:
rootless + bind mount 的目录权限问题。
最开始我遇到的报错是:
/var/lib/gitea/git is not writable
docker setup failed
最终修正方式不是继续死磕宿主机目录权限,而是:
- 放弃 bind mount
- 改用 Docker named volumes
这一步让容器快速恢复稳定,也更适合当前阶段的部署目标。
下一步
完成 Gitea 部署后,下一步就可以进入:
- 本地
KnowledgeVault初始化 Git 仓库 Mac -> Gitea -> Windows一键同步流程
也就是把整个知识库真正接到日常使用链路里。