Como armazenar repositórios do Gitea em um volume separado

Introdução

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 mundo 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 blocos ou armazenamento de arquivos em rede (NFS). Isso dá aos usuários a opção de economizar 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. No 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 que é descrito nestes pré-requisitos, os nomes e localizações de certos 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 em 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 não são realmente 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 naquele 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 nesse diretório para usá-lo para acessar esse 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 opção de 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 para /mnt/gitea. A opção -o especifica as opções usadas ao montar. Neste caso, você está usando as opções padrão que permitem montar um sistema de arquivos de leitura/gravação, e a opção noatime especifica que o kernel não deve atualizar o tempo de último 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 for reiniciado, ele não estará 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 imprime-o na sua tela. Assim como o comando mount anterior, ele monta o dispositivo no ponto de montagem usando as opções defaults, nofail e noatime.

Uma vez que suas alterações foram feitas no arquivo /etc/fstab, o kernel irá montar seu volume durante a inicialização.

Nota: Os dispositivos de armazenamento no Linux são muito flexíveis e vêm em diferentes tipos, desde um sistema de arquivos em rede (NFS) até um simples disco rígido. Para saber mais sobre armazenamento em bloco e dispositivos no Linux, você pode ler mais sobre conceitos de armazenamento em nosso Introdução aos Termos 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 executando em Docker conforme o 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. Usando o formato -l nos fornecerá mais informações sobre os arquivos:

  1. cd gitea
  2. ls -l

Isto 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, 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 do usuário 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

Isto fornecerá a listagem detalhada 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, existem dois diretórios de nota: o diretório repositories que contém os repositórios git gerenciados pelo Gitea classificados por usuário/organização, e o diretório lfs contendo dados para a funcionalidade de Armazenamento de Arquivos Grandes do Git. O diretório gitea contém informações que o Gitea usa 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órios 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 todo o conteúdo 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 os 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 nova instalação do Gitea, você pode especificar onde todas as suas informações serão armazenadas durante o processo de configuração. Por exemplo, se estiver configurando o Gitea usando o Docker Compose, você pode mapear os volumes para o seu volume anexado.

Abra o arquivo docker-compose.yml com o seu editor de texto preferido. O seguinte exemplo usa nano:

  1. nano docker-compose.yml

Depois de abrir o arquivo, procure pela 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, você pode fazer isso pressionando CTRL + X, Y e, em seguida, ENTER.

Aviso: Os servidores SSH procuram pelo diretório .ssh no diretório principal do usuário Git (git, neste caso). Este diretório contém todas as chaves SSH que o Gitea usará, então não é aconselhável mover o ponto de montagem para este volume do Docker. Para ter este local incluído no seu volume de backup, seria melhor usar outra solução como um trabalho cron para fazer backup do diretório. Para saber mais, confira este tutorial sobre como usar o cron para gerenciar tarefas agendadas.

Ao executar docker-compose e instalar o Gitea, ele usará seu volume de armazenamento em bloco para armazenar seus dados.

Se você não estiver usando volumes do Docker para gerenciar os locais dos seus dados — por exemplo, se estiver instalando o Gitea no seu servidor via releases binárias conforme essas instruções do Gitea — então 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á possui uma instância do Gitea instalada e em execução, ainda poderá armazenar seus dados em um volume separado, mas exigirá cuidados para garantir que todos os seus dados permaneçam seguros e acessíveis ao Gitea.

Nota: Assim 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 em seu diretório de dados (os arquivos SSH, os diretórios gitea-repositories e lfs, o banco de dados, e assim por diante) 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 um local secundário e, em seguida, transformar o local original em um ponto de montagem para o seu volume. Quando você copia seus dados de volta para esse local, estará copiando para esse volume e nenhuma alteração será necessária dentro do próprio Gitea; ele simplesmente continuará como antes. No entanto, se você não quiser montar o dispositivo inteiro nesse destino (por exemplo, se seus dados do Gitea não serão a única coisa nesse volume), então uma segunda opção é mover todos os seus dados do Gitea para um novo local nesse volume e instruir o próprio Gitea a usar esse local.

Independentemente da opção escolhida, 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 dentro do mesmo diretório contendo 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 interrompido, mova todo o conteúdo do diretório de dados para o ponto de montagem feito no Passo 1:

  1. sudo mv * /mnt/gitea

Certifique-se de que todos os arquivos foram movidos listando o conteúdo do diretório atual:

  1. ls -la

Isso retornará apenas as entradas do diretório atual e do diretório 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 forem movidos, mude para o novo diretório de dados:

  1. cd /mnt/gitea

Usando ls, verifique se tudo parece 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, ele deve conter os diretórios ssh, git e gitea. Se estiver usando SQLite como banco de dados para gerenciar o Gitea, também conterá um arquivo 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, vá para o diretório pai do diretório de dados em que estava anteriormente. Neste exemplo usando uma instalação do Gitea usando Docker Compose conforme descrito no tutorial vinculado nos pré-requisitos, este é o diretório que contém seu arquivo 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, ao listar o conteúdo desse diretório, todos os seus arquivos devem estar no lugar:

  1. ls -la gitea

Este comando irá exibir as informações esperadas. Observe que, dependendo do tipo de sistema de arquivos do seu volume, você pode encontrar um diretório adicional chamado lost+found; isso é normal e faz parte do uso cotidiano do sistema de arquivos:

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 use um diretório dentro do volume de armazenamento em bloco, há uma etapa adicional que você precisa concluir antes de iniciar o Gitea novamente. Por exemplo, digamos que você queira usar uma pasta chamada scm no seu volume montado em /mnt/gitea. Depois de mover todos os seus dados do Gitea para /mnt/gitea/scm, você precisará criar um link simbólico do seu antigo diretório de dados para o novo. Para isso, você 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 conforme o esperado. Você deve poder criar novos objetos no Gitea, como repositórios, problemas, etc. Se configurou o Gitea com um “SSH shim”, também deve ser capaz de fazer check-out e push nos 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 de blocos. 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 de bloco, como os Volumes 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