
O Gogs é um servidor Git self-hosted escrito em Go: um binário único, sem Ruby, sem Node, sem fila, sem Redis. Você coloca o arquivo no servidor, aponta para um banco e tem uma interface web parecida com a do GitHub, com consumo baixo de memória. É por isso que ele ainda faz sentido num VPS pequeno, num Raspberry Pi ou numa máquina interna de empresa — casos em que o GitLab simplesmente não cabe.
Gogs, Gitea ou Forgejo: qual instalar
Os três vêm do mesmo código. A separação foi de governança, não de tecnologia:
| Gogs | Gitea | Forgejo | |
|---|---|---|---|
| Origem | Original, 2014 | Fork do Gogs, 2016 | Fork do Gitea, 2022 (Codeberg) |
| Versão atual | 0.14.3 (jun/2026) | 28.0.0 (set/2026) | 16.0.5 (set/2026) |
| Licença | MIT | MIT | GPL-3.0 |
| Ritmo | Lento, poucas mãos | Rápido, comunidade grande | Rápido, governança coletiva |
| CI embutido | Não | Gitea Actions | Forgejo Actions |
| Registro de pacotes | Não | Sim | Sim |
| Consumo | O mais leve | Leve | Leve |
O Gitea saltou da série 1.27 direto para a 28.0.0 em setembro de 2026: é uma mudança no esquema de numeração, não 27 versões perdidas.
Regra prática: se você quer só Git com interface web, com o menor consumo possível, o Gogs entrega e continua recebendo correções. Se você quer CI, registro de pacotes e um projeto com muita gente contribuindo, vá de Gitea ou Forgejo — o passo a passo com runner de Actions está no post Gitea: Git self-hosted com Actions, runner e tea CLI. A estrutura abaixo (usuário git, systemd, nginx, backup) vale para os três; o que muda é o binário e as chaves do app.ini.

