DEV Community

Tobias Mesquita for Quasar Framework Brasil

Posted on

QPANC - Parte 20 - Docker - Traefik e Publicação

QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.

40 Configurando os serviços na VM

Para orquestrar as requisições na VM, iremos utilizar o traefik, porém iremos utilizar autenticação basic para proteger o seu painel, desta forma, precisamos primeiro codificar uma senha, para tal, execute o seguinte comando na terminal SSH conectado a VM.

sudo apt-get install apache2-utils
echo $(htpasswd -nb ${user} ${password}) | sed -e s/\\$/\\$\\$/g

por exemplo, para o usuario qpanc e a senha exposed:

echo $(htpasswd -nb qpanc exposed) | sed -e s/\\$/\\$\\$/g

qpanc:$$apr1$$U0UpF78N$$3AxgB876rR09fJ5OuylKk/

Agora, podemos montar o compose.yml que será utilizado na VM:

version: '3.4'

services:
  qpanc.api:
    restart: always
    container_name: qpanc_api
    depends_on:
      - qpanc.database
    image: qpanc.azurecr.io/api:latest
    ports:
      - "34512:80"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
    networks:
      qpanc.network:
      qpanc.internal:
        ipv4_address: "172.18.18.3"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
      - DEFAULT_CONNECTION=Server=qpanc.database;Port=5432;Database=postgres;User Id=postgres;Password=keepitsupersecret;
      - JWTBEARER_VALIDISSUER=https://api.your_domain.com/
      - JWTBEARER_VALIDAUDIENCE=https://api.your_domain.com/
      - JWTBEARER_ISSUERSIGNINGKEY=itUXC7iVRsofSDWNeg/aLYpc4bMzHAsMPzeItE1PQi2tMK2f4t0InRgTE5B/4IAjhAX5LQSIGL1CaUHSSzED8A==
      - JWTBEARER_TOKENDECRYPTIONKEY=7hfboHG0d4GnXjVng0ukMo+IgrKKrPLUMtOvnt4S514=
      - CORS_HOSTS__0=your_domain.com
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.qpanc_api.loadbalancer.server.port=80"
      - "traefik.http.routers.qpanc_api.rule=Host(`api.your_domain.com`)"
      - "traefik.http.routers.qpanc_api.entrypoints=web"
      - "traefik.http.routers.qpanc_api.service=qpanc_api"
      - "traefik.http.routers.qpanc_api-secure.rule=Host(`api.your_domain.com`)"
      - "traefik.http.routers.qpanc_api-secure.tls=true"
      - "traefik.http.routers.qpanc_api-secure.tls.certresolver=le"
      - "traefik.http.routers.qpanc_api-secure.entrypoints=websecure"
      - "traefik.http.routers.qpanc_api-secure.service=qpanc_api"
      - "traefik.docker.network=external_network"

  qpanc.app:
    restart: always
    container_name: qpanc_app
    image: qpanc.azurecr.io/app:latest
    ports:
      - "34515:3000"
    volumes:
      - webapp:/app
    networks:
      qpanc.network:
      qpanc.internal:
        ipv4_address: "172.18.18.6"
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.qpanc_app.loadbalancer.server.port=3000"
      - "traefik.http.routers.qpanc_app.rule=Host(`your_domain.com`)"
      - "traefik.http.routers.qpanc_app.entrypoints=web"
      - "traefik.http.routers.qpanc_app.service=qpanc_app"
      - "traefik.http.routers.qpanc_app-secure.rule=Host(`your_domain.com`)"
      - "traefik.http.routers.qpanc_app-secure.tls=true"
      - "traefik.http.routers.qpanc_app-secure.tls.certresolver=le"
      - "traefik.http.routers.qpanc_app-secure.entrypoints=websecure"
      - "traefik.http.routers.qpanc_app-secure.service=qpanc_app"
      - "traefik.docker.network=external_network"

  qpanc.database:
    restart: always
    image: postgres:latest
    ports:
      - "34514:5432"
    volumes:
      - database:/var/lib/postgresql/database
    networks:
      qpanc.network:
      qpanc.internal:
        ipv4_address: "172.18.18.9"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: keepitsupersecret
      POSTGRES_DB: postgres

  traefik:
    container_name: traefik
    image: traefik:latest
    depends_on:
      - qpanc.app
      - qpanc.api
    networks:
      qpanc.network:
      qpanc.internal:
        ipv4_address: "172.18.18.12"
    command:
      - "--api=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.traefik.address=:8080"
      - "--certificatesResolvers.le.acme.email=your_email@provider.com"
      - "--certificatesResolvers.le.acme.storage=acme.json"
      - "--certificatesResolvers.le.acme.tlsChallenge=true"
      - "--certificatesResolvers.le.acme.httpChallenge=true"
      - "--certificatesResolvers.le.acme.httpChallenge.entryPoint=web"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`traefik.your_domain.com`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=admin"
      - "traefik.http.routers.traefik.tls.certresolver=le"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.middlewares.admin.basicauth.users=qpanc:$$apr1$$U0UpF78N$$3AxgB876rR09fJ5OuylKk/"

volumes:
  webapp:
  database:

networks:
  qpanc.internal:
    internal: true
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.18.0/24
  qpanc.network:

Não esqueça de atualizar o label traefik.http.middlewares.admin.basicauth.users, afinal, você não vai querer usar a senha exposed

Ele é basicamente a combinação do QPANC/docker-compose.yml e do QPANC/docker-compose.production.yml, porém sem a parte do build.

A outra diferença, é que agora estamos a configurar o traefik, é ele que irá receber todas as requisições e transferir para o serviço apropriado.

Por exemplo, as requisições feitas para o host traefik.your_domain.com serão redirecionadas para o painel do traefik. as feitas ao host api.your_domain.com irão para à API e por fim, as feitas para qpanc.your_domain.com para o app feito usando o Quasar.

Outro ponto importante, é que traefik é responsavel por configurar o SSL, gerenciando a integração com o Let's Encrypt. porém, precisamos de um domínio valido para isto.

Dado estas informações, conecte à VM usando o SSH, crie o arquivo data/acme.json, e modifique o seu nível de acesso para 600:

mkdir data
cd data
> acme.json
touch acme.json
chmod 600 acme.json
cd ..

Agora, vamos criar o aquivo docker-compose.yml:

sensible-editor docker-compose.yml

Caso pergunte qual é o editor da sua preferencia, na duvida escolha o nano.
Então, copie o conteúdo do docker-compose acima, apenas lembre-se de alterar o your_mail@provider.com para o seu email e your_domain.com para o endereço da aplicação.

Após salvar o docker-compose.yml, precisamos garantir que o docker-compose up será executado sempre que a VM for inicializada:

sudo systemctl enable docker

E antes de podemos levantar os nossos serviços, precisamos logar no docker usando uma conta que possa baixar as imagens:

docker login -u ${username} -p ${password} ${login_server}

no meu caso:

docker login -u qpanc -p ************************ qpanc.azurecr.io

E agora levante os serviços

sudo docker-compose up -d

Caso precise atualizar os serviços, podemos executar um script como o seguinte:

sudo docker-compose down
sudo docker pull qpanc.azurecr.io/api:latest
sudo docker pull qpanc.azurecr.io/app:latest
sudo docker-compose up -d

Top comments (0)