Instalando Gogs no Ubuntu e Debian

Mascote do LinuxPro conectando um cabo de rede no servidor de homelab com o logo do Gogs, monitor com a interface de repositórios e o cachorro caramelo deitado ao lado

Nota (2026): Texto original de abril de 2017, quando a instalação era um script para Ubuntu 16.04. O Gogs continua vivo — 0.14.3, de junho de 2026 —, mas o ecossistema se dividiu: o Gitea (fork de 2016) e o Forgejo (fork do Gitea, de 2022) são hoje mais ativos. Abaixo, o caminho atual; o post original de 2017 fica preservado no fim. Revisado em 05/10/2026: configuração atualizada para as chaves do Gogs 0.13+, comandos corrigidos e diagrama da arquitetura.

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.

Arquitetura: o navegador acessa o nginx com TLS na porta 443 e o cliente git usa SSH na porta 22; o nginx encaminha para o Gogs em 127.0.0.1:3000 e o sshd chama gogs serv; o Gogs grava no banco, nos repositórios e no app.ini, e o gogs backup junta os três
Um servidor, um binário: nginx na frente para HTTPS, o sshd do sistema para Git via SSH e a porta 3000 fechada para o mundo.

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 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.