1. Сбилдить .NET приложение в докере.
2. Развернуть докер контейнер на сервере.
3. Развернуть nginx (тоже можно в контейнере) на сервере.
4. Настроить nginx, который будет проксировать трафик в п2:
4.1. Запретить все.
4.2. Разрешить :80 и :443 порты.
4.3. Пробросить с п4.2 на внешний порт контейнера п2.
4.4. Настроить SSL Let's Encrypt (при необходимости).
По сути, можно взять любое руководство настройки докера и nginx, без привязки к .NET.
UPD на основе данных из комментариев, конфиги будут выглядеть примерно так, dockerfile (поправить под свое приложение):
# Образ asp.net.
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# Компилируем приложение из /src.
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# Копируем файл проекта и восстанавливаем зависимости.
COPY ["Project.csproj", "."]
RUN dotnet restore
# Копируем оставшиеся файлы и компилируем приложение.
COPY . .
RUN dotnet build -c Release -o /app/build
# Публикуем приложение.
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
# Создание итогового образа.
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.dll"]
nginx (поправить под свое приложение):
# http.
server {
listen 80;
listen [::]:80;
# Домены для обслуживания.
server_name domain.ru www.domain.ru;
# 301 редирект http->https.
return 301 https://$host$request_uri;
}
# https.
server {
listen 443 ssl;
listen [::]:443 ssl;
# Домены для обслуживания.
server_name domain.ru www.domain.ru;
# Пути до letsencrypt сертификатов.
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
location / {
# Адрес, по которому доступно приложение на локалке сервера (localhost не указывать, а указывать имя контейнера (project в моем случае)).
proxy_pass http://project:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
P.S. рекомендую освоить Docker Compose, чтобы было меньше возьни с разворачиванием и общением между контейнерами.