Невозможно смонтировать репозиторий резервных копий borg, хранящийся в моментальном снимке ZFS

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

Это относится к резервной копии borg и было опубликовано в этой проблеме borg github: Разрешить проверку файловых систем только для чтения

Попытка доступа к удаленному репозиторию borg для список , информация , mount и другие действия только для чтения завершаются ошибкой, когда удаленный репозиторий находится в моментальном снимке ZFS (только для чтения).

Я выполняю резервное копирование с помощью borg с ежедневной очисткой ( borg prune .. . ) для шифрования и удаленных снимков ZFS для хранения (и защиты от уничтожения резервных копий).

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

До сих пор я пытался использовать список borg , но это не помогло:

Remote: borg.locking.LockFailed: ('/data/backup/.zfs/snapshot/daily_2017-05-23/home/lock.exclusive', «[Errno 30] Файловая система только для чтения: '/data/backup/.zfs/snapshot/daily_2017-05 -23 / дом / замок. - просмотр) Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть пара проблем: Пользователи должны быть ...

(Оригинал задан суперпользователем, но теперь "приостановлен" - view )

Я бы очень хотел уметь использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть несколько проблем:

  1. Пользователи должны иметь возможность загружать контент на сайт Joomla.
  2. Joomla обновляется автоматически, и я ожидаю, что мне нужно будет установить больше - просмотр) Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть пара проблем: Пользователи должны быть ...

    (Оригинал задан суперпользователем, но теперь "приостановлен" - view )

    Я бы очень хотел уметь использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть несколько проблем:

    1. Пользователи должны иметь возможность загружать контент на сайт Joomla.
    2. Joomla обновляется автоматически, и я ожидаю, что мне нужно будет установить больше Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть несколько проблем:

      1. Пользователи должны иметь возможность загружать контент на сайт Joomla.
      2. Joomla обновляется автоматически, и я ожидаю, что мне нужно будет установить больше Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть несколько проблем:

        1. Пользователи должны иметь возможность загружать контент на сайт Joomla.
        2. Joomla обновляется автоматически, и я ожидаю, что мне нужно будет установить больше

        Я знаю, что с помощью множества хаков / настроек я могу настроить локальную среду Joomla, затем использовать ее для администрирования сайта и отправлять изменения в приложение EB с помощью Git.

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

        Я знаю, что создание и подключение EFS к экземплярам в EB может быть достигнуто с помощью файлов конфигурации, найденных здесь ], однако, хотя EFS действительно смонтирован, приложение по-прежнему обслуживается с локального диска.

        Кроме того, официальные инструкции AWS по развертыванию сайта Wordpress с использованием EFS приведены здесь . После проверки файлов конфигурации в папке .ebextensions я вижу, что файл конфигурации, который монтирует EFS, создает символическую ссылку между каталогом монтирования и wp-content / uploads. Это может сработать для установки Wordpress, но то, что я хотел бы сделать с Joomla, - это обслуживать все приложение из EFS.

        Похоже, мне либо нужен способ создания символической связи между корнем приложения и каталог монтирования или просто изменить корневой каталог приложения на сам каталог монтирования. Проблема в том, что я не могу понять, как это сделать.

        Любая помощь будет очень признательна.

0
задан 24 May 2017 в 16:53
2 ответа

Я так далеко зашел в этом сам. Я застрял в нескольких вопросах. Но вот что у меня есть:

Я создал файл 01-mount-efs.config в моей папке .ebextensions в корне моего приложения со следующим содержимым:

##########################################################
Enter your EFS File System ID into EFS_VOLUME_ID and your mount point in EFS_MOUNT_DIR
##########################################################

option_settings:
  - option_name: EFS_VOLUME_ID
    value: fs-xxxxxxxx
  - option_name: EFS_MOUNT_DIR
    value: /var/www/html/efs
##########################################################
#### Do not touch below
##########################################################
  - option_name: EFS_REGION
    value: '`{"Ref": "AWS::Region"}`'

packages:
  yum:
    nfs-utils: []
    jq: []

commands:
  01_mount:
    command: "/tmp/mount-efs.sh"

