Как хранить репозитории Gitea на отдельном томе

Введение

Gitea – это репозиторий исходного кода, основанный на системе контроля версий Git. Хотя существует несколько самохостинговых решений, таких как GitLab и Gogs, Gitea имеет преимущество быть легковесным, что означает, что он может работать на относительно небольшом сервере.

Однако иметь небольшой сервер, особенно в области VPS, часто означает ограничение места. К счастью, многие поставщики хостинга также предлагают дополнительное хранилище в виде внешних томов, блочного хранилища или сетевого файлового хранилища (NFS). Это дает пользователям возможность экономить на более мелких хостах VPS для своих приложений без потери хранилища.

С Gitea и возможностью выбора места хранения вашего исходного кода вы можете обеспечить расширение ваших проектов и файлов. В этом руководстве вы подключите внешний том хранения к точке монтирования и убедитесь, что Gitea читает соответствующую информацию с этого тома. К концу вы получите установку Gitea, которая сохраняет репозитории и другую важную информацию на отдельном томе хранения.

Предварительные требования

Прежде чем начать, вам понадобится следующее:

Обратите внимание, что если вы установили Gitea с использованием другого метода, чем указано в этих предварительных требованиях, имена и местоположения определенных файлов и каталогов на вашей системе могут отличаться от того, что упоминается в этом руководстве. Однако концепции, изложенные в этом учебнике, должны быть применимы к любой установке Gitea.

Шаг 1 — Монтирование тома блочного хранилища

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.

Такие тома будут видны как файлы устройств, хранящиеся в каталоге /dev. Эти файлы используются ядром для связи с самими устройствами хранения; файлы на самом деле не используются для хранения. Чтобы иметь возможность хранить файлы на устройстве хранения, вам нужно будет примонтировать их с помощью команды mount.

Сначала вам нужно создать точку монтирования — то есть папку, которая будет ассоциирована с устройством, так что данные, хранящиеся в ней, окажутся хранящимися на этом устройстве. Точки монтирования для таких устройств хранения обычно находятся в каталоге /mnt.

Создайте точку монтирования с именем gitea, как вы создавали бы обычный каталог с помощью команды mkdir:

  1. sudo mkdir /mnt/gitea

Отсюда вы можете примонтировать устройство в этот каталог, чтобы использовать его для доступа к этому пространству хранения. Используйте команду mount для монтирования устройства:

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

Опция строки ext4 указывает тип файловой системы, в данном случае ext4, хотя в зависимости от типа файловой системы вашего тома это может быть что-то вроде xfs или nfs; чтобы проверить, какой тип использует ваш том, выполните команду mount без опций:

  1. mount

Это выведет вам строку вывода для каждой примонтированной файловой системы. Поскольку вы только что примонтировали вашу, она, вероятно, будет последней в списке:

Output
. . . /dev/sda on /mnt/gitea type ext4 (rw,noatime,discard)

Это показывает, что тип файловой системы – ext4.

Эта команда монтирует устройство, указанное по его ID, в /mnt/gitea. Опция -o указывает параметры, используемые при монтировании. В данном случае вы используете параметры по умолчанию, которые позволяют монтировать файловую систему для чтения и записи, а опция noatime указывает, что ядро не должно обновлять время последнего доступа к файлам и каталогам на устройстве, чтобы быть более эффективным.

Теперь, когда вы примонтировали ваше устройство, оно останется примонтированным до тех пор, пока система работает. Однако, как только система перезагрузится, оно больше не будет примонтировано (хотя данные останутся на томе), поэтому вам нужно будет сообщить системе примонтировать том сразу после запуска, используя файл /etc/fstab («таблица файловых систем»). Этот файл перечисляет доступные файловые системы и их точки монтирования в формате, разделенном табуляцией.

Используя echo и tee, добавьте новую строку в конец файла /etc/fstab:

  1. echo '/dev/disk/by-id/your_disk_id /mnt/gitea ext4 defaults,nofail,noatime 0 0' | sudo tee /etc/fstab

Эта команда добавляет строку /dev/disk/by-uid/идентификатор_вашего_диска в файл fstab и выводит его на экран. Как и предыдущая команда mount, она монтирует устройство на точку монтирования с использованием опций defaults, nofail и noatime.

После внесения изменений в файл /etc/fstab ядро будет монтировать ваш том при загрузке.

Примечание: Накопители на Linux очень гибкие и представлены во всех различных типах, от сетевой файловой системы (NFS) до обычного жесткого диска. Чтобы узнать больше о блочном хранилище и устройствах в Linux, вы можете прочитать больше о концепциях хранения в нашем Введении в терминологию и концепции хранения в Linux.

Шаг 2 — Настройка Gitea для хранения данных на блочном томе хранения

