forgejo 仓库

使用

  • 用户后台:http://git.kc.com:3000    必须http,没开证书
  • 用户侧git命令

    -------------------- 设置host!! --------------------------
    192.168.1.142 git.kc.com
    
    -------------------- git环境 --------------------------
    git config --global user.name "YourName"        	# 确保 commit 记录
    git config --global user.email "you@example.com" 	# 确保邮箱正确
    git config --global core.autocrlf input         	# 防止 Windows/Linux 换行符冲突
    
    -------------------- 初始化-------------------
    cd /your/local/project								# 本地项目目录
    git init											# 本地git初始化,有.gitignore也放进去
    git rm -r --cached .								# 先清空追踪
    git add .											# 按照ignore重新追踪
    git commit -m "chore: refresh git cache and apply .gitignore"
    
    -------------------- 创建远端仓库 -------------------
    git branch -M master								# 本地分支命名为master
    git remote remove origin							# 先清空关联
    git remote add origin http://git.kc.com:3000/用户名/预期仓库名.git			# 关联远端仓库
    git remote add origin ssh://git.atibm.com/at/预期仓库名.git
    git config credential.helper store					# 开启本地凭证存储,执行一次
    git push -u origin master                    		# 推送master分支,会提示输入用户名密码
    
    -------------------- 提交新分支 -------------------
    git checkout -b feature-name
    git add .
    git commit -m "feat: 你的新功能描述"
    git push -u origin feature-name
    
    -------------------- 拉取代码 -------------------
    git clone							# 全新下载拉取
    git branch -a						# 查看远端所有分支
    git fetch --all						# 拉取:全部分支和提交,不修改本地代码
    git pull							# 拉取+合并:同分支的提交,会修改本地代码
    git pull --rebase					# 拉取+垫高:同分支的提交,本地代码被垒到上面去
    git cherry-pick commitid			# 拉取某次提交
    git checkout origin/main -- <文件>   # 拉取单个文件
    git switch 分支名					# 拉取切换分支
    git restore 分支名					# 拉取还原分支
    
    -------------------- 仓库迁移 -------------------
    git remote rename origin atdemo                     # 原挂载点备份
    git remote add origin "git.atibm.com:at/my-project.git"  # 新挂载点关联
    git push -u origin --all                            # 推送给新挂载点,同时跟踪关系建立
    git push origin --tags                              # 推送所有标签
    
    
    ###############################################################################
    # Git 常用命令手册 (vm-alpine Forgejo 环境专用)
    ###############################################################################
    
    # --- 1. 基础配置 ---
    git config --global user.name "at"               	# 设置全局用户名
    git config --global user.email "at@kc.com"       	# 设置全局邮箱
    git config --global credential.helper store      	# 永久存储 HTTP 密码 (避免重复输入)
    git init                                         	# 初始化本地仓库
    
    # --- 2. 本地操作 ---
    git status                                       	# 查看当前工作区状态 (哪些文件改了)
    git add .                                        	# 将所有修改添加到暂存区
    git commit -m "feat: initial commit"             	# 提交暂存区代码到本地仓库
    git commit --amend                               	# 修正最后一次提交 (改注记或补漏文件)
    
    # --- 3. 远端同步 ---
    git remote add origin http://at:pwd@git.kc.com/at/repo.git	# 关联远端 (带用户名密码)
    git remote set-url origin http://at:new@git.kc.com/at/repo.git	# 修改远端地址或密码
    git remote -v                                    	# 查看当前远程库地址
    git push -u origin master                        	# 首次推送并建立分支追踪 (触发自动建库)
    git push origin master                           	# 推送本地 master 分支到远端
    git pull origin master                           	# 拉取远端更新并合并到本地
    git fetch origin                                 	# 获取远端最新索引 (不合并)
    
    # --- 4. 分支管理 ---
    git branch                                       	# 查看本地分支列表
    git checkout -b dev                              	# 创建并切换到 dev 分支
    git checkout master                              	# 切换回 master 分支
    git merge dev                                    	# 将 dev 分支的代码合并到当前分支
    git branch -D dev                                	# 删除本地分支
    git push origin --d dev								# 删除远端分支
    git fetch -p										# 本地清理已删除的引用
    git config --global fetch.prune true				# 本地自动清理=on
    
    # --- 5. 状态检查与日志 ---
    git log --oneline                                	# 查看简略提交历史 (一行一个)
    git log --graph --all                            	# 图形化查看分支演变历史
    git diff                                         	# 查看当前未暂存的修改细节
    git ls-remote origin                             	# 检查远端引用 (验证远端库是否存在)
    git reflog                                       	# 查看命令历史 (误删找回神器)
    
    # --- 6. 撤销与回滚 ---
    git checkout -- <file>                           	# 撤销某个文件的修改 (恢复到未改状态)
    git reset HEAD <file>                            	# 将文件从暂存区撤回工作区
    git reset --soft HEAD~1                          	# 撤销最近一次 commit,代码保留在暂存区
    git reset --hard HEAD~1                          	# 彻底撤销最近一次提交,代码不保留 (慎用!)
    git clean -fd                                    	# 删除工作区中所有未追踪的文件

