Skip to content

Gitea

@cratenaut/gitea 用于部署自托管 Git 服务。默认使用 SQLite、关闭注册,并且不直接向主机发布端口

安装

bash
bun add @cratenaut/gitea

本地示例

ts
import { caddy } from "@cratenaut/caddy";
import { defineConfig } from "@cratenaut/core";
import { gitea } from "@cratenaut/gitea";

const code = gitea({
  id: "code",
  description: "团队内部的 Git 代码托管服务",
  options: {
    publicUrl: "http://localhost:8080",
    registration: "closed",
    features: {
      lfs: true,
      actions: true,
      packages: true,
    },
    // `HTTP` 不直接发布到主机,只通过同一服务器网络中的 `Caddy` 访问
    http: false,
    ssh: false,
  },
});

const gateway = caddy({
  id: "gateway",
  description: "Gitea 的 Web 入口",
  options: {
    ports: { http: 8080, https: false, http3: false },
    config: {
      format: "structured",
      sites: [
        {
          addresses: ["http://localhost:8080"],
          tls: "off",
          routes: [
            {
              kind: "reverseProxy",
              // 同一服务器中的容器可以通过“实例标识-资源标识”互相访问
              upstreams: ["code-server:3000"],
              healthUri: "/api/healthz",
            },
          ],
        },
      ],
    },
  },
});

export default defineConfig({
  project: "gitea-example",
  servers: [
    {
      id: "local",
      connection: { kind: "local" },
      // 数组决定声明和处理顺序,但不表示两个实例之间存在依赖关系
      crates: [code, gateway],
    },
  ],
});

顶层选项

选项默认值说明
publicUrl必需用户访问 Gitea 的完整 HTTP 或 HTTPS 地址
imagedocker.gitea.com/gitea:1.27.2自定义镜像属于未知风险
database{ type: "sqlite" }SQLite、PostgreSQL 或 MySQL
httpfalse是否直接发布 3000 端口
sshfalse是否发布 Git SSH 服务
registrationclosedopenclosedmanualemail
mailerfalseSMTP 配置
features{}LFS、Actions 和包注册表开关
uidgid1000容器内用户和用户组编号
security{}SECRET_KEY 和 INTERNAL_TOKEN
configuration{}Gitea 原生分区配置
extraEnvironment{}额外环境变量

外部 PostgreSQL

ts
database: {
  type: "postgres",
  host: "database-server",
  port: 5432,
  database: "gitea",
  username: "gitea",
  password: secret.env("GITEA_DATABASE_PASSWORD"),
  sslMode: "disable",
}

数据库类型是不可变选项。把现有 SQLite 部署改成 PostgreSQL 需要独立的数据迁移流程,不能只修改配置字段

MySQL 连接额外支持 charset,默认端口为 3306

HTTP 与 SSH 发布

ts
http: { port: 3000, address: "127.0.0.1" },
ssh: {
  publish: { port: 2222, address: "0.0.0.0" },
  domain: "git.example.com",
  advertisedPort: 2222,
},

如果由 Caddy 反向代理,通常保持 http: false,通过项目网络中的 实例标识-server:3000 访问

注册与邮件

registration: "email" 必须同时配置邮件服务:

ts
mailer: {
  protocol: "smtp+starttls",
  host: "smtp.example.com",
  port: 587,
  from: "Gitea <git@example.com>",
  username: "git@example.com",
  password: secret.env("GITEA_SMTP_PASSWORD"),
}

安全密钥

ts
security: {
  secretKey: secret.env("GITEA_SECRET_KEY"),
  internalToken: secret.env("GITEA_INTERNAL_TOKEN"),
}

这两个值一旦用于已有数据就不应修改。修改 SECRET_KEY 可能使已有加密数据无法解密,修改 INTERNAL_TOKEN 会使内部调用凭据失效

高级配置

configuration 对应 Gitea 原生配置分区:

ts
configuration: {
  repository: {
    DEFAULT_PRIVATE: "private",
  },
}

Cratenaut 会拒绝覆盖它已经管理的数据库、服务器、注册、邮件和安全字段。其他原生字段的影响属于未知风险

数据与升级

所有仓库、SQLite 数据库、附件和应用数据位于实例的持久化存储中。升级镜像前应阅读 Gitea 发布说明并完成备份;自定义镜像的目录和升级兼容性由部署者负责判断

以 MIT 许可证发布