Deployment

IIS (Windows Server)

1. Publish

dotnet publish -c Release -o publish

2. Install Chromium

cd publish
$env:NODE_SKIP_PLATFORM_CHECK = "1"
powershell -ExecutionPolicy Bypass -File playwright.ps1 install chromium

3. Copy Chromium to system profile (IIS)

$src = "$env:LOCALAPPDATA\ms-playwright\chromium-1217"
$dst = "C:\Windows\system32\config\systemprofile\AppData\Local\ms-playwright\chromium-1217"
New-Item -ItemType Directory -Path $dst -Force
Copy-Item -Path $src -Destination $dst -Recurse -Force

4. Grant IIS permissions

$acl = Get-Acl "C:\Windows\system32\config\systemprofile\AppData\Local\ms-playwright"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS","FullControl","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($rule)
Set-Acl "C:\Windows\system32\config\systemprofile\AppData\Local\ms-playwright" $acl

5. Configure IIS

  1. Open IIS Manager -> Add Website
  2. Set Physical path to publish folder
  3. Set .NET CLR Version to No Managed Code in App Pool
  4. Set Cloudflare SSL to Full (not Flexible)

Windows Server 2016 — Special setup

Windows Server 2016 requires an older Chromium build. See PDF & Chromium for the full WS2016 workaround.


Docker

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app

RUN apt-get update && apt-get install -y \
    libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 \
    libgbm1 libgtk-3-0 libasound2 \
    && rm -rf /var/lib/apt/lists/*

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 8080
ENTRYPOINT ["dotnet", "YourApp.dll"]

Next: License