Вопрос или проблема
Вот мой 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, чтобы выяснить причин проблемы. Чрезвычайно важно также следить за сроками действия сертификатов и обновлять их по мере необходимости.