package softmodules import ( "rubric/utils" ) var ForgejoModule = Module{ Key: "forgejo", Aliases: []string{"fj", "git-forge"}, Title: "Forgejo — самохостинг git-форжа", Description: "Форк Gitea: Docker-развёртывание, Angie, SSH на нестандартном порту", Run: showForgejo, } func showForgejo() { utils.Header("Soft — Forgejo") utils.Section("Что это") utils.Code(`Forgejo — самохостимый git-форж, форк Gitea. Свой репозиторий кода с веб-интерфейсом, issues, pull request'ами, вики и (опционально) Forgejo Actions для CI/CD — как собственный GitHub/GitLab на своём VDS. Развёрнут на git.thebookofmagnus.ru (пользователь mroot), за Angie как реверс-прокси, SSH-доступ на порту 222.`) utils.Section("Развёртывание через Docker") utils.Code(`# docker-compose.yml (упрощённо, с SQLite — не нужен отдельный БД-сервер) services: forgejo: image: codeberg.org/forgejo/forgejo:latest environment: - FORGEJO__database__DB_TYPE=sqlite3 - FORGEJO__server__DOMAIN=git.thebookofmagnus.ru - FORGEJO__server__SSH_PORT=222 - FORGEJO__service__DISABLE_REGISTRATION=true volumes: - ./data:/data ports: - "127.0.0.1:3000:3000" - "222:22" restart: unless-stopped`) utils.Section("Angie как реверс-прокси") utils.Code(`server { listen 443 ssl; server_name git.thebookofmagnus.ru; ssl_certificate /etc/letsencrypt/live/git.thebookofmagnus.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/git.thebookofmagnus.ru/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # HTTP-блок для certbot (webroot-метод, --nginx с Angie не работает): server { listen 80; server_name git.thebookofmagnus.ru; location /.well-known/acme-challenge/ { root /var/www/certbot; } }`) utils.Section("Частые проблемы при развёртывании") utils.Println("• certbot: NXDOMAIN — DNS A-запись ещё не разошлась, подождать пропагации") utils.Println("• certbot: 404 на /.well-known/acme-challenge/ — не хватает HTTP(80) server-блока в Angie для сабдомена") utils.Println("• До готовности DNS/TLS — временный доступ через SSH-туннель: ssh -L 3000:127.0.0.1:3000 user@host") utils.Println("• Предупреждение о смене SSH host key при первом git push — решается добавлением ключа в ssh-agent") utils.Println("• Management → Users в новых версиях Forgejo переехал в раздел \"Identity & access\", а не отдельная вкладка") utils.Section("Настройка") utils.Command("FORGEJO__service__DISABLE_REGISTRATION=true", "отключить самостоятельную регистрацию") utils.Command("FORGEJO__ui__APP_NAME", "название, отображаемое в заголовке вкладки браузера") utils.Command("/data/gitea/public/assets/img/", "путь для замены логотипа и favicon (в примонтированном volume)") utils.Note("CI/CD (Forgejo Actions) можно не настраивать сразу — вполне рабочий вариант отложить его на потом") utils.Footer() }