概述

  • 含义:Forgejo 是由 "Forge"(锻造)和 Esperanto(世界语)后缀 "-ejo"(场所)组合而成的造词,意为"锻造工坊",它象征着通过 Git 协作"锻造"代码的过程。项目原是 Gitea 的一个社区驱动分支(fork),2022 年 11 月因 Gitea 转向商业化的治理争议而诞生,
  • 仓库:https://codeberg.org/forgejo/forgejo(主仓库,Codeberg 托管)
  • 仓库:https://github.com/forgejo/forgejo (镜像仓库,GitHub 托管)
  • 特性:✨ Push-to-Create(推送即创建) — 开发者只需 git push 到一个尚不存在的远程仓库 URL,Forgejo 便会自动创建对应的仓库。

目录

mkdir -p /www/git/data

docker-compose.yml

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:15.0.2-rootless
    container_name: git
    restart: unless-stopped
    networks:
      - ghost_net
    user: "1000:1000"	                                    # rootless 镜像内部默认就是以 1000 运行
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - TZ=Asia/Shanghai
      
      # --- 核心运行模式 ---
      - FORGEJO__RUN_MODE=prod                              # 生产模式,关闭调试日志和缓存检查
      
      # --- 数据库连接 ---
      - FORGEJO__database__DB_TYPE=mysql
      - FORGEJO__database__HOST=mariadb:3306
      - FORGEJO__database__NAME=forgejo_db
      - FORGEJO__database__USER=ghost
      - FORGEJO__database__PASSWD=123456
      
      # --- 域名与 URL 修正 ---
      - FORGEJO__server__DOMAIN=git.kc.com				     # SSH连接域名
      - FORGEJO__server__ROOT_URL=http://git.kc.com		     # HTTP连接、邮件的域名
      
      # --- SSH 配置 (针对 Rootless) ---
      - FORGEJO__server__SSH_LISTEN_PORT=2222                # 服务监听,非root大于1024
      - FORGEJO__server__SSH_PORT=2222                       # 生成url用
      - FORGEJO__auth__DISABLE_BASIC_AUTHENTICATION=false	 # 禁止密码认证,,nginx反代时改为true,只用ssh拉取,增加安全性
      - FORGEJO__security__PASSWORD_COMPLEXITY=off           # 密码复杂度检查
      - FORGEJO__security__MIN_PASSWORD_LENGTH=1             # 最小密码长度
      - FORGEJO__repository__ENABLE_PUSH_CREATE_USER=true	 # 推送即创建仓库
      - FORGEJO__repository__ENABLE_PUSH_CREATE_ORG=true	 # 推送即创建组织
      - FORGEJO__server__SSH_SERVER_USE_PROXY_PROTOCOL=true	 # 支持nginx转发传导来源公网IP
      - FORGEJO__service__REQUIRE_SIGNIN_VIEW=true            # 登录后才能查看代码
      
      # --- 自动化与工作流 ---
      - FORGEJO__repository__ENABLE_PUSH_CREATE_USER=true
      - FORGEJO__repository__ENABLE_PUSH_CREATE_ORG=true
      
    volumes:
      - ./data:/var/lib/gitea                                # rootless版本映射路径
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "2222:2222"                                          # 宿主机 2222 映射容器内 2222
      - "3000:3000"                                          # HTTP 端口,nginx反代时注释本行
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"
    deploy:
      resources:
        limits:
          memory: 384M
          cpus: 0.7
      
