настроить minio в docker для использования https

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

Вот мой docker-compose.yml:

version: '3.7'

services:
  minio:
    image: minio/minio
    command: server -C /etc/minio --address ":9000" --console-address ":9001" /data
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - minio:/data
      - /etc/minio:/root/.minio/
      - /etc/minio:/etc/minio/
      
volumes:
  minio:

ls -l /etc/minio/:

drwx------ 2 root root 4096 May 20 11:43 CAs
lrwxrwxrwx 1 root root   59 May 20 11:45 private.key -> /etc/letsencrypt/live/mydomain.com/privkey.pem
lrwxrwxrwx 1 root root   61 May 20 11:44 public.crt -> /etc/letsencrypt/live/mydomain.com/fullchain.pem

Доступ по http работает, но https не работает. У меня нет представления, в чем проблема. К сожалению, логи ничего не показывают, а документация тоже не помогает.

Символические ссылки private.key и public.crt не могут быть разрешены, потому что целевые файлы не существуют внутри контейнера.

Самый простой способ – также смонтировать /etc/letsencrypt внутри контейнера.

Имейте в виду, что вам нужно перезапустить контейнер (или хотя бы перезагрузить процесс minio внутри контейнера) после каждого обновления сертификата.

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

docker_compose.yml


networks:
  app-tier:
    driver: bridge


services:
  minio:
    image: minio/minio
    ports:
      - "9000:9000"
      - "9001:9001"
    networks:
      - app-tier
    volumes:
      - /data/minio:/data
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    command: server --console-address ":9001" /data
  nginx:
    image: nginx:latest
    container_name: 'nginx'
    hostname: 'nginx'
    ports:
      - "8443:8443" 
      - "8444:8444" 
    environment:
      - "VIRTUAL_HOST=minio.example.com"
      - "VIRTUAL_PORT=8443"
    networks:
      - app-tier
    volumes:
      - ./conf/app.conf:/etc/nginx/conf.d/default.conf:ro"
      - '/etc/letsencrypt/live/:/etc/letsencrypt/live/'
      - '/etc/letsencrypt/archive/:/etc/letsencrypt/archive/'
volumes:
  minio_storage: {}

app.conf должен быть размещен в папке conf

upstream minio {
  server minio:9001;
  keepalive 15;
}
upstream minio_api {
  server minio:9000;
  keepalive 15;
}
server {
  listen 8443 ssl;
  server_name minio.example.com;
  ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;
  resolver 8.8.8.8;
  location / {
    proxy_pass http://minio;
    proxy_redirect off;
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "Keep-Alive";
    proxy_set_header Proxy-Connection "Keep-Alive";
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    chunked_transfer_encoding off;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

  }
}
server {
  listen 8444 ssl;
  server_name minio.example.com;
  ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;
  resolver 8.8.8.8;
  location / {
    proxy_pass http://minio_api;
    proxy_redirect off;
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "Keep-Alive";
    proxy_set_header Proxy-Connection "Keep-Alive";
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    chunked_transfer_encoding off;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

  }

}

Проверьте разрешения для папки /etc/letsencrypt, так как контейнеры работают под непривилегированным пользователем

Как только у вас есть файлы public.crt и private.key (я использовал Tailscale, поэтому я выполнил tailscale cert), они должны находиться на сервере minio в ~/.minio/certs, что, скорее всего, будет /root/.minio/certs. Для меня, используя Docker Compose, мне пришлось добавить следующую строку в мой список томов:

- ~/docker/minio/certs:/root/.minio/certs

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

Настройка MinIO в Docker для использования HTTPS

MinIO – это мощное решение для хранения объектов, обеспечивающее высокую производительность и простоту интеграции. В этом руководстве мы подробно разберём, как настроить MinIO для работы через HTTPS с использованием Docker и Docker Compose.

Шаг 1: Настройка docker-compose.yml

Ваш файл docker-compose.yml уже содержит важные параметры, однако необходимо внести некоторые изменения для поддержки HTTPS.

Вот обновлённый пример:

version: '3.7'

services:
  minio:
    image: minio/minio
    command: server -C /etc/minio --address ":9000" --console-address ":9001" /data
    ports:
      - "9000:9000"        # HTTP
      - "9001:9001"        # Консоль
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - minio:/data
      - ~/docker/minio/certs:/root/.minio/certs  # Монтируем сертификаты
      - /etc/minio:/etc/minio/                     # Для конфигурации

volumes:
  minio:

Шаг 2: Подготовка сертификатов SSL

Чтобы MinIO мог работать через HTTPS, вам понадобятся SSL-сертификаты. Сертификаты Let’s Encrypt могут быть использованы и для этой цели, если они у вас есть. Основные файлы сертификатов, которые вам понадобятся:

  • fullchain.pem – сертификат.
  • privkey.pem – закрытый ключ.

Эти файлы необходимо разместить в директории, которая будет доступна контейнеру, например, в /etc/minio/certs.

Шаг 3: Изменение конфигурации прав доступа

Контейнеры в Docker зачастую исполняются от имени непривилегированных пользователей, что может вызвать проблемы с доступом к файлам сертификатов. Убедитесь, что права доступа на директорию и файлы сертифкатов установлены корректно:

sudo chown -R 1000:1000 /etc/letsencrypt/

Здесь 1000:1000 – это UID и GID пользователя, от имени которого работает контейнер MinIO. Узнать UID контейнера можно с помощью команды:

docker exec <minio_container_name> id -u

Шаг 4: Конфигурация Nginx для проксирования

Если вы хотите использовать Nginx в качестве обратного прокси для вашего MinIO-сервера, следующий пример конфигурации может быть полезен. Убедитесь, что файл конфигурации Nginx соответствует вашим требованиям:

upstream minio {
  server minio:9000;  # API
  keepalive 15;
}

server {
  listen 8443 ssl;
  server_name minio.example.com;

  ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;

  location / {
    proxy_pass http://minio;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Шаг 5: Перезапуск контейнеров

Следует перезапустить ваши контейнеры для применения всех изменений:

docker-compose down
docker-compose up -d

Заключение

Теперь ваш MinIO должен быть доступен через безопасный протокол HTTPS. Проверьте это, перейдя по адресу https://minio.example.com:8443. В случае возникновения ошибок, проверьте логи MinIO и Nginx, чтобы выяснить причин проблемы. Чрезвычайно важно также следить за сроками действия сертификатов и обновлять их по мере необходимости.

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

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