QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.
- Source
- Introdução
- Parte I - ASP.NET - Inicializando os Projetos
- Parte 2 - PostgreSQL
- Parte 3 - ASP.NET - Registrando Serviços e Lendo Variáveis de Ambiente
- Parte 4 - ASP.NET - Entity Framework e ASP.NET Core Identity
- Parte 5 - ASP.NET - Documentação Interativa com Swagger
- Parte 6 - ASP.NET - Regionalização
- Parte 7 - ASP.NET - Autenticação e Autorização
- Parte 8 - ASP.NET - CORS
- Parte 9 - Quasar - Criação e Configuração do Projeto
- Parte 10 - Quasar - Configurações e Customizações
- Parte 11 - Quasar - Componentes - Diferença entre SPA e SSR
- Parte 12 - Quasar - Serviços
- Parte 13 - Quasar - Regionalização e Stores
- Parte 14 - Quasar - Consumindo a API
- Parte 15 - Quasar - Login
- Parte 16 - Quasar - Áreas Protegidas
- Parte 17 - Quasar - Registro
- Parte 18 - Docker - Maquina Virtual Linux
- Parte 19 - Docker - Registro e Build
- Parte 20 - Docker - Traefik e Publicação
- Demo Online
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)