{"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-09-08T10:05:34","modified_gmt":"2026-09-08T13:05:34","slug":"instalando-gogs-no-ubuntu","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/instalando-gogs-no-ubuntu\/","title":{"rendered":"Instalando Gogs no Ubuntu"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro conectando o cabo no servidor Gogs, com o gopher do Go acompanhando a instala\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2026\/09\/gogs-v3.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 em tr\u00eas sabores; o post original de 2017 fica preservado no fim.<\/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 joga o arquivo no servidor, aponta para um banco e tem uma interface parecida com a do GitHub rodando com uns 100 MB de RAM. \u00c9 a raz\u00e3o de ele ainda fazer 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 s\u00e3o o mesmo c\u00f3digo na origem. 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>1.27.3 (ago\/2026)<\/td>\n<td>16.0.3 (ago\/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>Regra pr\u00e1tica: se voc\u00ea quer <strong>s\u00f3 Git com interface web<\/strong>, no 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 empurrando<\/strong>, v\u00e1 de Gitea ou Forgejo \u2014 a instala\u00e7\u00e3o abaixo \u00e9 praticamente id\u00eantica nos tr\u00eas, mudando o nome do bin\u00e1rio.<\/p>\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 login)\nsudo adduser --system --group --disabled-password --home \/home\/git --shell \/bin\/bash git<\/code><\/pre>\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>.<\/p>\n<h2>Ou, se voc\u00ea prefere Docker<\/h2>\n<pre><code class=\"language-bash\">docker run -d --name=gogs \n  --restart=always \n  -p 10022:22 -p 3000:3000 \n  -v \/var\/lib\/gogs:\/data \n  gogs\/gogs:0.14.3<\/code><\/pre>\n<p>Os dados todos \u2014 reposit\u00f3rios, banco SQLite e configura\u00e7\u00e3o \u2014 vivem no volume <code>\/data<\/code>. Fa\u00e7a backup dele e voc\u00ea tem backup do servi\u00e7o inteiro. O <code>10022<\/code> \u00e9 a porta SSH do container: os clones ficam com <code>ssh:\/\/git@servidor:10022\/usuario\/repo.git<\/code>.<\/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:<\/p>\n<pre><code class=\"language-nginx\">server {\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 certbot --nginx -d git.exemplo.com.br\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:<\/p>\n<pre><code class=\"language-ini\">[server]\nDOMAIN       = git.exemplo.com.br\nROOT_URL     = https:\/\/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:<\/p>\n<pre><code class=\"language-ini\">[service]\nDISABLE_REGISTRATION   = true\nREQUIRE_SIGNIN_VIEW    = true\nENABLE_CAPTCHA         = true<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo systemctl restart gogs<\/code><\/pre>\n<h2>Backup<\/h2>\n<p>S\u00e3o tr\u00eas coisas, e o Gogs tem comando pr\u00f3prio para junt\u00e1-las:<\/p>\n<pre><code class=\"language-bash\">sudo -u git \/home\/git\/gogs\/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.<\/p>\n<h2>Atualizando<\/h2>\n<p>Como \u00e9 bin\u00e1rio \u00fanico, atualizar \u00e9 trocar o arquivo \u2014 mas com o servi\u00e7o parado e o backup feito antes:<\/p>\n<pre><code class=\"language-bash\">sudo -u git \/home\/git\/gogs\/gogs backup --target \/var\/backups\/gogs\nsudo systemctl stop gogs\n# baixe e extraia a nova vers\u00e3o, substituindo \/home\/git\/gogs\nsudo chown -R git:git \/home\/git\/gogs\nsudo systemctl start gogs<\/code><\/pre>\n<p>Saltos de vers\u00e3o do Gogs \u00e0s vezes exigem migra\u00e7\u00e3o de banco, que roda sozinha na primeira subida. Leia o changelog da vers\u00e3o antes \u2014 \u00e9 curto.<\/p>\n<hr \/>\n<h2>O post original (abril de 2017)<\/h2>\n<p>Preservado como registro. Os scripts abaixo instalavam o Gogs em Ubuntu 16.04 e n\u00e3o devem ser usados 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 no Debian (2017)<\/h3>\n<p><iframe style=\"width:100%;aspect-ratio:16\/9;border:0\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/77lQMB3bExg\" 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><\/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\/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","protected":false},"excerpt":{"rendered":"<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 joga o arquivo no servidor, aponta para um banco e tem uma interface parecida com a do GitHub &#8230; <a title=\"Instalando Gogs no Ubuntu\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/instalando-gogs-no-ubuntu\/\" aria-label=\"Read more about Instalando Gogs no Ubuntu\">Read more<\/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":[14,4,5],"class_list":["post-121","post","type-post","status-publish","format-standard","hentry","category-linux","category-ubuntu","tag-howto","tag-linux","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=121"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/121\/revisions"}],"predecessor-version":[{"id":1307,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/121\/revisions\/1307"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}