Olá desenvolvedor! Como vai essa força?
Nesse artigo você vai encontrar um passo-a-passo de como publicar sua aplicação criada com .NET 6 em ambiente Linux, especificamente falando, em um Ubuntu Server.
É muito simples, ainda que existem várias “pegadinhas” dependendo do que a sua aplicação .NET utilize pra funcionar! Exemplo, será que a suite de componentes premium que você usa é suportada em todos os sistemas operacionais? Ou somente no Windows? Uma questão importante que voê deve ter a resposta antes de pensar publicar no Linux.
Bom, vamos ao passo-a-passo:
Primeira coisa, ou seja, o primeiro passo, é que você precisa ter um Ubuntu Linux instalado em algum lugar, pra executar os passos aqui descritos. 🙂 Existem várias possibilidades; dentre elas, posso destacar as seguintes:
- Instalar o Ubuntu Linux em alguma máquina que você tenha na sua casa ou ambiente de trabalho, que sirva de server
- Instalar o Ubuntu Linux em dual boot na sua própria máquina
- Instalar uma VM (Virtual Machine) como o VirtualBox e instalar o Ubuntu Linux nela
- Instalar uma imagem Docker na sua máquina com o Ubuntu Linux
- Instalar o WSL, Windows Subsystem for Linux, que é uma tecnologia bem nova da Microsoft, que permite instalar um subsistema Linux dentro do seu Windows
- Contratar uma cloud Linux, como a DigitalOcean, que permite criar servers Ubuntu Linux e usá-las para acesso externo na web
Como pode ver, você tem várias possibilidades! A que vou usar para esse artigo, é a opção com uma VM VirtualBox, já que tenho o VirtualBox instalado no meu Windows, mas você pode escolher a que preferir, já que os passos serão quase os mesmos
Continuando, o segundo passo é criar a configuração de publicação para Linux na aplicação .NET. Para fazer isso, você deve acessar o menu Publish, acessado ao clicar no projeto por dentro do Visual Studio e selecionar a opção Folder, conforme a imagem abaixo:
Ao finalizar, a tela abaixo será exibida
Basta configurar o target runtime para Linux-64, ficando assim:
Depois disso, você precisa publicar a aplicação, clicando no botão Publish.
Agora, você precisa acessar o server Ubuntu Linux. Se você estiver usando o WSL como eu e já instalado o Ubuntu Linux, basta executar o comando “ubuntu” abaixo no prompt de comandos:
Importante mencionar também que você precisa algum web server instalado no Ubuntu Linux e no caso, usamos o Nginx, que na minha opinião, é o melhor web server da atualidade. Para instalá-lo, basta usar o comando:
$ sudo apt install nginx
Agora, vamos instalar o .NET 6 no server com os comandos abaixo:
$ sudo wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo rm packages-microsoft-prod.deb
$ sudo apt-get update
$ sudo apt-get install -y aspnetcore-runtime-6.0
O próximo passo, é que você copie os arquivos binários da aplicação para o server Ubuntu Linux. Como estou usando o WSL, temos um diretório que é compartilhado entre Windows e Linux (/mnt/c/), que no caso, vamos executar os seguintes comandos:
$ cd /mnt/c/dot-net-projects/webapi (onde meus projetos são publicados localmente)
$ sudo mkdir /var/www/webapi
$ sudo cp . -R /var/www/webapi
Como vamos publicar uma aplicação web, vamos colar no diretório /var/www/, mas caso seja um console, você pode instalar em outros diretórios.
Agora, você precisa dar os direitos corretos de acesso ao usuários do Nginx
$ sudo chown -R www-data:www-data /var/www/
Importante verificar se a aplicação está pronta para ser executada:
$ dotnet WebApi.dll
IMPORTANTE: deve exibir várias mensagens, incluindo algo como: “Now listening on: http://localhost:5000“
Próximo passo é criar o arquivo do serviço da aplicação, para que a aplicação seja executada junto com o Linux.
$ sudo nano /etc/systemd/system/kestrel-webapi.service
[Unit]
Description=Web API
[Service]
WorkingDirectory=/var/www/webapi/
ExecStart=/usr/bin/dotnet /var/www/webapi/WebApi.dll
Restart=always
RestartSec=10
SyslogIdentifier=kestrel-webapi-service
User=www-data
KillSignal=SIGINT
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Importante que estamos informando que o ambiente é o Development, ou seja, o ambiente de desenvolvimento, para execução da aplicação .NET.
Como próximo passo, você precisa recarregar e iniciar o serviço do Linux com o sistema:
$ sudo systemctl daemon-reload
$ sudo systemctl start kestrel-webapi.service
$ sudo systemctl enable kestrel-webapi.service
Finalmente, você precisa instalar o sistema no Nginx:
$ sudo nano /etc/nginx/sites-available/webapi
server {
listen 80;
listen [::]:80;
server_name webapi.teste;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
$ sudo ln -s /etc/nginx/sites-available/webapi /etc/nginx/sites-enabled/
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo nginx -t
$ sudo systemctl restart nginx
Com isso, você tem a sua aplicação .NET 6 rodando num server Ubuntu Linux como proxy reverso do Nginx! O próximo passo, seria fazer com que esse serviço web seja acessado na sua máquina e, dependendo da maneira que você usou para instalar a aplicação, terá que tomar ações diferentes, como habilitar a porta HTTP 80 ou a HTTPS 443 no Firewall, caso tenha no servidor.
Perfect! Que tal você me contar se conseguiu acompanhar todos esses passos com sucesso? Algum deu problema? Me conte aqui também!