Docker-контейнер для монтирования бакета Object Storage к (S)FTP(S)-серверу
Для доступа к бакету по протоколу FTP, FTPS
В Docker-контейнере реализованы связки FUSE-клиента Object Storage GeeseFS и серверов: для FTP и FTPS — vsftpd
Подготовка к работе
- Создайте сервисный аккаунт.
- Назначьте сервисному аккаунту роли, необходимые для вашего проекта. Подробнее о ролях см. в документации Identity and Access Management.
- Создайте статический ключ доступа.
Примечание
Сервисный аккаунт может просматривать список бакетов только в том каталоге, в котором он был создан.
Сервисный аккаунт может выполнять действия с объектами в бакетах, которые созданы в каталогах, отличных от каталога сервисного аккаунта. Для этого назначьте сервисному аккаунту роли на нужный каталог или бакет в нем.
Установка
-
Скачайте Docker-контейнер:
docker pull cr.yandex/crp9ftr22d26age3hulg/ftp-s3-gateway:1.0
-
Создайте папку
secrets
для хранения данных пользователей FTP-сервера и настроек монтирования бакета:mkdir secrets
-
В папке
secrets
:-
Создайте файл
credentials
:[default] aws_access_key_id = <идентификатор_ключа> aws_secret_access_key = <содержимое_ключа>
Где:
aws_access_key_id
– идентификатор статического ключа доступа, полученного перед началом работы.aws_secret_access_key
– содержимое статического ключа доступа.
-
Если вы будете использовать SFTP, создайте файл
authorized_keys
с открытым SSH-ключом:ssh-ed25519 AAAAB3Nz.....BdZoeQ==
Инструкцию по созданию пары SSH-ключей см. в документации Compute Cloud.
-
Если вы будете использовать FTPS, добавьте в папку TLS-сертификат
ftp.pem
и его ключftp.key
. Например, для тестирования вы можете выпустить самоподписанный сертификат:openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout secrets/ftp.key -out secrets/ftp.pem
-
-
Создайте файл
env.list
с переменными окружения для Docker-контейнера:<имя_переменной>=<значение_переменной> ...
Поддерживаемые переменные:
S3_BUCKET
— имя бакета или указание на его папку, которую нужно монтировать к FTP-серверу, в формате<имя_бакета>:<путь_к_папке>
. Обязательная переменная.SFTP
— включает использование SFTP. Значение по умолчанию —YES
.FTP
— включает использование FTP. Значение по умолчанию —NO
.FTP_USER
— имя пользователя для подключения к серверу. Значение по умолчанию —s3
.FTP_PASS
— пароль пользователя для подключения к серверу. По умолчанию сгенерируется случайный пароль, который отобразится в логах Docker-контейнера.FTP_PASV_ENABLE
— включает пассивный режим FTP-соединений. Значение по умолчанию —YES
.FTP_PASV_MIN_PORT
— начало диапазона портов для пассивного режима. Значение по умолчанию —21100
.FTP_PASV_MAX_PORT
— конец диапазона портов для пассивного режима. Значение по умолчанию —21100
.FTP_PASV_ADDRESS
— IP-адрес сервера или его доменное имя (если включена опцияFTP_PASV_ADDR_RESOLVE
) для пассивного режима. По умолчанию используется IP-адрес, указанный в таблице маршрутизации Docker-контейнера (командаip route show
) как IP-адрес назначения маршрута по умолчанию (ему соответствует строка видаdefault via <IP-адрес> ...
).FTP_PASV_ADDR_RESOLVE
— разрешает указывать в переменнойFTP_PASV_ADDRESS
доменное имя сервера вместо его IP-адреса. Значение по умолчанию —YES
.FTP_PASV_PROMISCUOUS
— отключает для пассивного режима сверку клиентских IP-адресов: управляющее соединение может быть открыто с одного клиентского адреса, а соединение для обмена данными — с другого. Значение по умолчанию —NO
. Отключать проверку не рекомендуется.FTP_PORT_PROMISCUOUS
— отключает для активного режима сверку клиентских IP-адресов: при установке управляющего соединения клиент может указать в командеPORT
чужой адрес. Значение по умолчанию —NO
. Отключать проверку не рекомендуется.FTP_SSL_ENABLE
— настраивает использование FTPS (через TLS 1.x) вместо FTP:YES
(значение по умолчанию) — FTPS включен, но необязателен. Клиенты могут устанавливать с сервером незащищенные FTP-соединения.FORCE
— FTPS включен и обязателен. Клиенты должны устанавливать с сервером только FTPS-соединения.NO
— FTPS выключен.
FTP_RSA_CERT_FILE
— путь к TLS-сертификату внутри Docker-контейнера. Значение по умолчанию —/secrets/ftp.pem
.FTP_RSA_PRIVATE_KEY_FILE
— путь к закрытому ключу TLS-сертификата внутри Docker-контейнера. Значение по умолчанию —/secrets/ftp.key
.
-
Запустите Docker-контейнер:
SFTPFTP(S)docker run -d -it \ --cap-add SYS_ADMIN \ --device /dev/fuse \ --security-opt apparmor:unconfined \ --env-file env.list \ -v <полный_путь_к_папке_secrets>:/secrets \ -p 1022:22 \ --name ftp \ cr.yandex/crp9ftr22d26age3hulg/ftp-s3-gateway:1.0
Сервер будет принимать соединения на порте 1022.
docker run -d -it \ --cap-add SYS_ADMIN \ --device /dev/fuse \ --security-opt apparmor:unconfined \ --env-file env.list \ -v <полный_путь_к_папке_secrets>:/secrets \ --expose 21 \ -p 1021:21 \ --expose 21100 \ -p 21100:21100 \ --name ftp \ cr.yandex/crp9ftr22d26age3hulg/ftp-s3-gateway:1.0
Сервер будет принимать соединения на порте 1021. Также для пассивного режима (переменная
FTP_PASV_ENABLE
) открыт порт 21100 — если вы не используете этот режим, опции--expose 21100
и-p 21100:21100
можно не использовать.
Особенности загрузки файлов в бакет
Клиент GeeseFS, входящий в состав Docker-контейнера, работает с файлами асинхронно. Новые файлы кешируются клиентом и через некоторое время загружаются в бакет. При отключении FTP-сервера между этими двумя моментами загруженные файлы могут быть частично или полностью утеряны.
Чтобы обеспечить сохранность данных при SFTP-соединениях, используйте расширение fsync@openssh.com
, чтобы загрузка файла считалась успешной только после системного вызова fsync
. Например, для клиента sftp, входящего в состав OpenSSH, расширение включается с помощью флага -f
: sftp -f <адрес_сервера>
. Ожидание вызовов fsync
замедляет работу с файлами.