Instalando Gogs en Ubuntu y 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, cuando la instalación era un script para Ubuntu 16.04. Gogs sigue vivo — 0.14.3, de junio de 2026 —, pero el ecosistema se ha dividido: el Gitea (fork de 2016) y el Forgejo (fork de Gitea, de 2022) están hoy más activos. A continuación, el camino actual; la publicación original de 2017 se conserva al final. Revisado en 05/10/2026: configuración actualizada para las claves de Gogs 0.13+, comandos corregidos y diagrama de arquitectura.

Gogs es un servidor Git autoalojado escrito en Go: un único binario, sin Ruby, sin Node, sin cola, sin Redis. Colocas el archivo en el servidor, lo apuntas a una base de datos y obtienes una interfaz web similar a la de GitHub, con un bajo consumo de memoria. Por eso sigue teniendo sentido en un VPS pequeño, en una Raspberry Pi o en una máquina interna de empresa — casos en los que GitLab simplemente no encaja.

Gogs, Gitea o Forgejo: cuál instalar

Los tres provienen del mismo código. La separación fue de gobernanza, no de tecnología:

Gogs Gitea Forgejo
Origen Original, 2014 Fork de Gogs, 2016 Fork de Gitea, 2022 (Codeberg)
Versión actual 0.14.3 (jun/2026) 28.0.0 (set/2026) 16.0.5 (set/2026)
Licencia MIT MIT GPL-3.0
Ritmo Lento, pocas manos Rápido, comunidad grande Rápido, gobernanza colectiva
CI integrado No Gitea Actions Forgejo Actions
Registro de paquetes No Sí Sí
Consumo El más ligero Ligero Ligero

Gitea saltó de la serie 1.27 directamente a la 28.0.0 en septiembre de 2026: es un cambio en el esquema de numeración, no 27 versiones perdidas.

Regla práctica: si quieres solo Git con interfaz web, con el menor consumo posible, Gogs cumple y sigue recibiendo correcciones. Si quieres CI, registro de paquetes y un proyecto con mucha gente contribuyendo, vaya a Gitea o Forgejo — el paso a paso con runner de Actions está en el post Gitea: Git self-hosted con Actions, runner y tea CLI. La estructura siguiente (usuario git, systemd, nginx, copia de seguridad) vale para los tres; lo que cambia es el binario y las claves del 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
Un servidor, un binario: nginx delante para HTTPS, el sshd del sistema para Git vía SSH y el puerto 3000 cerrado al mundo.

Preparando el servidor

Vale para Ubuntu 24.04/26.04 y Debian 12/13. Gogs necesita pocas cosas: git, un usuario de sistema y una base de datos.

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

El usuario necesita shell porque Git vía SSH entra por él: Gogs escribe en /home/git/.ssh/authorized_keys una línea por clave que fuerza el comando gogs serv, sin pty y sin reenvío de puertos.

Para la base de datos, elige una de las dos. SQLite sirve para uso personal o un equipo pequeño y no exige nada más allá del propio binario. PostgreSQL es lo que quieres si hay más de un puñado de personas:

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 el binario

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

Comprueba antes de seguir:

sudo -u git /home/git/gogs/gogs --version

Ejecutando como servicio en systemd

Cree /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 no es decoración: Gogs busca custom/conf/app.ini a partir de él. Y el Environment=USER=git HOME=/home/git es lo que hace que Git encuentre las claves SSH correctas.

sudo systemctl daemon-reload
sudo systemctl enable --now gogs
journalctl -u gogs -f

Abre http://SEU-SERVIDOR:3000 y responda al asistente de instalación: tipo de base de datos, credenciales, dominio, URL de la aplicación y la cuenta de administrador. Al guardar, lo escribe todo en /home/git/gogs/custom/conf/app.ini — es ese archivo el que editarás después, nunca el del directorio conf/, que se sobrescribe en la actualización.

O, si prefieres 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 los datos — repositorios, base de datos SQLite y configuración — quedan en el volumen /data. Haz una copia de seguridad de él y tendrás una copia de seguridad de todo el servicio. En el contenedor, el directorio custom é /data/gogs (en el host, /var/lib/gogs/gogs): ahí es donde reside el conf/app.ini. El 10022 es el puerto SSH publicado: indíquelo como puerto SSH en el asistente y los clones se quedan con ssh://git@servidor:10022/usuario/repo.git. El puerto 3000 quedó atado a 127.0.0.1 porque el nginx de la siguiente sección es quien habla con el mundo.

Nginx delante, con TLS

No exponga el puerto 3000 directamente en internet. Coloque Gogs detrás de nginx y cierre el resto en el firewall. Primero emita el certificado — con nginx ya instalado y el DNS de git.exemplo.com.br apuntando al servidor:

sudo apt install -y nginx certbot python3-certbot-nginx
sudo certbot certonly --nginx -d git.exemplo.com.br

Después cree /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

Después de eso, ajusta el app.ini para que Gogs sepa que está detrás de HTTPS; si no, los enlaces de clone salen mal. Atención: desde Gogs 0.13 la clave es EXTERNAL_URL; el antiguo ROOT_URL, que aparece en muchos tutoriales, se ignora:

[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

Y, en un servidor expuesto, cierre el registro público. Estas opciones están en la sección [auth] — la antigua [service] dejó de leerse en la 0.13, al igual que ENABLE_CAPTCHA, que se convirtió ENABLE_REGISTRATION_CAPTCHA:

[auth]
DISABLE_REGISTRATION        = true
REQUIRE_SIGNIN_VIEW         = true
ENABLE_REGISTRATION_CAPTCHA = true
sudo systemctl restart gogs

Prueba en una pestaña de incógnito: la página de inicio debe pedir inicio de sesión y el enlace “Registrarse” no debe aparecer. Si aparece, la configuración no se ha leído: revisa la sección y la ruta del archivo.

Backup

Son tres cosas: base de datos, repositorios y configuración, y Gogs tiene su propio comando para juntarlas en un solo archivo:

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

Si prefieres a mano: los repositorios están en /home/git/gogs-repositories, la configuración en custom/ y la base de datos en PostgreSQL (pg_dump gogs) o en el archivo SQLite. Sin las tres, el restore no se completa. Para guardar la copia fuera del servidor, el rclone lleva el archivo a un bucket.

Actualizando

Como es un único binario, actualizar es cambiar el archivo, con el servicio detenido y la copia de seguridad hecha antes. Conserva el directorio custom/, donde está el 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

Los saltos de versión a veces exigen una migración de la base de datos, que se ejecuta sola en el primer arranque. Lee el changelog antes: es corto. Después de comprobar que todo ha arrancado, borra /home/git/gogs.old.


El post original (abril de 2017)

Conservado como registro. El siguiente script instalaba Gogs en Ubuntu 16.04 y no debe usarse hoy:

## 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 instalación de Gogs (2017)

Enlaces

Gogs sigue siendo la forma más ligera de tener Git con interfaz web en tu propio servidor: un binario, un usuario, una base de datos y un app.ini con las claves correctas. Cuando falte CI, el camino natural es Gitea o Forgejo: la estructura del servidor sigue siendo la misma.