Introdução
Gitea é um repositório de código fonte baseado no sistema de controle de versão, Git. Embora existam várias soluções auto-hospedadas disponíveis, como GitLab e Gogs, o Gitea tem a vantagem de ser leve, o que significa que pode ser executado em um servidor relativamente pequeno.
No entanto, ter um servidor pequeno, especialmente no âmbito dos VPSes, muitas vezes significa ter espaço limitado. Felizmente, muitos provedores de hospedagem também oferecem armazenamento adicional na forma de volumes externos, armazenamento de bloco ou armazenamento de arquivos em rede (NFS). Isso dá aos usuários a opção de economizar dinheiro em hosts VPS menores para suas aplicações sem sacrificar o armazenamento.
Com o Gitea e a capacidade de decidir onde seu código fonte é armazenado, você pode garantir que seus projetos e arquivos tenham espaço para expandir. Neste tutorial, você irá montar um volume de armazenamento externo em um ponto de montagem e garantir que o Gitea esteja lendo as informações apropriadas desse volume. Ao final, você terá uma instalação do Gitea que armazena repositórios e outras informações importantes em um volume de armazenamento separado.
Pré-requisitos
Antes de começar, você precisará do seguinte:
- Um servidor Ubuntu 20.04 configurado de acordo com o nosso guia de configuração inicial do servidor para Ubuntu 20.04, com um usuário não-root com privilégios sudo e um firewall ativado.
- Um volume externo, como um volume NFS ou de armazenamento em bloco. Se desejar configurar um Volume de Armazenamento em Bloco da DigitalOcean, siga a nossa documentação do produto.
- Uma instalação do Gitea nesse servidor acessível por meio de um nome de domínio. Este guia pressupõe que você tenha instalado o Gitea no Docker, conforme descrito em nosso tutorial sobre Como Instalar o Gitea no Ubuntu 20.04. Observe que isso exigirá que você tenha o Docker e o Docker Compose instalados em seu servidor. Você pode instalar essas ferramentas seguindo as etapas nesses tutoriais:
- Passos 1 e 2 de Como Instalar e Usar o Docker no Ubuntu 20.04
- Passo 1 de Como Instalar e Usar o Docker Compose no Ubuntu 20.04
Observe que se você instalou o Gitea usando um método diferente do descrito nesses pré-requisitos, os nomes e locais de determinados arquivos e diretórios em seu sistema podem ser diferentes do que este guia menciona nos exemplos. No entanto, os conceitos delineados neste tutorial devem ser aplicáveis a qualquer instalação do Gitea.
Passo 1 — Montando um Volume de Armazenamento de Bloco
A volume can take many different forms. It could be an NFS volume, which is storage available on the network provided via a file share. Another possibility is that it takes the form of block storage via a service such as DigitalOcean’s Volumes. In both cases, storage is mounted on a system using the mount
command.
Volumes como estes serão visíveis como arquivos de dispositivo armazenados dentro de /dev
. Esses arquivos são como o kernel se comunica com os dispositivos de armazenamento em si; os arquivos na verdade não são usados para armazenamento. Para poder armazenar arquivos no dispositivo de armazenamento, você precisará montá-los usando o comando mount
.
Primeiro, você precisará criar um ponto de montagem — ou seja, uma pasta que será associada ao dispositivo, de modo que os dados armazenados dentro dela sejam armazenados nesse dispositivo. Pontos de montagem para dispositivos de armazenamento como este geralmente ficam no diretório /mnt
.
Crie um ponto de montagem chamado gitea
como você criaria um diretório normal usando o comando mkdir
:
A partir daqui, você pode montar o dispositivo naquele diretório para usá-lo para acessar aquele espaço de armazenamento. Use o comando mount
para montar o dispositivo:
A string ext4
especifica o tipo de sistema de arquivos, ext4 neste caso, embora, dependendo do tipo de sistema de arquivos do seu volume, possa ser algo como xfs
ou nfs
; para verificar qual tipo seu volume usa, execute o comando mount
sem opções:
Isso fornecerá uma linha de saída para cada sistema de arquivos montado. Como você acabou de montar o seu, provavelmente será o último da lista:
Output. . .
/dev/sda on /mnt/gitea type ext4 (rw,noatime,discard)
Isso mostra que o tipo de sistema de arquivos é ext4
.
Este comando monta o dispositivo especificado pelo seu ID em /mnt/gitea
. A opção -o
especifica as opções usadas durante a montagem. Neste caso, você está usando as opções padrão que permitem a montagem de um sistema de arquivos de leitura/gravação, e a opção noatime
especifica que o kernel não deve atualizar o tempo de acesso para arquivos e diretórios no dispositivo para ser mais eficiente.
Agora que você montou seu dispositivo, ele permanecerá montado enquanto o sistema estiver ligado e em funcionamento. No entanto, assim que o sistema reiniciar, ele não será mais montado (embora os dados permaneçam no volume), então você precisará dizer ao sistema para montar o volume assim que ele iniciar usando o arquivo /etc/fstab
(‘tabela de sistemas de arquivos’). Este arquivo lista os sistemas de arquivos disponíveis e seus pontos de montagem em um formato delimitado por tabulação.
Usando echo
e tee
, adicione uma nova linha ao final de /etc/fstab
:
Este comando anexa a string /dev/disk/by-uid/seu_id_de_disco
ao arquivo fstab
e a imprime na tela. Assim como o comando mount
anterior, ele monta o dispositivo no ponto de montagem usando as opções defaults
, nofail
e noatime
.
Assim que suas alterações forem feitas no arquivo /etc/fstab
, o kernel montará seu volume durante a inicialização.
Observação: Os dispositivos de armazenamento no Linux são muito flexíveis e vêm em todos os tipos diferentes, desde um sistema de arquivos em rede (NFS) até um velho disco rígido comum. Para saber mais sobre armazenamento em bloco e dispositivos no Linux, você pode ler mais sobre os conceitos de armazenamento em nosso Introdução à Terminologia e Conceitos de Armazenamento no Linux.
Passo 2 — Configurando o Gitea para Armazenar Dados em um Volume de Armazenamento em Bloco
O Gitea mantém todos os seus repositórios em um local centralizado. Isso inclui repositórios de todos os usuários e organizações. A menos que configurado de outra forma, todas as informações são mantidas em um único diretório. Este diretório é chamado de data
em instalações padrão. Para os propósitos deste tutorial, estaremos usando uma versão do Gitea executada no Docker, como no tutorial vinculado acima.
Primeiro, vamos ter uma ideia do que este diretório de dados contém. Você pode fazer isso movendo-se para o diretório de dados e executando o comando ls
. Usar o formato -l
nos fornecerá mais informações sobre os arquivos:
Isso fornecerá uma listagem como a seguinte:
Outputtotal 20
drwxr-xr-x 5 root root 4096 Jun 23 22:34 ./
drwxrwxr-x 3 sammy sammy 4096 Jun 26 22:35 ../
drwxr-xr-x 5 git git 4096 Jun 23 22:42 git/
drwxr-xr-x 12 git git 4096 Jun 26 22:35 gitea/
drwx------ 2 root root 4096 Jun 23 22:34 ssh/
Vamos analisar a saída deste comando. Ele lista um arquivo ou diretório por linha. Neste caso, lista cinco diretórios. A entrada para .
é uma entrada especial que significa apenas o diretório atual, e ..
representa o diretório um nível acima. Esta saída mostra que o diretório atual é de propriedade do usuário root, o que é o caso nesta instância porque o Docker é executado como um usuário privilegiado, e o diretório um nível acima é de propriedade de sammy.
O diretório git
é importante para nós porque contém todos os repositórios que podemos querer armazenar em um volume separado. Liste o conteúdo do diretório:
Isso fornecerá a listagem longa do diretório:
Outputtotal 24
drwxr-xr-x 5 git git 4096 Jun 23 22:42 ./
drwxr-xr-x 6 root root 4096 Jun 27 14:21 ../
-rw-r--r-- 1 git git 190 Jun 23 22:42 .gitconfig
drwxr-xr-x 2 root root 4096 Jun 23 22:34 .ssh/
drwxr-xr-x 2 git git 4096 Jun 23 22:42 lfs/
drwxr-xr-x 5 git git 4096 Jun 30 20:03 repositories/
Dentro dele estão dois diretórios de destaque: o diretório repositories
que contém os repositórios Git gerenciados pelo Gitea ordenados por usuário/organização, e o diretório lfs
contendo dados para a funcionalidade de Armazenamento de Arquivos Grandes (LFS) do Git. O diretório gitea
contém informações que o Gitea utiliza nos bastidores, incluindo arquivos de repositórios antigos, bem como o banco de dados que contém informações como usuários e informações de repositório usadas pelo serviço web. O diretório ssh
contém vários pares de chaves SSH que o Gitea utiliza.
Dado que todas as informações armazenadas neste diretório são importantes, você vai querer incluir o conteúdo completo do diretório no nosso volume anexado.
Existem dois caminhos a seguir a partir deste ponto, dependendo se você está trabalhando com uma nova instalação do Gitea e completando este tutorial durante o processo de instalação. No primeiro caminho, você poderá especificar locais antes de concluir a instalação, e no segundo, aprenderá como mover uma instalação existente.
Configurando uma Nova Instalação do Gitea
Se você estiver começando com uma instalação completamente nova do Gitea, pode especificar onde todas as suas informações são armazenadas durante o processo de configuração. Por exemplo, se estiver configurando o Gitea usando o Docker Compose, pode mapear os volumes para o seu volume anexado.
Abra o arquivo docker-compose.yml
com o seu editor de texto preferido. O exemplo a seguir utiliza o nano
:
Assim que tiver o arquivo aberto, procure a entrada volumes
no arquivo de composição e modifique o mapeamento no lado esquerdo do :
para apontar para os locais apropriados no seu volume de armazenamento em bloco para o diretório de dados do Gitea
Quando terminar de configurar as informações, salve e feche o arquivo. Se estiver usando o nano
, pode fazer isso pressionando CTRL + X
, Y
, e depois ENTER
.
Aviso: Os servidores SSH procuram pelo diretório .ssh
no diretório inicial do usuário Git (git, neste caso). Este diretório contém todas as chaves SSH que o Gitea irá utilizar, portanto, não é aconselhável mover o ponto de montagem para este volume Docker. Para ter este local incluído no backup do seu volume, seria melhor utilizar outra solução, como um trabalho cron
para fazer o backup do diretório. Para saber mais, confira este tutorial sobre como usar o cron
para gerenciar tarefas agendadas.
Ao executar o docker-compose
e instalar o Gitea, ele usará seu volume de armazenamento de blocos para armazenar seus dados.
Se você não estiver utilizando volumes Docker para gerenciar os locais dos seus dados — por exemplo, se estiver instalando o Gitea no seu servidor através dos lançamentos binários conforme estas instruções do Gitea — então você precisará modificar os locais dentro do arquivo de configuração (normalmente /etc/gitea/app.ini
) quando estiver definindo todos os valores e antes de realizar as etapas finais de instalação no navegador. Por exemplo, você pode defini-los da seguinte forma:
Nota: Certifique-se de que seu usuário git tenha acesso de escrita a este local. Você pode ler sobre permissões no Linux aqui.
Movendo uma Instalação Existente do Gitea
Se você já tem uma instância do Gitea instalada e em execução, ainda será possível armazenar seus dados em um volume separado, mas exigirá cuidado para garantir que todos os seus dados permaneçam seguros e acessíveis ao Gitea.
Nota: Como em qualquer operação envolvendo seus dados, é importante garantir que você tenha um backup atualizado de tudo. Neste caso, isso significa um backup de todos os arquivos no seu diretório de dados (os arquivos SSH, os diretórios gitea-repositories
e lfs
, o banco de dados, etc.) para um local seguro.
Existem duas opções para mover seus dados para um novo volume. A primeira maneira é copiar seus dados do Gitea para uma localização secundária e, em seguida, transformar a localização original em um ponto de montagem para seu volume. Quando você copia seus dados de volta para essa localização, estará copiando para esse volume, e nenhuma alteração será necessária dentro do próprio Gitea; ele simplesmente continuará como antes. Se, no entanto, você não quiser montar o dispositivo inteiro nesse destino (por exemplo, se seus dados do Gitea não forem a única coisa nesse volume), então uma segunda opção é mover todos os seus dados do Gitea para uma nova localização nesse volume e instruir o próprio Gitea a usar essa localização.
Independentemente da opção que você escolher, primeiro pare o serviço web do Gitea.
Se você instalou o Gitea via Docker Compose, use docker-compose
para parar o serviço. Enquanto estiver no mesmo diretório que contém o arquivo docker-compose.yml
, execute:
Se você o instalou como um serviço systemd, use o comando systemctl
:
Depois que o Gitea for parado, mova todo o conteúdo do diretório de dados para o ponto de montagem feito na Etapa 1:
Assegure-se de que todos os arquivos tenham sido movidos listando o conteúdo do diretório atual:
Isso apenas retornará as entradas de diretório atual e pai:
total 8
drwxrwxr-x 2 sammy sammy 4096 Jun 27 13:56 ./
drwxr-xr-x 7 sammy sammy 4096 Jun 27 13:56 ../
Depois que todos os dados tiverem sido movidos, mude para o novo diretório de dados:
Usando ls
, assegure-se de que tudo pareça correto:
Isso mostrará o conteúdo do diretório:
Outputtotal 36
drwxr-xr-x 6 root root 4096 Jun 27 14:21 ./
drwxr-xr-x 3 root root 4096 Jun 27 14:21 ../
drwxr-xr-x 5 git git 4096 Jun 23 22:42 git/
drwxr-xr-x 13 git git 4096 Jul 11 08:25 gitea/
drwx------ 2 root root 16384 Jun 27 03:46 lost+found/
drwx------ 2 root root 4096 Jun 23 22:34 ssh/
Como antes, deve conter os diretórios ssh
, git
e gitea
. Se estiver a usar o SQLite como base de dados para gerir o Gitea, também conterá um ficheiro chamado gitea.db
no diretório gitea
.
Quando tiver certeza de que todos os dados foram movidos, é hora de montar o volume no diretório de dados.
Primeiro, mova-se para o diretório pai do diretório de dados em que estava anteriormente. Neste exemplo, usando uma instalação do Gitea usando o Docker Compose, conforme descrito no tutorial vinculado nos pré-requisitos, este é o diretório que contém o seu ficheiro docker-compose.yml
.
Como antes, use o comando mount
, mas desta vez, use o diretório que acabou de esvaziar como destino:
Agora, quando listar o conteúdo desse diretório, todos os seus ficheiros devem estar no lugar:
Este comando vai produzir a informação esperada. Note que, dependendo do tipo de sistema de ficheiros do seu volume, pode encontrar um diretório adicional chamado lost+found
; isso é normal e faz parte do uso quotidiano do sistema de ficheiros:
total 36
drwxr-xr-x 6 root root 4096 Jun 27 13:58 ./
drwxrwxr-x 3 sammy sammy 4096 Jun 27 02:23 ../
drwxr-xr-x 5 git git 4096 Jun 23 22:42 git/
drwxr-xr-x 12 git git 4096 Jun 27 00:00 gitea/
drwx------ 2 root root 16384 Jun 27 03:46 lost+found/
drwx------ 2 root root 4096 Jun 23 22:34 ssh/
Como mencionado, se desejar que o Gitea utilize um diretório dentro do volume de armazenamento de bloco, há uma etapa adicional que precisa completar antes de reiniciar o Gitea. Por exemplo, digamos que deseja usar uma pasta chamada scm
no seu volume montado em /mnt/gitea
. Após mover todos os seus dados do Gitea para /mnt/gitea/scm
, precisará criar um link simbólico do seu antigo diretório de dados para o novo. Para isso, usará o comando ln
:
Neste ponto, você pode reiniciar o Gitea. Se estiver usando o Gitea como um serviço systemd, execute:
Se estiver executando o Gitea como um contêiner Docker usando o Docker Compose, execute:
Agora que tudo está em funcionamento, visite sua instância do Gitea no navegador e verifique se tudo funciona como esperado. Você deverá ser capaz de criar novos objetos no Gitea, como repositórios, problemas, e assim por diante. Se configurou o Gitea com um “SSH shim”, você também deverá ser capaz de fazer check-out e enviar para repositórios usando git clone
e git push
.
Conclusão
Neste tutorial, você moveu todos os seus dados do Gitea para um volume de armazenamento em bloco. Volumes como esses são muito flexíveis e oferecem muitos benefícios, como permitir que você armazene todos os seus dados em discos maiores, volumes RAID, sistemas de arquivos em rede, ou usando armazenamento em bloco como Volumes da DigitalOcean para reduzir despesas de armazenamento. Também permite que você faça snapshots de discos inteiros para backup, para que possa restaurar seu conteúdo em caso de falha catastrófica.