Como Armazenar Repositórios Gitea em um Volume Separado

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:

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:

  1. sudo mkdir /mnt/gitea

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:

  1. sudo mount -t ext4 -o defaults,noatime /dev/disk/by-id/your_disk_id /mnt/gitea

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:

  1. mount

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:

  1. echo '/dev/disk/by-id/your_disk_id /mnt/gitea ext4 defaults,nofail,noatime 0 0' | sudo tee /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:

  1. cd gitea
  2. ls -l

Isso fornecerá uma listagem como a seguinte:

Output
total 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:

  1. ls -l git

Isso fornecerá a listagem longa do diretório:

Output
total 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:

  1. nano docker-compose.yml

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

docker-compose.yml
...

    volumes:
      - /mnt/gitea:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

...

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:

app.ini
...

# Se estiver usando SQLite para seu banco de dados, será necessário alterar o CAMINHO
# variável nesta seção
[database]
...
PATH = /mnt/gitea/gitea.db

[server]
...
LFS_CONTENT_PATH = /mnt/gitea/lfs

[repository]
ROOT = /mnt/gitea/gitea-repositories

...

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:

  1. docker-compose down

Se você o instalou como um serviço systemd, use o comando systemctl:

  1. sudo systemctl stop gitea

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:

  1. sudo mv * /mnt/gitea

Assegure-se de que todos os arquivos tenham sido movidos listando o conteúdo do diretório atual:

  1. ls -la

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:

  1. cd /mnt/gitea

Usando ls, assegure-se de que tudo pareça correto:

  1. ls -l

Isso mostrará o conteúdo do diretório:

Output
total 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.

  1. cd ~/gitea/

Como antes, use o comando mount, mas desta vez, use o diretório que acabou de esvaziar como destino:

  1. sudo mount -o defaults,noatime /dev/disk/by-id/your_disk_id gitea

Agora, quando listar o conteúdo desse diretório, todos os seus ficheiros devem estar no lugar:

  1. ls -la gitea

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:

  1. sudo ln -s /mnt/gitea/scm gitea

Neste ponto, você pode reiniciar o Gitea. Se estiver usando o Gitea como um serviço systemd, execute:

  1. sudo systemctl restart gitea

Se estiver executando o Gitea como um contêiner Docker usando o Docker Compose, execute:

  1. docker-compose up -d

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.

Source:
https://www.digitalocean.com/community/tutorials/how-to-store-gitea-repositories-on-a-separate-volume