云计算百科
云计算领域专业知识百科平台

【计算机常识】--使用 Gitea 在本地/内网搭建 Git 私有服务器

在本地或内网使用 Gitea 搭建 Git 私有服务器,其安全性主要体现在以下几个方面:

  • 网络隔离:部署在内网环境中,默认不对外暴露服务,有效防止来自公网的未授权访问、扫描和攻击,大幅降低外部威胁面。

  • 数据自主可控:所有代码、用户信息、操作日志等敏感数据完全保留在组织内部,避免了将核心资产托管于第三方平台(如 GitHub、GitLab.com)可能带来的合规性风险或数据泄露隐患。

  • 细粒度权限管理:Gitea 提供完善的用户/组织/仓库级权限控制机制(如只读、写入、管理员角色),支持团队协作中的最小权限原则,防止越权操作。

  • 开源透明与社区维护:Gitea 采用 MIT 开源协议,代码公开可审计,安全漏洞通常能被社区快速发现和修复;同时保持轻量、低依赖,减少了攻击面。

  • 综上,Gitea 在内网部署本身具备较高的基础安全性,但其整体安全水平高度依赖于部署者的配置规范、运维习惯和安全意识。合理规划和持续维护是保障私有 Git 服务长期安全运行的关键。

    前提:你的某台电脑(可以是你的开发机或一台常开的服务器)已安装 Docker 和 Docker Compose。

    目录

    1.创建 Gitea 数据目录

    2.创建 docker-compose.yml

    3.设置目录权限(关键!)

    4.启动 Gitea

    5.初始化git服务器

    1. 停止容器并清理

    2. 手动创建配置文件

    3. 修正权限并启动

    4. 创建管理员账号

    6.登录创建


    1.创建 Gitea 数据目录

    Gitea 的“数据目录”是你整个私有 Git 服务的所有核心资产所在地——包括代码仓库、用户数据、配置、附件、数据库等,必须妥善备份和保护。

    Gitea 的数据目录中确实包含你托管的所有项目的完整 Git 仓库数据,但需要明确一点:

    它存储的是 Git 仓库的“裸仓库”(bare repository),而不是你日常开发用的“工作副本”(working directory)。

    1. 什么是“裸仓库”?

    • 裸仓库没有工作区(即没有你平时看到的 .c、.py、.js 等源代码文件直接展开)。
    • 它只包含 Git 内部的元数据和对象数据库(如 HEAD、config、objects/、refs/ 等目录)。
    • 这是 Git 服务器(包括 GitHub、GitLab、Gitea)标准的存储方式,用于高效接收推送(push)和提供克隆(clone)。

    路径示例: D:\\gitea-data\\gitea-repositories\\yourname\\myproject.git

    这个 myproject.git 目录就是一个裸仓库。

    找一个目录创建:

    mkdir gitea

    cd gitea

    mkdir data

    mkdir git-repos

    2.创建 docker-compose.yml

    在  gitea 下新建文件 docker-compose.yml,内容如下:

    nano docker-compose.yml
    version: '3.8'

    services:
    gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: always
    environment:
    – USER_UID=1000
    – USER_GID=1000
    # 如果你希望 Gitea 自动检测外部 URL,可加:
    # – DOMAIN=localhost
    # – ROOT_URL=http://localhost:3000/
    volumes:
    – /home/guoyuping/annotation_tool/gitea:/data
    – /etc/localtime:/etc/localtime:ro
    ports:
    – "3000:3000" # Web 界面
    – "2222:22" # SSH 端口(注意:不是默认 22,避免冲突)
    networks:
    – gitea-net

    networks:
    gitea-net:
    external: false

    • USER_UID=1000 和 USER_GID=1000:确保容器内 git 用户(UID=1000)能读写宿主机目录
    • 端口 2222:22:将容器内的 SSH 服务(22)映射到宿主机的 2222 端口(避免与系统 SSH 冲突)
    • 数据持久化:所有仓库、配置、数据库(SQLite)都存于 /home/guoyuping/annotation_tool/gitea/

    3.设置目录权限(关键!)

    Gitea 容器默认以 UID=1000 的 git 用户运行,必须确保该用户对数据目录有读写权限:

    sudo chown -R 1000:1000 /home/guoyuping/annotation_tool/gitea

    💡 验证:

    ls -ld /home/guoyuping/annotation_tool/gitea
    # 应显示:drwxr-xr-x … 1000 1000 …

    4.启动 Gitea

    # 在 gitea-deploy/ 目录下执行
    docker-compose up -d

    首次启动会自动拉取镜像并初始化。

    5.初始化git服务器

    打开:http://<你的服务器IP>:3000

  • 打开 http://服务器IP:3000
  • 数据库选择 SQLite3(默认,无需额外配置)
  • 域名填写:localhost 或你的服务器 IP
  • SSH 服务器域名:localhost(或 IP)
  • SSH 端口:2222(必须与 docker-compose.yml 中映射端口一致!)
  • 创建管理员账号(如 guoyuping)
  • 点击 立即安装
  • ✅ 安装完成后,自动跳转到登录页

    失败了:

    查看日志:

    docker compose logs -f

    Bug: gitea  | /usr/local/go/src/runtime/asm_amd64.s:1650 (0x475b60) gitea  | 2026/05/13 15:11:49 …s/install/install.go:226:checkDatabase() [I] Gitea will be installed in a database with: hasPostInstallationUser=false, dbMigrationVersion=280 gitea  | 2026/05/13 15:11:57 …/context_response.go:86:HTML() [E] Render failed: failed to render template: install, error: write tcp 172.29.0.2:3000->10.24.37.133:59127: write: broken pipe gitea  | 2026/05/13 15:11:57 …/context_response.go:88:HTML() [E] plainTextInternal (status=500): write bytes failed: write tcp 172.29.0.2:3000->10.24.37.133:59127: write: broken pipe gitea  | 2026/05/13 15:11:57 …rs/common/errpage.go:26:RenderPanicErrorPage() [E] PANIC: interface conversion: context.Context is nil, not *db.Context  

    核心错误信息是:PANIC: interface conversion: context.Context is nil, not *db.Context。这通常意味着在安装引导界面提交表单时,Gitea 在尝试初始化数据库连接或渲染安装结果页面时丢失了上下文,导致程序崩溃。

    造成 write: broken pipe 和 PANIC 的常见原因及解决方法如下:


    1. 权限冲突(最可能的原因)

    由于你手动指定了 /home/guoyuping/annotation_tool/gitea/ 目录,Docker 容器内的 git 用户(UID 1000)可能没有权限读写宿主机的这个文件夹。

    解决方法: 在宿主机上执行以下命令,确保目录所有权属于容器内的用户:

    当网页表单提交后,由于某些环境下的网络抖动导致 broken pipe,程序在尝试渲染错误页面时丢失了数据库上下文。

    我们可以通过“跳过网页安装界面,直接使用配置文件启动”的方法来绕过这个报错。

    请按照以下步骤操作:

    1. 停止容器并清理

    为了确保没有损坏的数据库残留,我们先彻底清空:

    docker compose down
    sudo rm -rf /home/guoyuping/annotation_tool/gitea/data/*

    2. 手动创建配置文件

    Gitea 的所有网页设置最终都会写进 app.ini。我们直接手动创建它,这样 Gitea 启动时就会发现“已经安装过了”,从而直接进入登录页面。

    # 创建配置目录
    mkdir -p /home/guoyuping/annotation_tool/gitea/data/gitea/conf/

    # 创建并编辑 app.ini
    nano /home/guoyuping/annotation_tool/gitea/data/gitea/conf/app.ini

    将以下内容粘贴进去(注意修改 IP 为你的服务器实际 IP):

    Ini, TOML

    APP_NAME = Gitea: Git with a cup of tea
    RUN_MODE = prod
    RUN_USER = git

    [database]
    DB_TYPE = sqlite3
    PATH = /data/gitea/gitea.db
    LOG_SQL = false

    [repository]
    ROOT = /data/git/repositories

    [server]
    SSH_DOMAIN = 10.24.37.133
    HTTP_PORT = 3000
    ROOT_URL = http://10.24.37.133:3000/
    DISABLE_SSH = false
    SSH_PORT = 2222
    LFS_START_SERVER = true

    [security]
    INSTALL_LOCK = true
    SECRET_KEY = $(head -c 32 /dev/urandom | base64)

    [service]
    DISABLE_REGISTRATION = false

    3. 修正权限并启动

    # 确保所有新建的配置文件夹权限属于 1009
    sudo chown -R 1009:1009 /home/guoyuping/annotation_tool/gitea/data

    # 启动容器
    docker compose up -d

    4. 创建管理员账号

    由于我们跳过了网页安装,现在需要通过命令行手动创建一个管理员:

    docker exec -it -u 1009 gitea gitea admin user create –username admin –password 你的

    6.登录创建

    使用刚才的用户密码登录进来

    创建一个项目:

    在pycharm中

    第一次项目上传管理:

    # 1. 初始化 Git
    git init

    # 2. 将所有文件添加到暂存区
    git add .

    # 3. 提交到本地仓库
    git commit -m "首次上传代码"

    # 4. 关联远程 Gitea 仓库 (使用 HTTP 地址)
    git remote add origin http://10.24.37.133:3000/你的用户名/仓库名.git

    # 5. 推送代码到 Gitea
    # 此时会弹窗提示输入 Gitea 的用户名和密码
    git push -u origin main

    别的用户:

    git clone http://10.24.37.133:3000/guoyuping/my-project.git #第一次拉取

    #同步分支
    git pull origin main

    # 1. 暂存修改
    git add .

    # 2. 提交到本地
    git commit -m "修正了某个功能"

    # 3. 推送到服务器
    git push origin main

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【计算机常识】--使用 Gitea 在本地/内网搭建 Git 私有服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!