# Forgejo CI/CD - Documentacao

Este documento descreve a configuracao do Forgejo como alternativa ao GitHub Actions para CI/CD self-hosted.

## Por que Forgejo?

A partir de marco de 2026, o GitHub passara a cobrar $0.002 por minuto de execucao em self-hosted runners. O Forgejo Actions oferece a mesma experiencia visual e funcionalidade sem custo adicional.

## Arquitetura

```
Claude Code / VS Code
       |
   Git local
       |
   git push origin main    (GitHub - backup)
   git push forgejo main   (Forgejo - CI/CD)
       |
   Forgejo (git.esdrasrenan.com.br)
       |
   Forgejo Actions (dispara automaticamente)
       |
   Forgejo Runner (VPS)
       |
   Docker Swarm deploy
```

**Fluxo:** Push para ambos os remotes. O push para `forgejo` dispara o CI/CD.

```bash
# Push para ambos (recomendado)
git push origin main && git push forgejo main

# Ou use o alias configurado
git push-all
```

## URLs e Credenciais

| Servico | URL | Usuario |
|---------|-----|---------|
| Forgejo UI | https://git.esdrasrenan.com.br | esdras |
| Forgejo SSH | git@git.esdrasrenan.com.br:2222 | - |
| Actions | https://git.esdrasrenan.com.br/esdras/sistema-de-chamados/actions | - |

**Senha inicial:** `ForgejoAdmin2025!` (altere apos primeiro acesso)

## Estrutura de Arquivos

```
projeto/
├── .forgejo/
│   └── workflows/
│       ├── ci-cd-web-desktop.yml    # Deploy principal (VPS + Convex)
│       └── quality-checks.yml       # Lint, test, build
├── .github/
│   └── workflows/                   # Workflows originais do GitHub
│       └── ...
└── forgejo/
    ├── stack.yml                    # Stack Docker do Forgejo
    └── setup-runner.sh              # Script de setup do runner
```

## Configuracao na VPS

### Forgejo Server

Rodando como servico Docker Swarm:

```bash
# Localização do stack
/srv/forgejo/stack.yml

# Comandos uteis
docker service ls --filter "name=forgejo"
docker service logs forgejo_forgejo --tail 100
docker stack deploy -c /srv/forgejo/stack.yml forgejo
```

### Forgejo Runner

Rodando como servico systemd:

```bash
# Localização
/srv/forgejo-runner/

# Arquivos
/srv/forgejo-runner/forgejo-runner    # Binario
/srv/forgejo-runner/config.yaml       # Configuracao
/srv/forgejo-runner/.runner           # Registro

# Comandos uteis
systemctl status forgejo-runner
systemctl restart forgejo-runner
journalctl -u forgejo-runner -f

# Labels do runner
- ubuntu-latest:docker://node:20-bookworm
- self-hosted:host
- linux:host
- vps:host
```

## Fluxo de Trabalho

O repositorio no Forgejo recebe pushes diretos (nao e mais um mirror).

### Uso diario

```bash
# Trabalhe normalmente
git add .
git commit -m "sua mensagem"

# Push para GitHub (backup) e Forgejo (CI/CD)
git push origin main && git push forgejo main

# Acompanhe o CI/CD em:
# https://git.esdrasrenan.com.br/esdras/sistema-de-chamados/actions
```

### Configurar alias (opcional)

```bash
# Adicionar alias para push em ambos
git config alias.push-all '!git push origin main && git push forgejo main'

# Usar:
git push-all
```

## Workflows Disponiveis

### ci-cd-web-desktop.yml

Triggers:
- Push na branch `main`
- Tags `v*.*.*`
- workflow_dispatch (manual)

Jobs:
1. **changes** - Detecta arquivos alterados
2. **deploy** - Deploy na VPS (Next.js + Docker Swarm, usando Bun)
3. **convex_deploy** - Deploy das functions Convex
4. ~~**desktop_release**~~ - Build do app desktop (comentado - sem runner Windows)

### quality-checks.yml

Triggers:
- Push na branch `main`
- Pull requests para `main`

Jobs:
1. **lint-test-build** - Lint, testes e build

## Diferenca do GitHub Actions

Os workflows do Forgejo sao quase identicos aos do GitHub Actions. Principais diferencas:

