Глава 2.2: Постоянство данных, тома и гигиена прав (PUID/PGID).
В этой главе мы разберем два критически важных вопроса селф-хостинга: где физически хранятся данные ваших сайтов и как Docker распределяет права доступа к файлам внутри системы Linux.
1. Жизненный цикл данных: Куда всё пропадает?
По умолчанию любой контейнер Docker внутри себя абсолютно эфемерен (временен). Если вы запустите BookStack, напишете туда десяток статей, а затем выполните команду docker compose down (уничтожить стек) — все ваши статьи сотрутся навсегда вместе с контейнером.
Чтобы этого не происходило, данные из изолированного контейнера нужно «пробросить» на жесткий диск нашего реального сервера. В Docker для этого есть два основных механизма:
- Volumes (Тома Docker): Это изолированные папки, которыми полностью управляет сам Docker. Они хранятся в глубоких системных директориях (
/var/lib/docker/volumes/). Обычному пользователю туда лазить неудобно, но для баз данных это идеальный, самый быстрый и безопасный вариант. - Bind Mounts (Прямое монтирование папок): Это когда вы жестко связываете конкретную папку на сервере (например,
/stacks/bookstack/app_data) с папкой внутри контейнера. Это идеальный выбор для новичка: вы всегда видите файлы конфигурации, можете легко отредактировать их черезnano, закинуть туда картинки или сделать бэкап.
В нашем конфиге из прошлой главы мы использовали именно Bind Mounts, указав относительные пути:
volumes:
- ./app_data:/config # Папка app_data создастся прямо в текущем каталоге
2. Проблема прав и магия PUID и PGID
Когда контейнер создает файлы на вашем реальном сервере в папке app_data, он делает это от лица того пользователя, который запущен внутри контейнера. Очень часто внутри контейнеров все процессы работают от пользователя root.
В итоге получается неприятная ситуация: контейнер создал файлы конфигурации, вы хотите зайти на сервер под своим обычным пользователем и отредактировать конфиг через nano, но система выдает ошибку: Permission Denied (Доступ запрещен). Файлы принадлежат суперпользователю контейнера, и обычный юзер сервера не имеет права к ним прикасаться.
Для решения этого хаоса разработчики из LinuxServer.io внедрили в свои образы гениальный механизм — переменные окружения PUID (User ID) и PGID (Group ID).
Эти параметры говорят контейнеру: «Эй, внутри себя ты можешь работать как угодно, но когда ты записываешь файлы на реальный жесткий диск сервера, делай это с правами конкретного пользователя и группы из реальной системы».
Шаг практики: Как узнать свои PUID и PGID?
Чтобы ваш сервис без проблем читал и записывал файлы, вам нужно передать ему ID вашего текущего пользователя. Узнать их очень просто. Введите в терминале вашего сервера Debian команду:
id
Система выведет текст, похожий на этот:
uid=1000(sergey) gid=1000(sergey) groups=1000(sergey),27(sudo),998(docker)
Отсюда мы видим, что для пользователя sergey:
- uid (он же PUID) =
1000 - gid (он же PGID) =
1000
Именно эти цифры (обычно у первого созданного пользователя в Linux это всегда 1000) мы и прописали в блоке environment нашего файла docker-compose.yml.
Что делать, если ошибка Permission Denied уже случилась?
Если вы запустили какой-то чужой контейнер без PUID/PGID, и он "зарейдил" ваши папки, сделав их root-зависимыми, вы не сможете их даже удалить без sudo. Вернуть права вашему пользователю на всю папку со стеком можно одной простой командой Linux:
# Сила утилиты chown (change owner)
sudo chown -R 1000:1000 /stacks/bookstack
Флаг -R означает «рекурсивно» — команда пройдет по всем вложенным папкам и файлам, мгновенно вернув вам власть над ними.
💡 Правило гигиены сисадмина:
Каждый раз, разворачивая новый сервис через Docker Compose, проверяйте документацию образа на наличие параметров PUID/PGID. Всегда указывайте идентификаторы своего пользователя (1000). Это сэкономит вам сотни нервных клеток, а ваши бэкапы всегда будут копироваться без спотыкания о системные запреты.
Теперь, когда мы разобрались с физическим хранением файлов и правами на диске, пришло время понять, как наши контейнеры общаются друг с другом по сети внутри сервера. Переходим к Главе 2.3: Сети Docker.
Нет комментариев для отображения
Нет комментариев для отображения