Gitea поддерживает все свои репозитории в центральном месте. Это включает репозитории всех пользователей и организаций. Если не сконфигурировано иначе, вся информация хранится в одном каталоге. Этот каталог называется data в установках по умолчанию. Для целей этого руководства мы будем использовать версию Gitea, работающую на Docker, как в связанном выше руководстве.

Сначала давайте поймем, что содержится в этом каталоге данных. Вы можете сделать это, переместившись в каталог данных и запустив команду ls. Использование формата -l даст нам больше информации о файлах:

  1. cd gitea
  2. ls -l

Это предоставит список, подобный следующему:

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/

Давайте разберем вывод этой команды. Он перечисляет один файл или каталог на каждой строке. В этом случае он перечисляет пять каталогов. Запись для . является специальной записью, которая означает текущий каталог, а .. означает каталог на один уровень вверх. Этот вывод показывает, что текущий каталог принадлежит пользователю root, что является случаем в данном примере, потому что Docker запускается от имени привилегированного пользователя, а каталог на один уровень вверх принадлежит пользователю sammy.

Каталог git важен для нас, потому что содержит все репозитории, которые мы можем хотеть сохранить на отдельном томе. Выведите содержимое каталога:

  1. ls -l git

Это предоставит длинный список каталога:

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/

Внутри находятся два интересных каталога: каталог repositories, который содержит репозитории Git, управляемые Gitea и отсортированные по пользователю/организации, и каталог lfs, содержащий данные для функционала Git Large File Storage. Каталог gitea содержит информацию, которую использует Gitea в фоновом режиме, включая архивы старых репозиториев, а также базу данных, содержащую информацию, такую как пользователи и информация о репозиториях, используемая веб-сервисом. Каталог ssh содержит различные ключевые пары SSH, которые использует Gitea.

Учитывая, что вся информация, хранящаяся в этом каталоге, важна, вам следует включить все содержимое каталога на нашем прикрепленном томе.

Существует два пути, которые можно выбрать отсюда, в зависимости от того, работаете ли вы с новой установкой Gitea и завершаете ли вы этот учебник в процессе установки. На первом пути вы сможете указать местоположения до завершения установки, а на втором вы узнаете, как переместить существующую установку.

Настройка новой установки Gitea

Если вы начинаете с совершенно новой установки Gitea, вы можете указать, где хранится вся ваша информация в процессе конфигурации. Например, если вы настраиваете Gitea с использованием Docker Compose, вы можете отобразить тома на ваш прикрепленный том.

Откройте файл docker-compose.yml с помощью выбранного вами текстового редактора. В следующем примере используется nano:

  1. nano docker-compose.yml

Когда файл открыт, найдите запись volumes в файле compose и измените отображение слева от :, чтобы указать соответствующие местоположения на вашем блочном накопителе для каталога данных Gitea

docker-compose.yml
...

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

...

Когда вы закончите установку информации, сохраните и закройте файл. Если вы используете nano, вы можете сделать это, нажав CTRL + X, Y, а затем ENTER.

Предупреждение: SSH-серверы ищут каталог .ssh в домашнем каталоге пользователя Git (git, в данном случае). Этот каталог содержит все SSH-ключи, которые будет использовать Gitea, поэтому не рекомендуется перемещать монтирование для этого тома Docker. Для того чтобы иметь возможность резервного копирования этого расположения на вашем томе, лучше использовать другое решение, такое как cron-задача для резервного копирования каталога. Чтобы узнать больше, ознакомьтесь с этим руководством по использованию cron для управления запланированными задачами.

Когда вы запускаете docker-compose и устанавливается Gitea, он будет использовать ваш том блочного хранилища для хранения своих данных.

Если вы не используете Docker-тома для управления расположением ваших данных — например, если вы устанавливаете Gitea на свой сервер с помощью двоичных релизов в соответствии с этими инструкциями от Gitea — то вам нужно будет изменить расположения в файле конфигурации (обычно /etc/gitea/app.ini) при установке всех значений и перед выполнением окончательных шагов установки в браузере. Например, вы можете установить их следующим образом:

app.ini
...

# Если вы используете SQLite для вашей базы данных, вам нужно изменить PATH
# переменную в этом разделе
[database]
...
PATH = /mnt/gitea/gitea.db

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

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

...

Примечание: Убедитесь, что ваш пользователь git имеет права на запись в это местоположение. Вы можете ознакомиться с разрешениями Linux здесь.

Перенос существующей установки Gitea

Если у вас уже установлен и работает экземпляр Gitea, вы все равно сможете хранить свои данные на отдельном томе, но это потребует некоторых мер предосторожности для обеспечения безопасности и доступности всех ваших данных для Gitea.

