# Gitea - Self-Hosted Git Server **LXC 225** | **10.10.0.225** | **git.manticorum.com** Self-hosted Git server with web UI, Git LFS support, and Gitea Actions for CI/CD pipelines. ## Quick Info | Property | Value | |----------|-------| | **Type** | LXC Container (Proxmox) | | **OS** | Ubuntu 20.04 LTS | | **IP** | 10.10.0.225 | | **Public URL** | https://git.manticorum.com | | **Gitea Version** | 1.22.6 | | **Database** | PostgreSQL 12 | | **Reverse Proxy** | Nginx Proxy Manager (10.10.0.16) | ## Container Specs - **VMID**: 225 - **CPU**: 2 cores - **RAM**: 2GB - **Disk**: 20GB - **Features**: Nesting enabled (for future Docker runner support) ## Services ### Gitea Web - **Port**: 3000 (internal) - **Service**: `gitea.service` - **User**: `git` - **Work Dir**: `/var/lib/gitea` - **Config**: `/etc/gitea/app.ini` - **Data**: `/var/lib/gitea/data` - **Logs**: `/var/lib/gitea/log` ### PostgreSQL - **Version**: 12 - **Port**: 5432 (localhost only) - **Database**: `gitea` - **User**: `gitea` - **Service**: `postgresql` ## Management ### Access Container ```bash ssh root@10.10.0.225 # or via Proxmox pct enter 225 ``` ### Service Management ```bash # Status systemctl status gitea systemctl status postgresql # Restart systemctl restart gitea # Logs journalctl -u gitea -f ``` ### Database Access ```bash # As postgres user sudo -u postgres psql -d gitea # As gitea user (from container) PGPASSWORD=gitea123 psql -U gitea -d gitea -h 127.0.0.1 ``` ## Configuration ### Main Config File `/etc/gitea/app.ini` contains all Gitea settings: - Database connection - Server domain and URLs - SSH settings - LFS configuration - OAuth2/JWT secrets - Actions enabled **Permissions**: - Owner: `root:git` - Mode: `640` - Directory: `750` on `/etc/gitea` ### Admin Account - **Username**: `cal` - **Password**: Set during initial setup (change immediately!) - **Email**: `cal@manticorum.com` ### Features Enabled - ✅ **Gitea Actions** - Built-in CI/CD (GitHub Actions compatible) - ✅ **Git LFS** - Large file storage support - ✅ **SSH Access** - Git over SSH on port 22 - ✅ **Web UI** - Repository browser and management - ✅ **Organizations** - Multi-user repository groups - ✅ **Webhooks** - Integration with external services ## Backup ### What to Backup 1. **PostgreSQL database**: `gitea` database 2. **Repository data**: `/var/lib/gitea/data/gitea-repositories` 3. **Configuration**: `/etc/gitea/app.ini` 4. **Custom files**: `/var/lib/gitea/custom` (if any) ### Backup Commands ```bash # Database dump sudo -u postgres pg_dump gitea > gitea-backup-$(date +%Y%m%d).sql # Full data directory tar -czf gitea-data-$(date +%Y%m%d).tar.gz /var/lib/gitea # Config only cp /etc/gitea/app.ini gitea-app-$(date +%Y%m%d).ini ``` ### Restore ```bash # Restore database sudo -u postgres psql -d gitea < gitea-backup.sql # Restore data tar -xzf gitea-data.tar.gz -C / chown -R git:git /var/lib/gitea ``` ## Upgrades ### Upgrade Gitea ```bash # Stop service systemctl stop gitea # Backup current binary cp /usr/local/bin/gitea /usr/local/bin/gitea.backup # Download new version wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/VERSION/gitea-VERSION-linux-amd64 # Set permissions chmod +x /usr/local/bin/gitea # Start service (will auto-migrate database) systemctl start gitea # Check logs journalctl -u gitea -f ``` ### Check Version ```bash /usr/local/bin/gitea --version ``` ## Setting Up CI/CD with Gitea Actions Gitea Actions are enabled and ready to use. To set up a runner: ### Option 1: Docker Runner (Recommended) Since the LXC has nesting enabled, you can run a Docker-based Actions runner: ```bash # Install Docker in the LXC curl -fsSL https://get.docker.com | sh # Run Gitea Actions runner docker run -d \ --name gitea-runner \ --restart unless-stopped \ -v /var/run/docker.sock:/var/run/docker.sock \ -e GITEA_INSTANCE_URL=https://git.manticorum.com \ -e GITEA_RUNNER_REGISTRATION_TOKEN= \ gitea/act_runner:latest ``` ### Option 2: Separate Runner LXC Create a dedicated LXC for running Actions with more isolation. ### Using Actions Create `.gitea/workflows/main.yml` in your repository: ```yaml name: CI on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run tests run: | npm install npm test ``` ## Adding Repositories ### Via Web UI 1. Go to https://git.manticorum.com 2. Click "+" → "New Repository" 3. Fill in details and create ### Via Command Line ```bash # Add remote git remote add homelab git@git.manticorum.com:cal/repo-name.git # Or HTTPS git remote add homelab https://git.manticorum.com/cal/repo-name.git # Push git push homelab main ``` ### Migrate from GitHub Gitea has built-in migration: 1. New Repository → "Migrate from GitHub" 2. Enter GitHub URL and token 3. Gitea will clone all commits, branches, tags ## Integration with NPM Reverse proxy is configured on NPM (10.10.0.16): - **Domain**: git.manticorum.com - **Forward to**: 10.10.0.225:3000 - **SSL**: Let's Encrypt - **Websockets**: Enabled ## Troubleshooting ### Gitea won't start ```bash # Check logs journalctl -u gitea -n 50 # Common issues: # - Permission on /etc/gitea/app.ini (should be 640, root:git) # - PostgreSQL not running # - Port 3000 already in use ``` ### Can't connect to database ```bash # Check PostgreSQL is running systemctl status postgresql # Test connection PGPASSWORD=gitea123 psql -U gitea -d gitea -h 127.0.0.1 -c "SELECT 1;" # Check pg_hba.conf allows md5 auth cat /etc/postgresql/12/main/pg_hba.conf | grep md5 ``` ### 502 Bad Gateway on web ```bash # Check Gitea is listening ss -tlnp | grep 3000 # Check NPM can reach container curl http://10.10.0.225:3000 # Verify firewall rules (should allow from 10.10.0.0/24) ``` ### Actions runner not working - Ensure runner is registered in Gitea Admin → Actions → Runners - Check runner logs: `docker logs gitea-runner` - Verify GITEA_INSTANCE_URL is correct - Ensure runner has network access to Gitea ## Security Notes - Database password is stored in `/etc/gitea/app.ini` (secured with 640 permissions) - SSH keys for Git access are stored per-user in Gitea database - JWT secrets are auto-generated and stored in config - LXC is unprivileged for better isolation - PostgreSQL only listens on localhost ## Related Documentation - [Official Gitea Docs](https://docs.gitea.io/) - [Gitea Actions](https://docs.gitea.io/en-us/usage/actions/overview/) - [Proxmox LXC Config](../proxmox/lxc/225.conf) - [Networking Setup](../../networking/CONTEXT.md) ## Deployment Date **Created**: 2026-02-03 **By**: Claude Code (Proxmox Skill) **Initial Version**: Gitea 1.22.6 on Ubuntu 20.04 ## Git Remotes This repository is mirrored on both GitHub and Gitea for redundancy: - **GitHub**: https://github.com/calcorum/claude-home - **Gitea**: https://git.manticorum.com/cal/claude-home