--- title: "Gitea — Self-Hosted Git" domain: opensource category: alternatives tags: [gitea, git, self-hosting, docker, ci-cd] status: published created: 2026-04-02 updated: 2026-04-02 --- # Gitea — Self-Hosted Git ## Problem GitHub is the default home for code, but it's a Microsoft-owned centralized service. Your repositories, commit history, issues, and CI/CD pipelines are all under someone else's control. For personal projects and private infrastructure, there's no reason to depend on it. ## Solution [Gitea](https://gitea.com) is a lightweight, self-hosted Git service. It provides the full GitHub-style workflow — repositories, branches, pull requests, webhooks, and a web UI — in a single binary or Docker container that runs comfortably on low-spec hardware. --- ## Deployment (Docker) ```yaml services: gitea: image: docker.gitea.com/gitea:latest container_name: gitea restart: unless-stopped ports: - "3002:3000" - "222:22" # SSH git access volumes: - ./gitea:/data environment: - USER_UID=1000 - USER_GID=1000 - GITEA__database__DB_TYPE=sqlite3 ``` SQLite is fine for personal use. For team use, swap in PostgreSQL or MySQL. ### Caddy reverse proxy ``` git.yourdomain.com { reverse_proxy localhost:3002 } ``` --- ## Initial Setup 1. Browse to your Gitea URL — the first-run wizard handles configuration 2. Set the server URL to your public domain 3. Create an admin account 4. Configure SSH access if you want `git@git.yourdomain.com` cloning --- ## Webhooks Gitea's webhook system is how automated pipelines get triggered on push. Example use case — auto-deploy a MkDocs wiki on every push: 1. Go to repo → **Settings → Webhooks → Add Webhook** 2. Set the payload URL to your webhook endpoint (e.g. `https://notes.yourdomain.com/webhook`) 3. Set content type to `application/json` 4. Select **Push events** The webhook fires on every `git push`, allowing the receiving server to pull and rebuild automatically. See [MajorWiki Setup & Pipeline](../../05-troubleshooting/majwiki-setup-and-pipeline.md) for a complete example. --- ## Migrating from GitHub Gitea can mirror GitHub repos and import them directly: ```bash # Clone from GitHub, push to Gitea git clone --mirror https://github.com/user/repo.git cd repo.git git remote set-url origin https://git.yourdomain.com/user/repo.git git push --mirror ``` Or use the Gitea web UI: **+ → New Migration → GitHub** --- ## Why Not Just Use GitHub? For public open source — GitHub is fine, the network effects are real. For private infrastructure code, personal projects, and anything you'd rather not hand to Microsoft: - Full control over your data and access - No rate limits, no storage quotas on your own hardware - Webhooks and integrations without paying for GitHub Actions minutes - Works entirely over Tailscale — no public exposure required ---