1. **Localizacao:** `.forgejo/workflows/` em vez de `.github/workflows/`

2. **Actions URL:** Usar `https://github.com/` prefixo nas actions
   ```yaml
   # GitHub Actions
   uses: actions/checkout@v4

   # Forgejo Actions
   uses: https://github.com/actions/checkout@v4
   ```

3. **runs-on:** Usar labels do self-hosted runner em vez de `ubuntu-latest`
   ```yaml
   # GitHub Actions (hosted runner)
   runs-on: ubuntu-latest

   # Forgejo Actions (self-hosted)
   runs-on: [ self-hosted, linux, vps ]
   ```

4. **Secrets:** Configurar em Settings > Actions > Secrets no Forgejo

## Manutencao

### Atualizar Forgejo

```bash
ssh root@154.12.253.40
cd /srv/forgejo
# Editar stack.yml para nova versao da imagem
docker stack deploy -c stack.yml forgejo
```

### Atualizar Runner

```bash
ssh root@154.12.253.40
cd /srv/forgejo-runner
systemctl stop forgejo-runner

# Baixar nova versao
RUNNER_VERSION="6.2.2"  # ajustar versao
curl -sL -o forgejo-runner "https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-amd64"
chmod +x forgejo-runner

systemctl start forgejo-runner
```

### Re-registrar Runner

Se o runner perder a conexao:

```bash
ssh root@154.12.253.40
cd /srv/forgejo-runner

# Gerar novo token no Forgejo
docker exec -u 1000:1000 $(docker ps -q --filter "name=forgejo_forgejo") \
  /usr/local/bin/gitea --config /data/gitea/conf/app.ini actions generate-runner-token

# Re-registrar
systemctl stop forgejo-runner
rm .runner
./forgejo-runner register \
  --instance https://git.esdrasrenan.com.br \
  --token "NOVO_TOKEN" \
  --name "vps-runner" \
  --labels "ubuntu-latest:docker://node:20-bookworm,self-hosted:host,linux:host,vps:host" \
  --no-interactive
systemctl start forgejo-runner
```

### Backup

```bash
# Backup do volume do Forgejo
docker run --rm -v forgejo_forgejo_data:/data -v /backup:/backup alpine \
  tar czf /backup/forgejo-backup-$(date +%Y%m%d).tar.gz /data
```

## Troubleshooting

### Runner nao aparece online

```bash
# Verificar status
systemctl status forgejo-runner
journalctl -u forgejo-runner --no-pager -n 50

# Verificar conectividade
curl -s https://git.esdrasrenan.com.br/api/healthz

# Se o runner mostrar erro "404 Not Found" apos reinicio do Forgejo:
systemctl restart forgejo-runner
```

### Workflow nao dispara apos push

1. Verificar se o arquivo esta em `.forgejo/workflows/`
2. Verificar se Actions esta habilitado no repositorio (Settings > Actions)
3. Verificar se o runner esta online (Settings > Actions > Runners)
4. **Regenerar hooks do repositorio:**
   ```bash
   docker exec -u 1000:1000 $(docker ps -q --filter "name=forgejo_forgejo") \
     /usr/local/bin/gitea admin regenerate hooks --config /data/gitea/conf/app.ini
   ```

### Erro de LevelDB Lock (queue nao inicia)

Se o Forgejo mostrar erro `unable to lock level db at /data/gitea/queues/common`:

1. O stack.yml ja usa `FORGEJO__queue__TYPE=channel` para evitar esse problema
2. Se o erro persistir, limpe o diretorio de queues:
   ```bash
   docker exec $(docker ps -q --filter "name=forgejo_forgejo") \
     rm -rf /data/gitea/queues/*
   docker service update --force forgejo_forgejo
   ```

### Erro de permissao no deploy

O runner precisa de acesso ao Docker:

```bash
# Verificar grupo docker
groups runner
# Adicionar se necessario
usermod -aG docker runner
systemctl restart forgejo-runner
```

## Referencias

- [Forgejo Documentation](https://forgejo.org/docs/)
- [Forgejo Actions](https://forgejo.org/docs/latest/user/actions/)
- [Forgejo Runner](https://code.forgejo.org/forgejo/runner)
