
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.

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.io · github.com/gogs/gogs · imagen Docker
- Gitea · Forgejo
- Aquí en el blog: Gitea con Actions y runner · DevOps: ¿qué es CI/CD? · La historia de Git · La historia de GitLab · Instalando Go en Linux
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.