Rootmanual:dotnet

Från Lysators datorhandbok, den ultimata referensen.
Hoppa till navigering Hoppa till sök

En kort sammanfattning av hur nuvarande Medreg, som är skrivet i C# och .NET 6+, satts upp, vilket säkerligen skulle gå att applicera åtminstone delvis även på andra Asp.Net-system.

Installera SDK

För en redhat-lik distribution bör det räcka med

dnf install dotnet-sdk-7.0

Vill man köra konsolprogram eller liknande är det allt som behövs göras, vill man sätta upp en webbtjänst behöver den förstås sättas upp exempelvis enligt nedan.

Alternativt, om man bara vill installera runtime (vilket dock innebär att du behöver bygga artefakterna någonstans där sdk är installerat istället) så kan man göra

dnf install aspnetcore-runtime-7.0

Motsvarande kommandon finns för andra distributioner, se https://learn.microsoft.com/en-us/dotnet/core/install/linux

Sedan kan man checka ut och bygga, förslagsvis i releasekonfiguration

dotnet publish --configuration Release

Kopiera sedan bin/Release/net6.0/publish/* till lämplig plats, i medregs fall t.ex. /var/www/medreg/

Sätta upp systemd-tjänst

För medreg skapades en fil /etc/systemd/system/kestrel-medreg.service med ungefär nedanstående innehåll

[Unit]
Description=Kestrel host for .net medreg

[Service]
WorkingDirectory=/var/www/medreg
ExecStart= /usr/bin/dotnet /var/www/medreg/MedregWeb.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-medreg
User=www-data
Environment="ASPNETCORE_ENVIRONMENT=Production"
Environment="DOTNET_CLI_TELEMETRY_OPTOUT=1"
Environment="DOTNET_PRINT_TELEMETRY_MESSAGE=false"
Environment="LC_ALL=sv_SE"
Environment="Keycloak__Authority=https://login.lysator.liu.se/auth/realms/Lysator"
Environment="Keycloak__ClientId=..."
Environment="Keycloak__ClientSecret=..."
Environment="ConnectionStrings__Db=server=localhost;user id=...;password=...;database=...;charset=utf8mb4;ConvertZeroDateTime=true"
Environment="MysqlVersion=10.5.15"
Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Url=https://localhost:5000"
Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Certificate__Path=/var/www/localhost.pem"
Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Certificate__KeyPath=/var/www/localhost-key.pem"
[Install]
WantedBy=multi-user.target

Diverse konfigurering du vill hämta ur ett IConfiguration lägges med fördel här (t.ex. inställningar för den client du satt upp i keycloak om du nu använder keycloak, databasanslutning, ...) istället för att försöka förlita sig på application-settings.json osv. ("__" ersätter här, precis som i Azure, ":" när det gäller navigering av motsvarande json-träd i en sådan fil)

eventuellt därefter

systemctl daemon-reload

För certifikatet har jag använt mkcert för att på ett enkelt sätt få till ett certifikat för { medreg medreg.lysator.liu.se localhost 127.0.0.1 ::1 } som litas på av den lokala servern, istället för att köra med ett servern inte litar på eller helt utan tls. Den funktionalitet som dotnet-sdk självt har för detta (dotnet dev-certs) fungerar åtminstone i skrivande stund bara på windows och macos.

Sedan kan du starta och enablea den nya tjänsten, och om allt stämmer ska nu en kestrelserver svara på port 5000 på localhost.

Nginx

Istället för att webbservern Kestrel, som med fördel används för Asp.Net, pratar direkt med internet (vilket förvisso går bra att göra med om man känner för det) så har den här satts bakom en nginx som agerar reverse proxy.

Proxyinställningarna kan se ut ungefär såhär:

    location / {
        proxy_pass         https://[::1]: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;
        proxy_buffer_size          128k;
        proxy_buffers              4 256k;
        proxy_busy_buffers_size    256k;
    }
    add_header X-Frame-Options "SAMEORIGIN";

    large_client_header_buffers 4 32k;

För TLS kan man med fördel använda certbot för automatiskt utfärdande och förnyande av letsencrypt-cert.