PostgreSQL: отказ в доступе после миграции Docker между VPS с использованием rclone

Вопрос или проблема

[Помощь] Ошибка отказа в доступе PostgreSQL после миграции Docker между VPS с использованием rclone

Проблема

Я получаю ошибки отказа в доступе при попытке установить время модификации файлов PostgreSQL после миграции Docker на разных VPS. Даже с полными правами (777) и sudo ошибки продолжают появляться.

Текущий подход

  • Пытаюсь мигрировать всю структуру директорий Docker (не используя pg_dump)
  • Остановил контейнеры PostgreSQL на обоих VPS 1 и VPS 2 перед миграцией
  • Примечание: Я знаю, что pg_dump работает нормально, но мне нужно именно перенести всю структуру папок

Окружение

  • Docker-контейнер с работающим PostgreSQL
  • Миграция с VPS 1 на VPS 2
  • Путь: /opt/docker/my-docker-app/database/

Команды Rclone

  • Моя функция:
 sync_operation() {
    local source="$1"
    local destination="$2"
    sudo rclone sync "$source" "$destination" \
        --sftp-host "$SSH_HOST" \
        --sftp-port "$SSH_PORT" \
        --sftp-user "$SSH_USER" \ # не root
        --sftp-key-file "$SSH_KEY" \
        --create-empty-src-dirs \
        --progress
    }
  • Пример использования:
SOURCE_DIR="/opt/docker/my-docker-app/database" # на VPS 1
DEST_DIR="/opt/docker/my-docker-app/database"  # на VPS 2
sync_operation "$SOURCE_DIR" ":sftp:$DEST_DIR"

Сообщения об ошибках

ERROR : /my-docker-app/database/data/base/16384/13404: Не удалось установить время модификации: SetModTime не удалось: отказано в доступе
ERROR : /my-docker-app/database/data/base/16384/13406: Не удалось установить время модификации: SetModTime не удалось: отказано в доступе
ERROR : /my-docker-app/database/data/PG_VERSION: Не удалось установить время модификации: SetModTime не удалось: отказано в доступе

Что я пробовал

  1. Установил полные права: sudo chmod -R 777 /opt/docker/my-docker-app/database/
  2. Использовал sudo для операций синхронизации rclone
  3. Проверил право собственности на файлы (все неудачные файлы принадлежат systemd-coredump)

Вопросы

  1. Как правильно обрабатывать права доступа к файлам во время миграции VPS?
  2. Есть ли конкретные соображения по правам доступа к файлам базы данных PostgreSQL в окружениях Docker?
  3. Почему я сталкиваюсь с этой ошибкой?

Буду признателен за любую помощь или советы!

Ответ или решение

Постоянная ошибка «Доступ запрещен» при миграции PostgreSQL в Docker с помощью Rclone

Введение

Ваша проблема с ошибками «Доступ запрещен» после миграции PostgreSQL в контейнере Docker между VPS может быть следствием неправильной настройки разрешений или несовпадения владельцев файлов. В этом руководстве мы рассмотрим причины, по которым возникает это исключение, и предложим решения для успешной миграции данных.

Причины возникновения ошибки

1. Владельцы файлов и группы
PostgreSQL работает с файлами с строго определёнными правами доступа. Ваша ошибка может быть вызвана тем, что использованные вами учётные записи пользователей (как для SCP, так и для Rclone) не соответствуют владельцу файловой системы PostgreSQL на новом сервере. Мы видим, что файлы принадлежат systemd-coredump, что является причиной запрета доступа.

2. Миграция не через pg_dump
Вы выбрали подход с миграцией всей файловой структуры, что, хотя и возможно, не всегда является рекомендуемым способом переноса базы данных PostgreSQL. Это может привести к проблемам с целостностью данных, и крайне важно убедиться в согласованности данных во время миграции.

3. Разрешения и атрибуты файлов
Даже после установки разрешений на уровне 777, если пользователь, пытающийся получить доступ к файлам, не является владельцем, это приведёт к ошибкам. Для файлов PostgreSQL требуется наличие точных прав доступа и соответствующих владельцев.

Рекомендованные действия

Решение 1: Исправление владельцев файлов

  1. Смените владельца файлов. После завершения миграции, выполните команду, чтобы установить владельца на вашего пользователя PostgreSQL:

    sudo chown -R postgres:postgres /opt/docker/my-docker-app/database/

    Убедитесь, что вы заменили postgres:postgres на ваш актуальный пользователь и группу PostgreSQL, если они отличаются.

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

    sudo chmod -R 700 /opt/docker/my-docker-app/database/

Решение 2: Использование dump для миграции

Хотя вы указали, что хотите избежать использования pg_dump, этот метод гарантирует правильность и целостность ваших данных. Рекомендуется использовать pg_dump для создания резервной копии и pg_restore для восстановления, чтобы избежать подобных проблем в будущем.

  1. Создайте dump:

    sudo -u postgres pg_dumpall > alldatabases.sql
  2. Перенесите файл на новый VPS.

  3. Восстановите на новом VPS:

    sudo -u postgres psql < alldatabases.sql

Решение 3: Обновление конфигурации Rclone

  1. Настройка прав на уровне Rclone. Убедитесь, что UID и GID, используемые для выполнения Rclone, совпадают с UID и GID пользователей PostgreSQL на новом VPS.

    Чтобы это сделать, вы можете добавить следующие параметры в вашу команду rclone:

    --sftp-options "IdentityFile=/path/to/key" \
    --sftp-options "StrictHostKeyChecking=no" \
    --sftp-options "UserKnownHostsFile=/dev/null"

Заключение

Ваша проблема с «Доступ запрещен» вызывает необходимость в корректировке прав доступа и правильной конфигурации владельцев файлов после миграции. Основным решением проблемы является использование правильных пользователей для восстановления и доступа к данным. Если вы продолжите сталкиваться с проблемами, рассмотрите возможность использования надежного инструмента pg_dump для проведения миграции. Кроме того, всегда полезно иметь резервные копии ваших данных перед любой миграцией.

Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обратиться за поддержкой!

Оцените материал
Добавить комментарий

Капча загружается...