TUTORIAL: Deploy .NET WebAPI grátis no RailwayApp utilizando Docker!
Tags: tutorial, cloudfree, dotnet, docker
Published: 2024-02-27 22:44:56

## O que é o Railway App

[Railway.app](http://Railway.app)

Railway app é uma plataforma na nuvem para construção, envio e monitoramento de aplicativos. Plataformas como essa geralmente visam simplificar o processo de desenvolvimento, fornecendo ferramentas e automações para facilitar a construção e gerenciamentos de aplicativos. 

No Railway é possivel você implementar aplicações de diversas linguagens, banco de dados, volumes e implementar integração CI/CD via github. Na criação de sua primeira conta você recebe $5 para gastar como quiser na plataforma, além dos planos de upgrades terem um ótimo custo benefício também.

## Implementar uma Web Api .NET no Railway APP

Nosso objetivo é criar uma WebApi .NET, adicionar suporte para Docker, subir a um repositório github, realizar deploy no Railway App e testar, o mesmo método deste tutorial pode ser usado para implementar projetos MVC e talvez outros tipos de projetos(não fiz outros testes, fica em aberto para quem tiver interesse). Para realizar o deploy da nossa WebApi vamos utilizar o docker, ele é essencial nesse processo, caso você não tenha instalado irei deixar link de um tutorial de como baixar, instalar e configura-lo. Para seguir com o deploy é necessário ter .NET e Docker instalados em sua máquina e uma IDE ou Editor de texto, abaixo disponizibilizarei alguns tutoriais caso não tenha algum dos itens mencionados.

## Tutoriais

- [Como Instalar o .NET](https://balta.io/blog/dotnet-instalacao-configuracao-e-primeiros-passos)
- [Como instalar o Visual Studio Code](https://balta.io/blog/visual-studio-code-instalacao-customizacao)
- [Como instalar o Visual Studio 2022](https://learn.microsoft.com/pt-br/visualstudio/install/install-visual-studio?view=vs-2022)
- [Como instalar e configurar o Docker](https://balta.io/blog/docker-instalacao-configuracao-e-primeiros-passos)

## Como configurar o projeto utilizando Visual Studio Code - CLI

### Iniciar um projeto WebApi .NET C#

 Crie uma pasta para seu projeto e dentro dela abra o Visual Studio Code e o prompt, execute para criar o projeto:
    
    
    dotnet new webapi -o WebApiDeployExample
    
    
 Execute para criar a solução:
    
    
    dotnet new sln
    
    
 Execute para vincular o projeto a solução
    
    
    dotnet sln add WebApiDeployExample
    
    

### Configurando o Docker no projeto

 Crie um arquivo ‘.dockerfile’ na raiz da solução(Mesma localização do seu arquivo .sln), preencha com os seguintes itens:
    
   
    **/.classpath
    **/.dockerignore
    **/.env
    **/.git
    **/.gitignore
    **/.project
    **/.settings
    **/.toolstarget
    **/.vs
    **/.vscode
    **/*.*proj.user
    **/*.dbmdl
    **/*.jfm
    **/azds.yaml
    **/bin
    **/charts
    **/docker-compose*
    **/Dockerfile*
    **/node_modules
    **/npm-debug.log
    **/obj
    **/secrets.dev.yaml
    **/values.dev.yaml
    LICENSE
    README.md
    !**/.gitignore
    !.git/HEAD
    !.git/config
    !.git/packed-refs
    !.git/refs/heads/**
  
    

 Crie um arquivo ‘Dockerfile’ dentro do projeto(Mesma localização do seu arquivo .csproj), preencha com o seguinte template:
    
    
    #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
    
    FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
    USER app
    WORKDIR /app
    EXPOSE 8080
    EXPOSE 8081
    
    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    ARG BUILD_CONFIGURATION=Release
    WORKDIR /src
    COPY ["[NomeDoProjeto]/[NomeDoProjeto].csproj", "[PastaDoProjeto]/"]
    RUN dotnet restore "./[NomeDoProjeto]/[NomeDoProjeto].csproj"
    COPY . .
    WORKDIR "/src/[NomeDoProjeto]"
    RUN dotnet build "./[NomeDoProjeto].csproj" -c $BUILD_CONFIGURATION -o /app/build
    
    FROM build AS publish
    ARG BUILD_CONFIGURATION=Release
    RUN dotnet publish "./[NomeDoProjeto].csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "[NomeDoProjeto].dll"]
    
    

### Configurando Railway no projeto

 Crie um arquivo ‘railway.toml’ na raiz da solução(Mesma localização do seu arquivo .sln), preencha com os seguintes itens:
    
    
    [build]
    builder = "dockerfile"
    dockerfilePath = "./WebApiDeployExample/Dockerfile"
    
    [deploy]
    startCommand = "dotnet WebApiDeployExample.dll"
    restartPolicyType = "never"
    
    
 No projeto em Program.cs adicione o seguinte código antes de ‘var app = builder.Build();’:
    
   
    var port = Environment.GetEnvironmentVariable("PORT") ?? "8081";
    builder.WebHost.UseUrls($"http://*:{port}");
    
    
 Comente ‘app.UseHttpRedirection();’
 Caso queira visualizar o Swagger ao publicar retire ‘app.UseSwagger();’ e ‘app.UseSwaggerUI();’ de dentro das condições de ambiente de desenvolvimento.
- Antes
        
        
        if (app.Environment.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI();
        }
        
        

- Depois
        
        
        app.UseSwagger();
        app.UseSwaggerUI();
        
        

## Como configurar o projeto utilizando Visual Studio 2022 - Interface

### Iniciar um projeto WebApi .NET C#

 Procure por Web API
![Criando novo projeto no Visual Studio](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iix23iyqkcqowwu2i4gw.png)


    
 Configure Nome do projeto, Local e Nome da solução
![Configurando Nome do projeto, Local de criação e Nome da solução](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqtmdtxhf1554ljs1tu3.png)


    
 Selecione versão do .NET, habilite o Docker e selecione Linux como sistema operacional do Docker
![Selecionando versão do .NET e Habilitando Docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ya59e13dfzz3lfvtadg.png)


    

### Configurando o Docker no projeto

 Via interface os arquivos Docker são configurados automaticamente.

### Configurando Railway no projeto

 Crie um arquivo ‘railway.toml’ na raiz da solução(Mesma localização do seu arquivo .sln), preencha com os seguintes itens:
    
    
    [build]
    builder = "dockerfile"
    dockerfilePath = "./WebApiDeployExample/Dockerfile"
    
    [deploy]
    startCommand = "dotnet WebApiDeployExample.dll"
    restartPolicyType = "never"
   
    
 No projeto em Program.cs adicione o seguinte código antes de ‘var app = builder.Build();’:
    
    
    var port = Environment.GetEnvironmentVariable("PORT") ?? "8081";
    builder.WebHost.UseUrls($"http://*:{port}");
   
    
 Comente ‘app.UseHttpRedirection();’
 Caso queira visualizar o Swagger ao publicar retire ‘app.UseSwagger();’ e ‘app.UseSwaggerUI();’ de dentro das condições de ambiente de desenvolvimento.
- Antes
        
        
        if (app.Environment.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI();
        }
       
        
- Depois
        
        
        app.UseSwagger();
        app.UseSwaggerUI();
       
        

## Como subir o projeto para o github e fazer deploy no RailwayApp

### Subindo o projeto para o github

 Adicione um arquivo ‘.gitignore’ na raiz da solução(Mesma localização do seu arquivo .sln), preencha com os seguinte ou itens a critério:
    
    
    .vs
    
    
 Crie um repositório local na raiz da solução utilizando
    
    
    git init
    
    
 Crie um repositório vázio no github e conecte ao seu repositório local utilizando os comandos
    
    
    git remote add origin https://github.com/lucasdwn/WebApiDeployExample.git
    git branch -M main
    git add .
    git commit -m 'First Commit'
    git push -u origin main
   
    

### Fazendo deploy com o Railway

 No dashboard do railway após ter logado com o Github, crie um novo projeto e selecione Deploy from GitHub repo
    
    
![Criando novo projeto no RailwayApp](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9ipgdxvgiv7r3d89gfq.png)


    

 Busque pelo seu repositório e selecione 'Deploy Now’
![Selecionando repositório do github no RailwayApp](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k94xjaa9feb38pmt71gv.png)

    

 Após finalizar o deploy adicione um domínio
![Opção de adicionar domínio em destaque no RailwayApp](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/udhaaqslg1fj2i8uovl6.png)


    

 Acesse o Swagger da WebApi caso tenha removido o uso do mesmo apenas de desenvolvimento ( url/swagger/index.html)
![WebApi publicada visualizando Swagger](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1q0g35pu1o8194iqsy1o.png)


    
 Utilize o Insomnia ou Postman para enviar uma requisição para a API caso não tenha removido  Swagger de desenvolvimento.
![Programa Insomnia fazendo uma requisição GET para a API](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hoxji6wzuwnurlil4ujb.png)


## Repositório de exemplo

- [Repositório](https://github.com/lucasdwn/WebApiDeployExample)

## Documentações e referências

- [Documentação RailwayApp](https://docs.railway.app/)
- [Referência Deploy WebApi .NET no RailwayApp](https://www.iliabedian.com/blog/deploy-dotnet-app-on-railway-with-docker)

## Contatos

- [LinkedIn](https://www.linkedin.com/in/lucascostadwn/)
- [Github](https://github.com/lucasdwn)
- [E-mail](mailto:lfcosta0804@gmail.com)