files:
  "/tmp/mount-efs.sh":
      mode: "000755"
      content : |
        #!/bin/bash

        EFS_REGION=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_REGION')
        EFS_MOUNT_DIR=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_MOUNT_DIR')
        EFS_VOLUME_ID=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_VOLUME_ID')

        echo "Mounting EFS filesystem ${EFS_DNS_NAME} to directory ${EFS_MOUNT_DIR} ..."

        echo "Region is ${EFS_REGION}"

        echo 'Stopping NFS ID Mapper...'
        service rpcidmapd status &> /dev/null
        if [ $? -ne 0 ] ; then
            echo 'rpc.idmapd is already stopped!'
        else
            service rpcidmapd stop
            if [ $? -ne 0 ] ; then
                echo 'ERROR: Failed to stop NFS ID Mapper!'
                exit 1
            fi
        fi

        echo 'Checking if EFS mount directory exists...'
        if [ ! -d ${EFS_MOUNT_DIR} ]; then
            echo "Creating directory ${EFS_MOUNT_DIR} ..."
            mkdir -p ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ]; then
                echo 'ERROR: Directory creation failed!'
                exit 1
            fi
            chmod 777 ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ]; then
                echo 'ERROR: Permission update failed!'
                exit 1
            fi
        else
            echo "Directory ${EFS_MOUNT_DIR} already exists!"
        fi

        mountpoint -q ${EFS_MOUNT_DIR}
        if [ $? -ne 0 ]; then
            AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
            echo "mount -t nfs4 -o nfsvers=4.1 ${AZ}.${EFS_VOLUME_ID}.efs.${EFS_REGION}.amazonaws.com:/ ${EFS_MOUNT_DIR}"
            mount -t nfs4 -o nfsvers=4.1 ${AZ}.${EFS_VOLUME_ID}.efs.${EFS_REGION}.amazonaws.com:/ ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ] ; then
                echo 'ERROR: Mount command failed!'
                exit 1
            fi
        else
            echo "Directory ${EFS_MOUNT_DIR} is already a valid mountpoint!"
        fi

        echo 'EFS mount complete.'

Это монтирует ваш том EFS в каталог с именем 'efs' в корне вашего приложения. Затем в Elastic Beanstalk> Конфигурация> Конфигурация программного обеспечения вам необходимо установить корень вашего документа на '/ efs'

Также в Elastic Beanstalk> Конфигурация> Экземпляр вам нужно добавить 'default' в 'Группы безопасности EC2', убедитесь, что вы оставили тот, который уже есть, просто добавьте в конец ', default'.

Для меня это работает в первый раз или когда я выбираю «Rebuild Environment», однако при развертывании обновления я получаю сообщение об ошибке, когда экземпляр пытается построить и run:

mv /var/app/current /var/app/current.old

Он говорит: Директория не пуста

Я думаю, это проблема с монтированием, которое не позволяет ему удалить /var/app/current.old

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

1
ответ дан 4 December 2019 в 16:14

Позвольте мне продолжить работу Крейга ответ. Крейг реализует возможность просто изменить корневой каталог приложения на сам каталог монтирования , как упоминалось в вопросе. Однако такой подход не работает. Повторное развертывание не удается, поскольку flip.sh не может переместить / var / app / current, потому что EFS смонтирован внутри него. flip.sh является частью среды Beanstalk, предоставляемой AWS.
/ var / www / html , используемый в пути к точке монтирования Крейга, является просто символической ссылкой на / var / app / current .

Я успешно реализовал другой вариант, упомянутый в вопросе, который создает символическую ссылку между корнем приложения и каталогом монтирования .

Реализация:
Для монтирования EFS я использую файл конфигурации .ebextensions / storage-efs-mountfilesystem.config , , предоставленный AWS . В .ebextensions / storage-efs-mountfilesystem.config я установил точку монтирования следующим образом:
option_settings: aws: elasticbeanstalk: приложение: среда: MOUNT_DIRECTORY: '/ efs' Затем в пакете приложения Beanstalk я создал символическую ссылку:
ln -s / efs ./docroot Чтобы включить символическую ссылку в пакет приложения Beanstalk, я создал ZIP-архив с помощью следующей команды:
zip --symlinks -r ../beanstalk_application.zip. --exclude = *. git * Исключенные файлы связаны с репозиторием git,поскольку я использую git для хранения конфигурации, и нежелательно включать файлы репозитория git в пакет.

В Elastic Beanstalk> Конфигурация> Конфигурация программного обеспечения параметр Корневой каталог документа должен быть установлен на / docroot

0
ответ дан 4 December 2019 в 16:14

Теги

Похожие вопросы