рдкрд╣рдЪрд╛рди
.NET рдУрдкрди-рд╕реЛрд░реНрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдирд╡рд╛рдЧрдВрддреБрдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ Node.js. рдЬреИрд╕реЗ рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИред рддреЛ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ рдЬреЛ .NET рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреИрд╕реЗ рдХрд┐ ASP.NET рдЬреИрд╕реЗ Heroku рдкрд░ рдбреАрд▓ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЬреЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╢рд╛рдпрдж рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдХреНрдпрд╛ рдЖрдк рдпрд╣рд╛рдБ C # /ред NET рджреЗрдЦрддреЗ рд╣реИрдВ? рд╣рд╛рдВ, рдореИрдВ рднреА рдирд╣реАрдВред
рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Docker, .NET Core рдФрд░ Heroku рдЯреВрд▓ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВред рдореИрдВ рд▓рд┐рдирдХреНрд╕ (рдЙрдмрдВрдЯреВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди AFAIK рд╡реЗ рдЙрдкрдХрд░рдг рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдорд░реНрдерд┐рдд рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЪрд░рдг рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред
рдЖрдЗрдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдорд╛рдорд▓рд╛ рд▓реЗрддреЗ рд╣реИрдВ - рд╕рд░рд▓ MVC рдРрдкред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ рдЪрд▓рд╛рдХрд░ рдмрдирд╛рдПрдВ
dotnet new mvc --name mymvc
рдореИрдВ рдпрд╣ рднреА рдорд╛рди рд▓реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЙрдХрдЯрд░рд╛рдЗрд▓ рддреИрдпрд╛рд░ рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS builder WORKDIR /sources COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet publish --output /app/ --configuration Release FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 WORKDIR /app COPY --from=builder /app . CMD ["dotnet", "MyMvc.dll"]
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ENTRYPOINT рдХреЛ CMD рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВред
рддреЛ, рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реАрдбреА рдФрд░ рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
Heroku рдХрдВрдЯреЗрдирд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВред
heroku container:login
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореМрдЬреВрджрд╛ git рд░реЗрдкреЛ рдирд╣реАрдВ рд╣реИ, рддреЛ git init
рдПрдХ рдирдпрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ
рдПрдХ рдирдпрд╛ рдРрдк heroku create
рд▓рд┐рдП heroku create
, рдЬреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЧрд┐рдЯ рд░реЗрдкреЛ рдкрддреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ
Creating salty-fortress-4191... done, stack is heroku-16 https://salty-fortress-4191.herokuapp.com/ | https://git.heroku.com/salty-fortress-4191.git
(рд╡реИрдХрд▓реНрдкрд┐рдХ) рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ git remote -v
рдЪрд▓рд╛рдХрд░ рд╣рд░реЛрдХреВ рд░рд┐рдореЛрдЯ рд╣реИ
рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░реЛрдХреВ рдХреЛ рдмрддрд╛рдПрдВ:
heroku stack:set container
Heroku.yml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
build: docker: web: Dockerfile
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ASP.NET рдХреЛрд░ рдкреЛрд░реНрдЯ 5000 рдФрд░ 5001 (https) рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рд╣реЗрд░реЛрдХреВ рд╡рд╣ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреЗрд╕реНрдЯрд░реЗрд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
System.Net.Sockets.SocketException (13): Permission denied
рд╣рд░реЛрдХреВ рдЖрдкрдХреЛ $PORT
рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдк рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдРрдк рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдбрд┐рдлреЙрд▓реНрдЯ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ CreateWebHostBuilder
рдХреЛ Program.cs
рдореЗрдВ рдирд┐рдореНрди рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдВ:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var port = Environment.GetEnvironmentVariable("PORT"); return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://*:"+port); }
рд╕рдм рдХреБрдЫ рдХрдорд┐рдЯ рдХрд░реЗрдВ:
git add . && git commit -m 'Meaningful commit message'
рдЕрдм рдХрдВрдЯреЗрдирд░ рдХреЛ рдирд┐рд░реНрдорд┐рдд рдФрд░ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВ (рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рдкрд╛рд░ рдХреА рдЧрдИрдВ):
git push heroku master
рдЕрдм рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдм ENTRYPOINT рдХреЛ doDfile рдореЗрдВ CMD рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рд╣рдо рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП ENTRYPOINT ["dotnet", "MyMvc.dll"]
рдФрд░ CMD ["dotnet", "MyMvc.dll"]
рдХреЛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк ENTRYPOINT рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:

рдХреНрдпрд╛ рдмрдбрд╝реА рддреНрд░реБрдЯрд┐ рд╣реИ - "рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдлрд╝реЛрдореЗрд╢рди рдЕрдкрдбреЗрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐"! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдмрддрд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ heroku.yml
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рд░реЛрдХреВ рдЖрдкрдХреЗ рдбреЙрдХрдЯрд░рд╛рдЗрд▓ рдореЗрдВ рд╕реАрдПрдордбреА рдирд┐рд░реНрджреЗрд╢ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдЬрдм рдЖрдк рдЗрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рд░реЛрдХреВ рдореЗрдВ рд╕рд░рд▓ ASP.NET рдХреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣рдЬ рд╣реИ? рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВред рдЕрдкрдиреЗ .NET рдРрдкреНрд╕ рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Heroku рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ? рд╢рд╛рдпрдж рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╣рд╛рдВ рд╕рд╛рдЗрди рдЕрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдпреЛрдЬрдирд╛ рдирд┐рд╢реБрд▓реНрдХ рд╣реИ - рд╢рд╛рдпрдж рдЖрдк рд╡рд╣рд╛рдВ рдХреБрдЫ рд╣реЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдПред
рд╕рдВрджрд░реНрдн
- https://devcenter.heroku.com/articles/container-registry-and-runtime
- https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
- https://docs.docker.com/engine/examples/dotnetcore/ (Dockerfile)