Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • ИИ для бизнеса
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Object Storage
    • Все инструменты
      • Docker-контейнер для (S)FTP(S)
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Логи бакета
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Подготовка к работе
  • Установка
  • Особенности загрузки файлов в бакет
  1. Инструменты
  2. FTP
  3. Docker-контейнер для (S)FTP(S)

Docker-контейнер для монтирования бакета Object Storage к (S)FTP(S)-серверу

Статья создана
Yandex Cloud
Улучшена
Roman V.
Обновлена 4 августа 2025 г.
  • Подготовка к работе
  • Установка
  • Особенности загрузки файлов в бакет

Для доступа к бакету по протоколу FTP, FTPS или SFTP можно развернуть сервер с помощью публичного Docker-контейнера, предоставляемого Object Storage.

В Docker-контейнере реализованы связки FUSE-клиента Object Storage GeeseFS и серверов: для FTP и FTPS — vsftpd, для SFTP — sftp-server (входит в состав OpenSSH).

Подготовка к работеПодготовка к работе

  1. Создайте сервисный аккаунт.

  2. Назначьте сервисному аккаунту роли, которые нужны для вашего проекта, например storage.editor на бакет — для работы с конкретным бакетом, или на каталог — для работы со всеми бакетами в каталоге. Подробнее о ролях см. на странице Управление доступом с помощью Yandex Identity and Access Management.

    Чтобы работать с объектами в зашифрованном бакете, у пользователя или сервисного аккаунта вместе с ролью storage.configurer должны быть следующие роли на ключ шифрования:

    • kms.keys.encrypter — для чтения ключа, шифрования и загрузки объектов;
    • kms.keys.decrypter — для чтения ключа, расшифровки и скачивания объектов;
    • kms.keys.encrypterDecrypter — включает разрешения, предоставляемые ролями kms.keys.encrypter и kms.keys.decrypter.

    Подробнее см. Сервисные роли Key Management Service.

  3. Создайте статический ключ доступа.

    В результате вы получите данные статического ключа доступа. Для аутентификации в Object Storage вам понадобятся:

    • key_id — идентификатор статического ключа доступа;
    • secret — секретный ключ.

    Сохраните key_id и secret, так как повторное получение значения ключа будет невозможно.

Примечание

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

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

УстановкаУстановка

  1. Установите Docker.

  2. Аутентифицируйтесь в Yandex Container Registry.

  3. Скачайте Docker-контейнер:

    docker pull cr.yandex/crp9ftr22d26age3hulg/ftp-s3-gateway:1.0
    
  4. Создайте папку secrets для хранения данных пользователей FTP-сервера и настроек монтирования бакета:

    mkdir secrets
    
  5. В папке 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
      

    Внимание

    Поддержка протокола TLS версий 1.0 и 1.1 в Object Storage прекращена с 1 августа 2025 года.

    Подробнее см. на странице Протокол TLS.

  6. Создайте файл 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.
  7. Запустите Docker-контейнер:

    SFTP
    FTP(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 можно не использовать.

  8. Подключитесь к серверу:

    SFTP
    FTP
    sudo sftp -i <путь_к_приватному_SSH-ключу> -P 1022 s3@localhost
    

    После успешного подключения вам будет доступна консоль для взаимодействия с SFTP-сервером.

    ftp -P 1021 s3@localhost
    

    После успешного подключения вам будет доступна консоль для взаимодействия с FTP-сервером.

Особенности загрузки файлов в бакетОсобенности загрузки файлов в бакет

Клиент GeeseFS, входящий в состав Docker-контейнера, работает с файлами асинхронно. Новые файлы кешируются клиентом и через некоторое время загружаются в бакет. При отключении FTP-сервера между этими двумя моментами загруженные файлы могут быть частично или полностью утеряны.

Чтобы обеспечить сохранность данных при SFTP-соединениях, используйте расширение fsync@openssh.com, чтобы загрузка файла считалась успешной только после системного вызова fsync. Например, для клиента sftp, входящего в состав OpenSSH, расширение включается с помощью флага -f: sftp -f <адрес_сервера>. Ожидание вызовов fsync замедляет работу с файлами.

Была ли статья полезна?

Предыдущая
rclone
Следующая
Обзор
Проект Яндекса
© 2025 ООО «Яндекс.Облако»