networks:
  ghost_net:
    external: true

forgejo.conf

# 80 端口:验证 + 跳转
server {
    listen 80;
    server_name git.atibm.com;

    # Certbot 证书验证路径 (建议保留,方便续签)
    location ^~ /.well-known/acme-challenge/ {
        root /usr/share/nginx/html;
    }

    # 其他全部跳转
    location / {
        return 301 https://$host$request_uri;
    }
}

# 443 端口:Trilium 主服务
server {
    listen 443 ssl;
    http2 on; # 针对你的 1.29.4 版本开启 H2
    server_name git.atibm.com;

    ssl_certificate     /etc/letsencrypt/live/ghost.atibm.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ghost.atibm.com/privkey.pem;

    # 日志路径
    access_log  /var/log/nginx/forgejo-access.log  main;
    error_log   /var/log/nginx/forgejo-error.log warn;

    # 静态文件 (Ads/Robots)

    # 反向代理核心配置
    location / {
        proxy_pass http://forgejo:3000;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 动态支持 WebSocket (用于 Forgejo Actions 日志实时查看等功能)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;

        # 针对大文件 Git Push/Pull 的关键流式传输优化 (防止 Nginx 缓存导致超时)
        proxy_buffering off;
        proxy_request_buffering off; 

        # 允许上传/推送单次最大 5MB 的仓库或附件 (可根据需求调整为 1g)
        client_max_body_size 100m; 

        # 针对超大仓库克隆/推送,适当拉长超时时间
        proxy_connect_timeout 1200;
        proxy_send_timeout 1200;
        proxy_read_timeout 1200;
    }
}

forgejo.stream

# 提示:limit_conn_zone 在全局只能有一个。
# 如果你在 mariadb.stream 里已经写过这一句且 zone 名字也叫 addr,请把下面这句删掉/注释掉,直接复用即可。
# limit_conn_zone $binary_remote_addr zone=addr:10m;

upstream forgejo_ssh_backend {
    # 🚨 注意:如果 Nginx 和 Forgejo 在同一个 Docker 网络,通常填容器内端口 22
    # 如果你是转发到宿主机或者外网,才填 2222
    server forgejo:2222 max_fails=3 fail_timeout=30s;
}

server {
    # Nginx 对外监听的 Git SSH 端口
    listen 2222 so_keepalive=on;
    proxy_pass forgejo_ssh_backend;
    
    proxy_connect_timeout 5s;
    proxy_timeout 3600s;       # 保留:给大文件传输留足 1 小时超时时间
    proxy_buffer_size 16k;
    proxy_socket_keepalive on; # 保留:保持 TCP 长连接活性

    # 🌟 核心优化:开启 PROXY 协议,把客户端真实公网 IP 塞给 Forgejo
    # (注意:开启此项后,必须在 Forgejo 的 app.ini 里配置 SSH_SERVER_USE_PROXY_PROTOCOL = true)
    proxy_protocol on;

    # 🌟 安全防爆破优化:单个 IP 限制最多 10 个同时运行的 SSH 连接
    limit_conn addr 10;
    limit_conn_log_level warn;
}