Примечание: Как и в любой операции с вашими данными, важно убедиться, что у вас есть актуальная резервная копия всего. В этом случае это означает резервную копию всех файлов в вашем каталоге данных (файлы SSH, каталоги gitea-repositories и lfs, база данных и так далее) в безопасное местоположение.

Существует два способа перемещения ваших данных на новый том. Первый способ – скопировать данные Gitea во второе местоположение, затем превратить исходное местоположение в точку монтирования для вашего тома. Когда вы скопируете свои данные обратно в это местоположение, вы будете копировать их на этот том, и изменения в Gitea не потребуются; он просто будет продолжать работу так же, как и раньше. Если же вы не хотите монтировать весь накопитель в это место назначения (например, если ваши данные Gitea не будут единственным на этом томе), то второй вариант – переместить все ваши данные Gitea в новое местоположение на этом томе и настроить сам Gitea использовать это местоположение.

Независимо от выбранного варианта, сначала остановите веб-сервис Gitea.

Если вы установили Gitea через Docker Compose, используйте команду docker-compose для остановки сервиса. Находясь в той же директории, что и файл docker-compose.yml, выполните:

  1. docker-compose down

Если вы установили его как службу systemd, используйте команду systemctl:

  1. sudo systemctl stop gitea

После того как Gitea будет остановлен, переместите все содержимое каталога данных в точку монтирования, созданную на шаге 1:

  1. sudo mv * /mnt/gitea

Убедитесь, что все файлы были перемещены, перечислив содержимое текущего каталога:

  1. ls -la

Это вернет только записи текущего и родительского каталогов:

total 8
drwxrwxr-x 2 sammy sammy 4096 Jun 27 13:56 ./
drwxr-xr-x 7 sammy sammy 4096 Jun 27 13:56 ../

Когда все данные будут перемещены, перейдите в новый каталог данных:

  1. cd /mnt/gitea

Используя команду ls, убедитесь, что все выглядит правильно:

  1. ls -l

Это покажет содержимое каталога:

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/

Как и ранее, он должен содержать каталоги ssh, git и gitea. Если вы используете SQLite в качестве базы данных для управления Gitea, то в каталоге gitea также будет файл с именем gitea.db.

Когда вы уверены, что все данные были перемещены, пришло время подключить том к каталогу данных.

Сначала переместитесь в родительский каталог каталога данных, в котором вы находились ранее. В этом примере с установкой Gitea с использованием Docker Compose, описанной в учебнике, связанном с предварительными требованиями, это каталог, содержащий ваш файл docker-compose.yml.

  1. cd ~/gitea/

Как и ранее, используйте команду mount, но на этот раз в качестве места назначения используйте только что очищенный каталог:

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

Теперь, когда вы перечислите содержимое этого каталога, все ваши файлы должны находиться на месте:

  1. ls -la gitea

Эта команда выведет ожидаемую информацию. Обратите внимание, что в зависимости от типа файловой системы вашего тома, вы можете обнаружить дополнительный каталог с именем lost+found; это нормально и часть ежедневного использования файловой системы:

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/

Как упоминалось ранее, если вы хотите, чтобы Gitea использовала каталог внутри блочного тома, вам нужно выполнить дополнительный шаг перед повторным запуском Gitea. Например, предположим, что вы хотите использовать папку с именем scm на вашем томе, смонтированном на /mnt/gitea. После перемещения всех ваших данных Gitea в /mnt/gitea/scm, вам нужно будет создать символическую ссылку из вашего старого каталога данных в новый. Для этого вы будете использовать команду ln:

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

На данный момент вы можете перезапустить Gitea. Если вы используете Gitea как службу systemd, выполните:

  1. sudo systemctl restart gitea

Если вы запускаете Gitea в контейнере Docker с использованием Docker Compose, выполните:

  1. docker-compose up -d

Теперь, когда всё работает, посетите ваш экземпляр Gitea в браузере и убедитесь, что всё работает как ожидается. Вы должны иметь возможность создавать новые объекты в Gitea, такие как репозитории, задачи и т. д. Если вы настроили Gitea с SSH шлюзом, вы также сможете проверять и загружать репозитории с помощью git clone и git push.

Заключение

В этом учебном пособии вы переместили все ваши данные Gitea на блочное хранилище. Такие тома очень гибкие и предоставляют множество преимуществ, таких как возможность хранения всех ваших данных на более крупных дисках, объединенных в массив RAID, сетевых файловых системах или с использованием блочного хранилища, такого как DigitalOcean Volumes, для снижения расходов на хранение. Это также позволяет создавать снимки целых дисков для резервного копирования, чтобы восстановить их содержимое в случае катастрофического сбоя.

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