Preparando o servidor
Vale para Ubuntu 24.04/26.04 e Debian 12/13. O Gogs precisa de pouca coisa: git, um usuário de sistema e um banco.
sudo apt update
sudo apt install -y git curl
# usuário de sistema dedicado, sem senha
sudo adduser --system --group --disabled-password --home /home/git --shell /bin/bash git
O usuário precisa de shell porque o Git via SSH entra por ele: o Gogs grava em /home/git/.ssh/authorized_keys uma linha por chave que força o comando gogs serv, sem pty e sem encaminhamento de portas.
Para o banco, escolha um dos dois. SQLite resolve para uso pessoal ou equipe pequena e não exige nada além do próprio binário. PostgreSQL é o que você quer se houver mais de um punhado de pessoas:
sudo apt install -y postgresql
sudo -u postgres psql -c "CREATE ROLE gogs WITH LOGIN PASSWORD 'troque-esta-senha';"
sudo -u postgres psql -c "CREATE DATABASE gogs WITH OWNER gogs ENCODING 'UTF8';"
Instalando o binário
cd /tmp
VER=0.14.3
ARCH=amd64 # use arm64 num Raspberry Pi ou servidor ARM
curl -fLO https://github.com/gogs/gogs/releases/download/v${VER}/gogs_v${VER}_linux_${ARCH}.tar.gz
tar xzf gogs_v${VER}_linux_${ARCH}.tar.gz
sudo mv gogs /home/git/gogs
sudo chown -R git:git /home/git/gogs
Confira antes de seguir:
sudo -u git /home/git/gogs/gogs --version
Rodando como serviço no systemd
Crie /etc/systemd/system/gogs.service:
[Unit]
Description=Gogs
After=network-online.target postgresql.service
Wants=network-online.target
[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gogs
ExecStart=/home/git/gogs/gogs web
Restart=always
RestartSec=5
Environment=USER=git HOME=/home/git
# endurecimento básico
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=false
[Install]
WantedBy=multi-user.target
O WorkingDirectory não é decoração: o Gogs procura custom/conf/app.ini a partir dele. E o Environment=USER=git HOME=/home/git é o que faz o Git achar as chaves SSH certas.
sudo systemctl daemon-reload
sudo systemctl enable --now gogs
journalctl -u gogs -f
Abra http://SEU-SERVIDOR:3000 e responda ao assistente de instalação: tipo de banco, credenciais, domínio, URL da aplicação e a conta de administrador. Ao gravar, ele escreve tudo em /home/git/gogs/custom/conf/app.ini — é esse arquivo que você edita depois, nunca o do diretório conf/, que é sobrescrito na atualização.
Ou, se você prefere Docker
sudo mkdir -p /var/lib/gogs
docker run -d --name=gogs \
--restart=always \
-p 10022:22 -p 127.0.0.1:3000:3000 \
-v /var/lib/gogs:/data \
gogs/gogs:0.14.3
Todos os dados — repositórios, banco SQLite e configuração — ficam no volume /data. Faça backup dele e você tem backup do serviço inteiro. No container, o diretório custom é /data/gogs (no host, /var/lib/gogs/gogs): é lá que mora o conf/app.ini. O 10022 é a porta SSH publicada: informe-a como porta SSH no assistente, e os clones ficam com ssh://git@servidor:10022/usuario/repo.git. A porta 3000 ficou presa ao 127.0.0.1 porque o nginx da próxima seção é quem fala com o mundo.
Nginx na frente, com TLS
Não exponha a porta 3000 direto na internet. Coloque o Gogs atrás do nginx e feche o resto no firewall. Primeiro emita o certificado — com o nginx já instalado e o DNS de git.exemplo.com.br apontando para o servidor:
sudo apt install -y nginx certbot python3-certbot-nginx
sudo certbot certonly --nginx -d git.exemplo.com.br
Depois crie /etc/nginx/sites-available/gogs:
server {
listen 80;
server_name git.exemplo.com.br;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name git.exemplo.com.br;
ssl_certificate /etc/letsencrypt/live/git.exemplo.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.exemplo.com.br/privkey.pem;
# push grande não pode esbarrar no limite padrão de 1 MB
client_max_body_size 512m;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
sudo ln -s /etc/nginx/sites-available/gogs /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw deny 3000
Depois disso, ajuste o app.ini para o Gogs saber que está atrás de HTTPS — senão os links de clone saem errados. Atenção: desde o Gogs 0.13 a chave é EXTERNAL_URL; o antigo ROOT_URL, que aparece em muito tutorial, é ignorado:
[server]
EXTERNAL_URL = https://git.exemplo.com.br/
DOMAIN = git.exemplo.com.br
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
DISABLE_SSH = false
SSH_PORT = 22
E, num servidor exposto, feche o cadastro público. Essas opções ficam na seção [auth] — a antiga [service] deixou de ser lida na 0.13, assim como ENABLE_CAPTCHA, que virou ENABLE_REGISTRATION_CAPTCHA:
[auth]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
ENABLE_REGISTRATION_CAPTCHA = true
sudo systemctl restart gogs
Teste em uma aba anônima: a página inicial deve pedir login e o link “Cadastrar” não deve aparecer. Se aparecer, a configuração não foi lida — confira a seção e o caminho do arquivo.
Backup
São três coisas — banco, repositórios e configuração —, e o Gogs tem um comando próprio para juntá-las num único arquivo:
sudo mkdir -p /var/backups/gogs
sudo chown git:git /var/backups/gogs
cd /home/git/gogs
sudo -u git ./gogs backup \
--config /home/git/gogs/custom/conf/app.ini \
--target /var/backups/gogs
Se preferir na unha: os repositórios ficam em /home/git/gogs-repositories, a configuração em custom/ e o banco no PostgreSQL (pg_dump gogs) ou no arquivo SQLite. Sem os três, o restore não fecha. Para guardar a cópia fora do servidor, o rclone leva o arquivo para um bucket.
Atualizando
Como é binário único, atualizar é trocar o arquivo — com o serviço parado e o backup feito antes. Preserve o diretório custom/, onde fica o app.ini:
cd /home/git/gogs
sudo -u git ./gogs backup --config custom/conf/app.ini --target /var/backups/gogs
sudo systemctl stop gogs
cd /tmp && rm -rf /tmp/gogs
VER=0.14.3 # a nova versão
curl -fLO https://github.com/gogs/gogs/releases/download/v${VER}/gogs_v${VER}_linux_amd64.tar.gz
tar xzf gogs_v${VER}_linux_amd64.tar.gz
sudo cp -a /home/git/gogs/custom /tmp/gogs/
sudo mv /home/git/gogs /home/git/gogs.old
sudo mv /tmp/gogs /home/git/gogs
sudo chown -R git:git /home/git/gogs
sudo systemctl start gogs
Saltos de versão às vezes exigem migração de banco, que roda sozinha na primeira subida. Leia o changelog antes — é curto. Depois de conferir que tudo subiu, apague /home/git/gogs.old.
O post original (abril de 2017)
Preservado como registro. O script abaixo instalava o Gogs no Ubuntu 16.04 e não deve ser usado hoje:
## Script Install on Debian, Ubuntu, OpenSUSE 64Bits !!!
wget https://gist.githubusercontent.com/jniltinho/280573e10206e31ab1c7/raw/6d9eb2c6abff9d61f903b2704c50926915b531cb/install_gogs_ubuntu.sh
bash install_gogs_ubuntu.sh
Gist original: jniltinho/280573e10206e31ab1c7
Vídeo de instalação do Gogs (2017)
Links
- gogs.io · github.com/gogs/gogs · imagem Docker
- Gitea · Forgejo
- Aqui no blog: Gitea com Actions e runner · DevOps: o que é CI/CD? · A história do Git · A história do GitLab · Instalando o Go no Linux
Gogs continua sendo o jeito mais enxuto de ter Git com interface web no seu próprio servidor: um binário, um usuário, um banco e um app.ini com as chaves certas. Quando faltar CI, o caminho natural é o Gitea ou o Forgejo — a estrutura do servidor continua a mesma.