{"id":121,"date":"2017-04-05T11:28:54","date_gmt":"2017-04-05T14:28:54","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/04\/instalando-gogs-no-ubuntu\/"},"modified":"2026-10-05T13:45:44","modified_gmt":"2026-10-05T16:45:44","slug":"instalando-gogs-no-ubuntu","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2017\/04\/instalando-gogs-no-ubuntu\/","title":{"rendered":"Instalando Gogs en Ubuntu y Debian"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro conectando um cabo de rede no servidor de homelab com o logo do Gogs, monitor com a interface de reposit\u00f3rios e o cachorro caramelo deitado ao lado\" src=\"\/wp-content\/uploads\/2026\/10\/gogs-v4.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> Texto original de abril de 2017, quando a instala\u00e7\u00e3o era um script para Ubuntu 16.04. O Gogs continua vivo \u2014 <strong>0.14.3<\/strong>, de junho de 2026 \u2014, mas o ecossistema se dividiu: o <strong>Gitea<\/strong> (fork de 2016) e o <strong>Forgejo<\/strong> (fork do Gitea, de 2022) s\u00e3o hoje mais ativos. Abaixo, o caminho atual; o post original de 2017 fica preservado no fim. <em>Revisado em 05\/10\/2026: configura\u00e7\u00e3o atualizada para as chaves do Gogs 0.13+, comandos corrigidos e diagrama da arquitetura.<\/em><\/div>\n<p>O Gogs \u00e9 um servidor Git self-hosted escrito em Go: um bin\u00e1rio \u00fanico, sem Ruby, sem Node, sem fila, sem Redis. Voc\u00ea coloca o arquivo no servidor, aponta para um banco e tem uma interface web parecida com a do GitHub, com consumo baixo de mem\u00f3ria. \u00c9 por isso que ele ainda faz sentido num VPS pequeno, num Raspberry Pi ou numa m\u00e1quina interna de empresa \u2014 casos em que o GitLab simplesmente n\u00e3o cabe.<\/p>\n<h2>Gogs, Gitea ou Forgejo: qual instalar<\/h2>\n<p>Os tr\u00eas v\u00eam do mesmo c\u00f3digo. A separa\u00e7\u00e3o foi de governan\u00e7a, n\u00e3o de tecnologia:<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Gogs<\/th>\n<th>Gitea<\/th>\n<th>Forgejo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Origem<\/strong><\/td>\n<td>Original, 2014<\/td>\n<td>Fork do Gogs, 2016<\/td>\n<td>Fork do Gitea, 2022 (Codeberg)<\/td>\n<\/tr>\n<tr>\n<td><strong>Vers\u00e3o atual<\/strong><\/td>\n<td>0.14.3 (jun\/2026)<\/td>\n<td>28.0.0 (set\/2026)<\/td>\n<td>16.0.5 (set\/2026)<\/td>\n<\/tr>\n<tr>\n<td><strong>Licen\u00e7a<\/strong><\/td>\n<td>MIT<\/td>\n<td>MIT<\/td>\n<td>GPL-3.0<\/td>\n<\/tr>\n<tr>\n<td><strong>Ritmo<\/strong><\/td>\n<td>Lento, poucas m\u00e3os<\/td>\n<td>R\u00e1pido, comunidade grande<\/td>\n<td>R\u00e1pido, governan\u00e7a coletiva<\/td>\n<\/tr>\n<tr>\n<td><strong>CI embutido<\/strong><\/td>\n<td>N\u00e3o<\/td>\n<td>Gitea Actions<\/td>\n<td>Forgejo Actions<\/td>\n<\/tr>\n<tr>\n<td><strong>Registro de pacotes<\/strong><\/td>\n<td>N\u00e3o<\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<\/tr>\n<tr>\n<td><strong>Consumo<\/strong><\/td>\n<td>O mais leve<\/td>\n<td>Leve<\/td>\n<td>Leve<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>O Gitea saltou da s\u00e9rie 1.27 direto para a <strong>28.0.0<\/strong> em setembro de 2026: \u00e9 uma mudan\u00e7a no esquema de numera\u00e7\u00e3o, n\u00e3o 27 vers\u00f5es perdidas.<\/p>\n<p>Regra pr\u00e1tica: se voc\u00ea quer <strong>s\u00f3 Git com interface web<\/strong>, com o menor consumo poss\u00edvel, o Gogs entrega e continua recebendo corre\u00e7\u00f5es. Se voc\u00ea quer <strong>CI, registro de pacotes e um projeto com muita gente contribuindo<\/strong>, v\u00e1 de Gitea ou Forgejo \u2014 o passo a passo com runner de Actions est\u00e1 no post <a href=\"\/2026\/09\/gitea-git-self-hosted-runner-tea\/\">Gitea: Git self-hosted com Actions, runner e tea CLI<\/a>. A estrutura abaixo (usu\u00e1rio <code>git<\/code>, systemd, nginx, backup) vale para os tr\u00eas; o que muda \u00e9 o bin\u00e1rio e as chaves do <code>app.ini<\/code>.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/gogs-arquitetura-nginx-ssh.webp\" alt=\"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\u00f3rios e no app.ini, e o gogs backup junta os tr\u00eas\" width=\"1200\" height=\"600\" \/><figcaption>Um servidor, um bin\u00e1rio: nginx na frente para HTTPS, o sshd do sistema para Git via SSH e a porta 3000 fechada para o mundo.<\/figcaption><\/figure>\n<h2>Preparando o servidor<\/h2>\n<p>Vale para Ubuntu 24.04\/26.04 e Debian 12\/13. O Gogs precisa de pouca coisa: <code>git<\/code>, um usu\u00e1rio de sistema e um banco.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y git curl\n\n# usu\u00e1rio de sistema dedicado, sem senha\nsudo adduser --system --group --disabled-password --home \/home\/git --shell \/bin\/bash git<\/code><\/pre>\n<p>O usu\u00e1rio precisa de shell porque o Git via SSH entra por ele: o Gogs grava em <code>\/home\/git\/.ssh\/authorized_keys<\/code> uma linha por chave que for\u00e7a o comando <code>gogs serv<\/code>, sem pty e sem encaminhamento de portas.<\/p>\n<p>Para o banco, escolha um dos dois. <strong>SQLite<\/strong> resolve para uso pessoal ou equipe pequena e n\u00e3o exige nada al\u00e9m do pr\u00f3prio bin\u00e1rio. <strong>PostgreSQL<\/strong> \u00e9 o que voc\u00ea quer se houver mais de um punhado de pessoas:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y postgresql\nsudo -u postgres psql -c \"CREATE ROLE gogs WITH LOGIN PASSWORD 'troque-esta-senha';\"\nsudo -u postgres psql -c \"CREATE DATABASE gogs WITH OWNER gogs ENCODING 'UTF8';\"<\/code><\/pre>\n<h2>Instalando o bin\u00e1rio<\/h2>\n<pre><code class=\"language-bash\">cd \/tmp\nVER=0.14.3\nARCH=amd64   # use arm64 num Raspberry Pi ou servidor ARM\n\ncurl -fLO https:\/\/github.com\/gogs\/gogs\/releases\/download\/v${VER}\/gogs_v${VER}_linux_${ARCH}.tar.gz\ntar xzf gogs_v${VER}_linux_${ARCH}.tar.gz\n\nsudo mv gogs \/home\/git\/gogs\nsudo chown -R git:git \/home\/git\/gogs<\/code><\/pre>\n<p>Confira antes de seguir:<\/p>\n<pre><code class=\"language-bash\">sudo -u git \/home\/git\/gogs\/gogs --version<\/code><\/pre>\n<h2>Rodando como servi\u00e7o no systemd<\/h2>\n<p>Crie <code>\/etc\/systemd\/system\/gogs.service<\/code>:<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=Gogs\nAfter=network-online.target postgresql.service\nWants=network-online.target\n\n[Service]\nType=simple\nUser=git\nGroup=git\nWorkingDirectory=\/home\/git\/gogs\nExecStart=\/home\/git\/gogs\/gogs web\nRestart=always\nRestartSec=5\nEnvironment=USER=git HOME=\/home\/git\n\n# endurecimento b\u00e1sico\nNoNewPrivileges=true\nPrivateTmp=true\nProtectSystem=full\nProtectHome=false\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>O <code>WorkingDirectory<\/code> n\u00e3o \u00e9 decora\u00e7\u00e3o: o Gogs procura <code>custom\/conf\/app.ini<\/code> a partir dele. E o <code>Environment=USER=git HOME=\/home\/git<\/code> \u00e9 o que faz o Git achar as chaves SSH certas.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable --now gogs\njournalctl -u gogs -f<\/code><\/pre>\n<p>Abra <code>http:\/\/SEU-SERVIDOR:3000<\/code> e responda ao assistente de instala\u00e7\u00e3o: tipo de banco, credenciais, dom\u00ednio, URL da aplica\u00e7\u00e3o e a conta de administrador. Ao gravar, ele escreve tudo em <code>\/home\/git\/gogs\/custom\/conf\/app.ini<\/code> \u2014 \u00e9 esse arquivo que voc\u00ea edita depois, nunca o do diret\u00f3rio <code>conf\/<\/code>, que \u00e9 sobrescrito na atualiza\u00e7\u00e3o.<\/p>\n<h2>Ou, se voc\u00ea prefere Docker<\/h2>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/lib\/gogs\ndocker run -d --name=gogs \\\n  --restart=always \\\n  -p 10022:22 -p 127.0.0.1:3000:3000 \\\n  -v \/var\/lib\/gogs:\/data \\\n  gogs\/gogs:0.14.3<\/code><\/pre>\n<p>Todos os dados \u2014 reposit\u00f3rios, banco SQLite e configura\u00e7\u00e3o \u2014 ficam no volume <code>\/data<\/code>. Fa\u00e7a backup dele e voc\u00ea tem backup do servi\u00e7o inteiro. No container, o diret\u00f3rio <code>custom<\/code> \u00e9 <code>\/data\/gogs<\/code> (no host, <code>\/var\/lib\/gogs\/gogs<\/code>): \u00e9 l\u00e1 que mora o <code>conf\/app.ini<\/code>. O <code>10022<\/code> \u00e9 a porta SSH publicada: informe-a como porta SSH no assistente, e os clones ficam com <code>ssh:\/\/git@servidor:10022\/usuario\/repo.git<\/code>. A porta 3000 ficou presa ao <code>127.0.0.1<\/code> porque o nginx da pr\u00f3xima se\u00e7\u00e3o \u00e9 quem fala com o mundo.<\/p>\n<h2>Nginx na frente, com TLS<\/h2>\n<p>N\u00e3o exponha a porta 3000 direto na internet. Coloque o Gogs atr\u00e1s do nginx e feche o resto no firewall. Primeiro emita o certificado \u2014 com o nginx j\u00e1 instalado e o DNS de <code>git.exemplo.com.br<\/code> apontando para o servidor:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y nginx certbot python3-certbot-nginx\nsudo certbot certonly --nginx -d git.exemplo.com.br<\/code><\/pre>\n<p>Depois crie <code>\/etc\/nginx\/sites-available\/gogs<\/code>:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name git.exemplo.com.br;\n    return 301 https:\/\/$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    http2 on;\n    server_name git.exemplo.com.br;\n\n    ssl_certificate     \/etc\/letsencrypt\/live\/git.exemplo.com.br\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/git.exemplo.com.br\/privkey.pem;\n\n    # push grande n\u00e3o pode esbarrar no limite padr\u00e3o de 1 MB\n    client_max_body_size 512m;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/gogs \/etc\/nginx\/sites-enabled\/\nsudo nginx -t &amp;&amp; sudo systemctl reload nginx\n\nsudo ufw allow OpenSSH\nsudo ufw allow 'Nginx Full'\nsudo ufw deny 3000<\/code><\/pre>\n<p>Depois disso, ajuste o <code>app.ini<\/code> para o Gogs saber que est\u00e1 atr\u00e1s de HTTPS \u2014 sen\u00e3o os links de clone saem errados. Aten\u00e7\u00e3o: desde o Gogs 0.13 a chave \u00e9 <code>EXTERNAL_URL<\/code>; o antigo <code>ROOT_URL<\/code>, que aparece em muito tutorial, \u00e9 ignorado:<\/p>\n<pre><code class=\"language-ini\">[server]\nEXTERNAL_URL = https:\/\/git.exemplo.com.br\/\nDOMAIN       = git.exemplo.com.br\nHTTP_ADDR    = 127.0.0.1\nHTTP_PORT    = 3000\nDISABLE_SSH  = false\nSSH_PORT     = 22<\/code><\/pre>\n<p>E, num servidor exposto, feche o cadastro p\u00fablico. Essas op\u00e7\u00f5es ficam na se\u00e7\u00e3o <code>[auth]<\/code> \u2014 a antiga <code>[service]<\/code> deixou de ser lida na 0.13, assim como <code>ENABLE_CAPTCHA<\/code>, que virou <code>ENABLE_REGISTRATION_CAPTCHA<\/code>:<\/p>\n<pre><code class=\"language-ini\">[auth]\nDISABLE_REGISTRATION        = true\nREQUIRE_SIGNIN_VIEW         = true\nENABLE_REGISTRATION_CAPTCHA = true<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo systemctl restart gogs<\/code><\/pre>\n<p>Teste em uma aba an\u00f4nima: a p\u00e1gina inicial deve pedir login e o link \u201cCadastrar\u201d n\u00e3o deve aparecer. Se aparecer, a configura\u00e7\u00e3o n\u00e3o foi lida \u2014 confira a se\u00e7\u00e3o e o caminho do arquivo.<\/p>\n<h2>Backup<\/h2>\n<p>S\u00e3o tr\u00eas coisas \u2014 banco, reposit\u00f3rios e configura\u00e7\u00e3o \u2014, e o Gogs tem um comando pr\u00f3prio para junt\u00e1-las num \u00fanico arquivo:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/backups\/gogs\nsudo chown git:git \/var\/backups\/gogs\ncd \/home\/git\/gogs\nsudo -u git .\/gogs backup \\\n  --config \/home\/git\/gogs\/custom\/conf\/app.ini \\\n  --target \/var\/backups\/gogs<\/code><\/pre>\n<p>Se preferir na unha: os reposit\u00f3rios ficam em <code>\/home\/git\/gogs-repositories<\/code>, a configura\u00e7\u00e3o em <code>custom\/<\/code> e o banco no PostgreSQL (<code>pg_dump gogs<\/code>) ou no arquivo SQLite. Sem os tr\u00eas, o restore n\u00e3o fecha. Para guardar a c\u00f3pia fora do servidor, o <a href=\"\/2026\/09\/rclone-no-linux-sync-backup-criptografado-mount-e-serve-em-qualquer-nuvem\/\">rclone<\/a> leva o arquivo para um bucket.<\/p>\n<h2>Atualizando<\/h2>\n<p>Como \u00e9 bin\u00e1rio \u00fanico, atualizar \u00e9 trocar o arquivo \u2014 com o servi\u00e7o parado e o backup feito antes. Preserve o diret\u00f3rio <code>custom\/<\/code>, onde fica o <code>app.ini<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd \/home\/git\/gogs\nsudo -u git .\/gogs backup --config custom\/conf\/app.ini --target \/var\/backups\/gogs\nsudo systemctl stop gogs\n\ncd \/tmp && rm -rf \/tmp\/gogs\nVER=0.14.3   # a nova vers\u00e3o\ncurl -fLO https:\/\/github.com\/gogs\/gogs\/releases\/download\/v${VER}\/gogs_v${VER}_linux_amd64.tar.gz\ntar xzf gogs_v${VER}_linux_amd64.tar.gz\nsudo cp -a \/home\/git\/gogs\/custom \/tmp\/gogs\/\nsudo mv \/home\/git\/gogs \/home\/git\/gogs.old\nsudo mv \/tmp\/gogs \/home\/git\/gogs\nsudo chown -R git:git \/home\/git\/gogs\nsudo systemctl start gogs<\/code><\/pre>\n<p>Saltos de vers\u00e3o \u00e0s vezes exigem migra\u00e7\u00e3o de banco, que roda sozinha na primeira subida. Leia o <a href=\"https:\/\/github.com\/gogs\/gogs\/blob\/main\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">changelog<\/a> antes \u2014 \u00e9 curto. Depois de conferir que tudo subiu, apague <code>\/home\/git\/gogs.old<\/code>.<\/p>\n<hr \/>\n<h2>O post original (abril de 2017)<\/h2>\n<p>Preservado como registro. O script abaixo instalava o Gogs no Ubuntu 16.04 e n\u00e3o deve ser usado hoje:<\/p>\n<pre><code class=\"language-bash\">## Script Install on Debian, Ubuntu, OpenSUSE 64Bits !!!\nwget https:\/\/gist.githubusercontent.com\/jniltinho\/280573e10206e31ab1c7\/raw\/6d9eb2c6abff9d61f903b2704c50926915b531cb\/install_gogs_ubuntu.sh\nbash install_gogs_ubuntu.sh<\/code><\/pre>\n<p>Gist original: <a href=\"https:\/\/gist.github.com\/jniltinho\/280573e10206e31ab1c7\" target=\"_blank\" rel=\"noopener\">jniltinho\/280573e10206e31ab1c7<\/a><\/p>\n<h3>V\u00eddeo de instala\u00e7\u00e3o do Gogs (2017)<\/h3>\n<p><iframe style=\"width:100%;aspect-ratio:16\/9;border:0\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/77lQMB3bExg\" title=\"Instalando Gogs no Linux\" allowfullscreen loading=\"lazy\"><\/iframe><\/p>\n<h2>Links<\/h2>\n<ul>\n<li><a href=\"https:\/\/gogs.io\/\" target=\"_blank\" rel=\"noopener\">gogs.io<\/a> \u00b7 <a href=\"https:\/\/github.com\/gogs\/gogs\" target=\"_blank\" rel=\"noopener\">github.com\/gogs\/gogs<\/a> \u00b7 <a href=\"https:\/\/github.com\/gogs\/gogs\/tree\/main\/docker\" target=\"_blank\" rel=\"noopener\">imagem Docker<\/a><\/li>\n<li><a href=\"https:\/\/about.gitea.com\/\" target=\"_blank\" rel=\"noopener\">Gitea<\/a> \u00b7 <a href=\"https:\/\/forgejo.org\/\" target=\"_blank\" rel=\"noopener\">Forgejo<\/a><\/li>\n<li>Aqui no blog: <a href=\"\/2026\/09\/gitea-git-self-hosted-runner-tea\/\">Gitea com Actions e runner<\/a> \u00b7 <a href=\"\/2019\/12\/devops-ci-cd\/\">DevOps: o que \u00e9 CI\/CD?<\/a> \u00b7 <a href=\"\/2026\/09\/a-historia-do-git\/\">A hist\u00f3ria do Git<\/a> \u00b7 <a href=\"\/2026\/09\/a-historia-do-gitlab\/\">A hist\u00f3ria do GitLab<\/a> \u00b7 <a href=\"\/2019\/12\/install-golang-linux\/\">Instalando o Go no Linux<\/a><\/li>\n<\/ul>\n<p>Gogs continua sendo o jeito mais enxuto de ter Git com interface web no seu pr\u00f3prio servidor: um bin\u00e1rio, um usu\u00e1rio, um banco e um <code>app.ini<\/code> com as chaves certas. Quando faltar CI, o caminho natural \u00e9 o Gitea ou o Forgejo \u2014 a estrutura do servidor continua a mesma.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gogs es un servidor Git autoalojado, baja base de datos, baja interfaz web escrita en Go: un \u00fanico binario, sin Ruby, sin Node, sin colas, sin Redis. Subes el archivo al servidor, lo apuntas a una base de datos y tienes una interfaz web parecida a la de \u2026 <a title=\"Instalando Gogs en Ubuntu y Debian\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2017\/04\/instalando-gogs-no-ubuntu\/\" aria-label=\"Leer m\u00e1s sobre Instalando Gogs no Ubuntu e Debian\">Leer m\u00e1s<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[15,48,516,14,4,240,203,5],"class_list":["post-121","post","type-post","status-publish","format-standard","hentry","category-linux","category-ubuntu","tag-debian","tag-git","tag-gogs","tag-howto","tag-linux","tag-nginx","tag-self-hosted","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=121"}],"version-history":[{"count":7,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/121\/revisions"}],"predecessor-version":[{"id":1782,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/121\/revisions\/1782"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}