Minio + Traefik + TSL/SSL
Tags: aws, programming, tutorial, devops
Published: 2022-08-31 18:45:32

Hoje vamos abordar um pouco sobre hospedagem de arquivos. 
Atualmente no mercado temos a AWS s3 sendo um das principais ferramentas para armazenamento de arquivo em nuvem no merco, para não dizer a principal. Suas especificações de API meio que se tornou um padrão implícito para esse tipo de serviço na web. Contudo por motivos diversos podemos ter casos em que é necessário ter um serviço similar em nossa própria infra seja por motivos técnicos ou outros. 
Para atender essa necessidade vamos utilizar o  [Minio](https://min.io/)  ele funcionar como um serviço s3 sendo em suas especificações muito parecido com o mesmo e podendo ate mesmo usar a S3 ou  serviços similares como um tier de armazenamento, além de serviço de cache, servidores com multi região e etc. Farei uma abordagem de instalação básica. 

Para começarmos é necessário ter o Traefik já instalado.
O pulo do gato esta em extrair do acme.json. As chaves publicas e privadas necessárias para que possamos estabelecer conexão segura com o servidor do min.io . Para isso é necessário utilizar um serviço para extrair as mesmas. No [docker-compose](https://github.com/pedrostefanogv/docker-compose-utils/blob/main/Traefik/docker-compose.yaml) adonaremos o seguinte serviço.


```
  traefik-certs-dumper:
    container_name: "traefik-dumpcerts"
    restart: "always"
    image: ldez/traefik-certs-dumper:v2.8.1
    entrypoint: sh -c '
      apk add jq
      ; while ! [ -e /acme.json ]
      || ! [ `jq ".[] | .Certificates | length" /acme.json` != 0 ]; do
      sleep 1
      ; done
      && traefik-certs-dumper file --version v2 --watch
      --source /acme.json --dest /data'
    volumes:
      - "/opt/traefik/acme.json:/acme.json"
      - "/opt/traefik/data:/data"
```

Com isso, ele vai extrair as chaves .crt e .key dos domínios contidos em  acme.json
Feito isso vamos subir o serviço do min.io, para maiores informações consulte a documentação oficial. Nesse exemplo vamos subir um onico contêiner com dois discos para armazenamento dos dados sendo considerado data1-1 e data1-2 montado na raiz do mesmo. [link do arquivo](https://github.com/pedrostefanogv/docker-compose-utils/blob/main/Minio/docker-compose.yaml) para consulta.

```
version: '3.7'

networks:
  traefik:
    name: traefik
    external: true

volumes:
  data1-1:
     name: data1-1
     driver: local
  data1-2:
     name: data1-2
     driver: local

services:
   minio1:
    restart: always
    image: quay.io/minio/minio
    container_name: minio
    command: server  --console-address ":80" http://minio/data{1...2}

    volumes:
      - data1-1:/data1
      - data1-2:/data2
      - "/opt/traefik/data/private:/.minio/certs:ro"
    environment:

       MINIO_DOMAIN: DOMINIO.COM.BR
       MINIO_SERVER_URL: https://s3.DOMINIO.COM.BR
       MINIO_BROWSER_REDIRECT_URL: http://console.s3.DOMINIO.COM.BR
       CONSOLE_SECURE_TLS_REDIRECT: off
       MINIO_ROOT_USER: minioadmin
       MINIO_ROOT_PASSWORD: minioadmin

    labels:

    # console
      - "traefik.http.routers.minio.rule=Host(`console.s3.DOMINIO.COM.BR`)"
      - "traefik.http.routers.minio.entrypoints=websecure"
      - "traefik.http.routers.minio.tls=true"
      - "traefik.http.routers.minio.tls.certresolver=letsencrypt"
      - "traefik.http.services.minio.loadbalancer.server.port=80"
      - "traefik.http.routers.minio.service=minio"

    # Api
      - "traefik.http.routers.minio-api.rule=Host(`s3.DOMINIO.COM.BR`)"
      - "traefik.http.routers.minio-api.entrypoints=websecure"
      - "traefik.http.routers.minio-api.tls=true"
      - "traefik.http.routers.minio-api.tls.certresolver=letsencrypt"
      - "traefik.http.services.minio-api.loadbalancer.server.port=9000"
      - "traefik.http.routers.minio-api.service=minio-api"


      - "traefik.frontend.passHostHeader=true"
      - "traefik.enable=true"


    networks:
      - traefik


```
Algumas observações.

Verifique as variáveis de usuário inicial. Apos o primeiro login, recomendo a criação de um novo usuário e a rotação do nome e senha do usuário.

`
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
`

O serviço possui dois domínios, um para fornecimento dos arquivos e outro para acesso ao console de administração.
Caso não esteja conseguindo acessar o console (usuário e senha invalido) desative o redirecionamento do TLS. 


`
    MINIO_DOMAIN: DOMINIO.COM.BR
    MINIO_SERVER_URL: https://s3.DOMINIO.COM.BR
    MINIO_BROWSER_REDIRECT_URL: http://console.s3.DOMINIO.COM.BR
    CONSOLE_SECURE_TLS_REDIRECT: off

`