- Fixed 4 broken markdown links (bad relative paths in See Also sections) - Corrected n8n port binding to 127.0.0.1:5678 (matches actual deployment) - Updated SnapRAID article with actual majorhome paths (/majorRAID, disk1-3) - Converted 67 Obsidian wikilinks to relative markdown links or plain text - Added YAML frontmatter to 35 articles missing it entirely - Completed frontmatter on 8 articles with missing fields Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
101 lines
2.9 KiB
Markdown
101 lines
2.9 KiB
Markdown
---
|
|
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
|
|
|
|
---
|