Trabalhar como desenvolvedor não se limita apenas a escrever códigos, mas também, muitas das vezes somos responsáveis por fazer a publicação dos nossos projetos. Uma tarefa bem comum, ainda mais se você trabalha em pequenas e médias startups.
Mas não se engane, não é algo ruim de saber, saber publicar uma aplicação é um grande diferencial para seu emprego, além de mostrar que você tem conhecimento sobre determinado assunto, e é capaz, além de escrever o seu código, levá-lo para produção e apresentar para o cliente.
Conceitos básicos – O que é uma VPS
Para esse artigo, vamos usar a VPS da Hostinger para hospedar o nosso projeto, mas fique à vontade para usar de qualquer outra, desde que seja uma VPS, para não correr o risco de você se perder.
Basicamente, VPS, sigla para Virtual Private Server, ou servidor virtual privado. São servidores virtualizados em máquinas físicas e que apresentam performance superior à oferecida pelos serviços tradicionais de hospedagem, como a hospedagem compartilhada. Eles entregam um ótimo desempenho, além de um preço mais acessível quando comparados a servidores dedicados ou clouds.
Caso você não saiba, um servidor se refere a um computador usado para armazenar dados, arquivos e aplicações que podem ser acessados de forma remota. Os servidores também cumprem um papel deveras importante quando o assunto é páginas da internet, fazendo o armazenamento de sites e disponibilizando-os quando alguém os requisita.
Qual é o objetivo do VPS?
A hospedagem compartilhada, como o próprio nome indica, armazena seu site ou seu blog de forma compartilhada, ou seja, no mesmo computador junto de inúmeros outros sites de muitas outras pessoas e/ou empresas.
Na outra ponta, estão os servidores dedicados, que são sinônimo de exclusividade. Estamos falando de um computador com ótimo poder de processamento só para o seu site, e ninguém mais. O que consequentemente, torna-o mais caro de se manter, já que será só você e ninguém mais.
Ao optar pelo VPS, seu site é hospedado em um computador ao lado de outros sites; contudo, não são tantos como acontece na hospedagem tradicional.
Isso significa que os recursos de hardware da máquina são compartilhados por uma quantidade menor de sites, o que torna o VPS uma opção que oferece um desempenho melhor por um preço mais acessível que o do servidor dedicado.
Docker – O melhor amigo do Dev
Acho que dificilmente você nunca ouviu o termo Docker sendo cunhado se você acompanha algum canal de tecnologia hoje em dia. Contudo, deixe-me explicar melhor o que ele é.
Diferente de máquinas virtuais, que fazem o carregamento completo do seu sistema, o Docker tem uma proposta mais simples, utilizar containers para virtualizar os ambientes de execução das aplicações. Cada container inclui apenas o necessário para a aplicação funcionar, como bibliotecas e dependências, compartilhando o kernel do sistema operacional host com outros containers. Isso, por sua vez, nos traz mais eficiência de recursos e facilita a implantação e o gerenciamento de aplicações tanto no ambiente de produção, quanto de desenvolvimento.
Sem mais enrolação – vamos para o código
Vamos iniciar separando o que devemos fazer para rodar nossa aplicação:
- Ter uma VPS e fazer a conexão SSH pelo terminal
- Instalar o Docker e o Docker Compose na nossa VPS
- Subir um container SQL Server e liberar o acesso externo por meio do firewall da VPS
- Configurar o Dockerfile para nosso container com ASP.NET
- Configurar o docker-compose.yml para subir nosso container
- Buildar o projeto como Docker
Vamos iniciar pelo mais simples, a conexão via SSH é algo que ao fazer o pagamento da sua hospedagem já é instruído. Para fazer a conexão, basta ter instalado o sistema operacional (S.O) pelo painel da sua VPS (estou usando o ubuntu 22.04 para esse artigo). Em seguida, pegue o endereço do servidor da sua hospedagem e o usuário do S.O. Por fim, abra o terminal do seu computador e digite:
ssh <usuario_do_so>@<endereco_do_servidor>
Ao apertar “enter”, você precisará informar a senha que definiu ao instalar o S.O.
Instalando o Docker
Agora vamos para a segunda etapa, instalar o Docker. Se você procurar no Google algo como “How to install Docker on ubuntu 22.04”, irão ser listados “N” tutoriais para te orientar. Mas para simplificar seu dia, vamos para uma instalação mais direta. Com o terminal aberto, e conectado na sua VPS, siga os seguintes passos:
Atualizar os pacotes do sistema
sudo apt update
Instalar alguns pacotes de pré-requisitos que permitem “apt” usar pacotes via HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Adicionar a chave GPG do repositório oficial do Docker ao seu sistema:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Adicione o repositório Docker às fontes APT:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Atualizar sua lista de pacotes existente, para pegar os recém adicionados:
sudo apt update
Verificar se você vai instalar o Docker a partir do repositório oficial do Docker, ao invés o do Ubuntu:
apt-cache policy docker-ce
Saída esperada:
docker-ce:
Installed: (none)
Candidate: 5:20.10.14~3-0~ubuntu-jammy
Version table:
5:20.10.14~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:20.10.13~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
Por fim, instale o Docker:
sudo apt install docker-ce
Agora basta iniciar o docker na inicialização do seu sistema:
sudo systemctl status docker
Pronto, agora podemos seguir.
Subindo um container com SQL Server e liberando o acesso externo
Para que o artigo fique mais completo, estou optando por te mostrar como fazer a configuração do SQL Server no Docker, por ser uma banco bastante usado em projetos ASP.NET. Mas sinta-se à vontade para utilizar qualquer outro, basta compreender os conceitos apresentados a seguir.
Vamos começar subindo o nosso container SQL Server. Isso pode demorar um pouco, então aproveite para ir tomar um café:
docker run --name sqlserver -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=1q2w3e4r@#$" -p 1433:1433 -d mcr.microsoft.com/mssql/server
Agora, basta liberar o acesso externo do SQL Server através do Firewall da VPS. Para isso, basta digitar:
sudo ufw allow 1433/tcp
Para testar, primeiro procure pelo ip público da sua hospedagem, para isso digite:
curl ifconfig.me
Em seguida, você pode usar algum software para fazer a conexão com o seu banco, nesse exemplo, estou usando o Azure Data Studio, mas sinta-se à vontade para usar qualquer outro. Vamos usar a conexão por meio de “Connection Strings”, então, no software escolhido, ao criar a nova conexão escolha por “Connection Strings”. Em seguida basta colocar o seguinte:
Server=<IP_Público_da_VPS>,1433;User Id=sa;Password=1q2w3e4r@#$;
Pronto, fazendo isso você já estará conectado.
Configurando nosso Dockerfile para o ASP.NET
A configuração do Dockerfile é uma etapa de grande importância para nós, pois ele é usado para configurarmos nossas próprias imagens, com as características necessárias para a aplicação funcionar. Estarei usando o .net6.0, mas sinta-se à vontade para colocar a versão que melhor se adequa ao seu projeto.
Inicie criando adicionando o arquivo Dockerfile (sem nenhuma extensão mesmo), na raiz do seu projeto, no mesmo nível do arquivo .sln da sua aplicação. Nesse arquivo digite o seguinte:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["NOME_DO_SEU_PROJETO/NOME_DO_SEU_PROJETO.csproj", "NOME_DO_SEU_PROJETO/"]
RUN dotnet restore "./NOME_DO_SEU_PROJETO/NOME_DO_SEU_PROJETO.csproj"
COPY . .
WORKDIR "/src/NOME_DO_SEU_PROJETO"
RUN dotnet build "./NOME_DO_SEU_PROJETO.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./NOME_DO_SEU_PROJETO.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "NOME_DO_SEU_PROJETO.dll"]
Onde está escrito “NOME_DO_SEU_PROJETO”, substituia pelo nome que você informou na hora de criar a sua aplicação.
Configurando o Docker Compose – O orquestrador de containers Docker
Para você não se perder, acabei não dizendo o que é o Docker Compose, apesar de você já ter instalado em sua VPS, desde que tenha instalado o Docker corretamente. De forma resumida, o Docker compose nos permite gerenciar uma grande quantidade de containers Docker a partir de um arquivo de configurações YAML, tendo todos os containers configurados dentro do arquivo chamado “docker-compose.yml” ou “docker-compose.yaml” (ambos funcionam da mesma forma).
Com ele, nosso trabalho para subir containers será bastante facilitado. Imagine uma aplicação com mais de 10 container Docker, ter que digitar tudo isso no terminal ou até mesmo lembrar o que digitar toda vez que for rodar seu projeto não é uma tarefa tão simples.
Voltando para o nosso projeto, vamos adicionar no “docker-compose.yml” no mesmo diretório que colocamos o “Dockerfile”. Com ele aberto, digite o seguinte:
version: '3.8'
services:
feedbacks-app:
image: feedbacks-app
build:
context: .
dockerfile: Dockerfile
ports:
- '5101:80'
- '7286:443'
A parte boa – Buildando o nosso projeto
Tendo todas as configurações anteriores feitas, e tudo ocorrido com sucesso. Basta um simples comando para rodar o seu projeto. Certifique-se de estar no mesmo diretório que o seu arquivo docker-compose.yml. Agora, basta rodar o seguinte:
docker-compose up -d
Pronto, seu projeto está rodando. Você pode acessá-lo usando o IP da sua VPS + a porta que seu projeto está rodando, por exemplo:
http://<IP_DA_SUA_HOSPEDAGEM>:5101/api/v1/login
Mas não se limita a apenas isso, você também pode configurar um domínio para seu projeto, mas isso fica para outro artigo.
Conclusão
Nesse artigo você aprendeu a como fazer o deploy de um projeto ASP.NET com Docker em uma VPS Linux. Foi apresentado a conceitos teóricos como, o que são VPS e para que servem, o que é Docker e Docker Compose, além dos comandos necessários para fazer o deploy do seu projeto na sua VPS.
Mas não pare por aí, aproveite nosso blog para adquirir novos conhecimentos sobre o ASP.NET. Que tal aprender sobre a utilização de Cache nas suas aplicações? Curtiu? Então clique no link abaixo: