Instalar Gitea com Docker Compose
Stack com Gitea e PostgreSQL para produção:
# docker-compose.yml
services:
gitea:
image: gitea/gitea:latest
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=postgres:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=${POSTGRES_PASSWORD}
- GITEA__server__DOMAIN=git.seudominio.com.br
- GITEA__server__ROOT_URL=https://git.seudominio.com.br/
- GITEA__server__SSH_DOMAIN=git.seudominio.com.br
- GITEA__server__SSH_PORT=2222
- GITEA__service__DISABLE_REGISTRATION=true # apenas convites
- GITEA__mailer__ENABLED=false
ports:
- "127.0.0.1:3000:3000" # HTTP
- "2222:22" # SSH Git
volumes:
- gitea_data:/data
- /etc/timezone:/etc/timezone:ro
depends_on:
- postgres
postgres:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_DB: gitea
POSTGRES_USER: gitea
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
gitea_data:
postgres_data:Configurar Nginx e SSH
Proxy reverso para HTTPS e acesso SSH para operações Git:
# /etc/nginx/conf.d/gitea.conf
server {
listen 80;
server_name git.seudominio.com.br;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name git.seudominio.com.br;
ssl_certificate /etc/letsencrypt/live/git.seudominio.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.seudominio.com.br/privkey.pem;
client_max_body_size 512M; # para repositórios grandes
location / {
proxy_pass http://127.0.0.1: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;
proxy_read_timeout 300s;
}
}
# Para clonar via SSH na porta 2222:
# git clone ssh://git@git.seudominio.com.br:2222/usuario/repo.git
# Ou adicionar ao ~/.ssh/config:
# Host git.seudominio.com.br
# Port 2222Migrar repositórios do GitHub para o Gitea
Migrar todos os repositórios de uma organização GitHub para o Gitea:
# Migrar repositório individual via interface web:
# Gitea → + (New) → Migrate External Repository → GitHub
# Migração em massa via API do Gitea:
GITEA_URL="https://git.seudominio.com.br"
GITEA_TOKEN="seu_token_gitea"
GITHUB_TOKEN="seu_github_token"
GITHUB_ORG="sua-org-github"
# Listar repositórios da organização no GitHub:
REPOS=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/orgs/$GITHUB_ORG/repos?per_page=100" \
| python3 -c "import sys,json; [print(r['full_name']) for r in json.load(sys.stdin)]")
# Migrar cada repositório:
for REPO in $REPOS; do
REPO_NAME=$(echo "$REPO" | cut -d/ -f2)
curl -X POST "$GITEA_URL/api/v1/repos/migrate" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
"clone_addr": "https://github.com/$REPO",
"auth_token": "$GITHUB_TOKEN",
"repo_name": "$REPO_NAME",
"private": true,
"mirror": true
}"
echo "Migrado: $REPO_NAME"
doneGitea Actions: CI/CD nativo
Gitea Actions é compatível com GitHub Actions, mesma sintaxe de workflow:
# .gitea/workflows/ci.yml — compatível com GitHub Actions syntax
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest # requer um runner registrado no Gitea
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm ci
- run: npm test
# Registrar um runner no Gitea:
# 1. Settings → Actions → Runners → Create new runner
# 2. Copiar o token gerado
# 3. No servidor runner:
docker run -d --name gitea-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitea_runner:/data \
gitea/act_runner:latest \
register --no-interactive \
--instance https://git.seudominio.com.br \
--token TOKEN_DO_RUNNER \
--name meu-runnerBackup e manutenção do Gitea
Backup completo incluindo repositórios e banco de dados:
# Backup via comando nativo do Gitea:
docker compose exec gitea gitea admin user list
docker compose exec gitea gitea dump -c /data/gitea/conf/app.ini -w /tmp/backup
# Copiar o backup para fora do container:
docker compose cp gitea:/tmp/backup.zip /var/backups/gitea-$(date +%Y%m%d).zip
# Backup manual do banco + volumes:
DATE=$(date +%Y%m%d_%H%M)
docker compose exec -T postgres pg_dump -U gitea gitea \
| gzip > /var/backups/gitea_db_${DATE}.sql.gz
docker run --rm \
-v gitea_data:/data \
-v /var/backups:/backup \
alpine tar czf "/backup/gitea_vol_${DATE}.tar.gz" /data
# Manutenção do banco de dados Git (compactar repos):
docker compose exec gitea gitea admin git fsck-repos --all