En voila un titre bien déguelasse.
Suite à l’article précédent (comment heberger asp.net, un bref historique) je voulais consigner ici mes trouvailles concernant la mise en place d’un site web asp.net core sur Linux Debian.
Pour cela j’ai loué un VPS Linux chez iKoula pour 4€.
On a donc un accès SSH suite à l’obtention de ce dernier, on se connecte et je vous montre comment on fait un site web qui marche en .net Core.
Sources
Voici les quelques sites web qui m’ont servit dans cet article.
Projet web Asp.net core
On commence par la création locale d’un site web en asp.net core .net 5. Qu’il faut bien entendu avoir sur son poste.
Je vous renvois à la doc pour toute la paprasse,
https://docs.microsoft.com/fr-fr/aspnet/core/getting-started/?view=aspnetcore-6.0&tabs=windows
C’est une des meilleurs doc du web, donc profitez en. Je vais pas la réinventer, je vais a l’essentiel. La commande suivante va vous créer une api web de base.
dotnet new webapi -o TodoApi
On va garder l’exemple de microsoft « TodoApi », qui est en fait une api toute conne avec un seul control qui donne la météo. Je m’en fou total de ce truc, c’est pour l’exemple.
Pour moi il manque une route, celle de la « home ». Alors je rajoute un controler « home
Histoire d’avoir qq chose à afficher à la racine du site. On teste le site web
dotnet run.
De base vos ports sont 5001 sur https (avec un certificat local de developer) et 5000 en http.
Ces ports sont localisés dans Properties/launchSettings.json dans la propriété applicationUrl
Si comme moi, vous avez plusieurs sites asp.net core, vous allez probablement changer ces ports. Et on va le voir par la suite cela a une grande importance. Moi je le fait directement dans le code source, mais ya d’autre méthodes.
Le site tourne on va le publier avec la commande suivante
dotnet publish -c Release
Ce qui va créer un nouveau répertoire \bin\Release\net5.0\publish
Ou on aura tous les fichiers nécessaires pour notre site web en production dedans.
Install Server VPS
Alors avant toute chose, je suis pas un expert linux. Si je dis une connerie, faut le signaler dans les commentaires svp. J’ai un passif Windows qui m’a éloignié de Linux, meme si de base, je suis ingé système et réseau, de ya 20 ans…
On commence, on se connecte en SSH.
Alors perso, j’ai découvert une extension de visual studio code qui facilite la vie. C’est Remote-SSH.Ca permet d’éditer des fichiers distants directement dans VS (et d’avoir tous les outils, couleurs, syntaxe, etc…) Mais ca fait aussi explorateur de fichier, FTP et bien entendu on a toujours une ligne de commande à porté de main, tout ca dans VS code. Un must have.
Dotnet 5.0
wgt https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.debsudo dpkg -i packages-microsoft-prod.debrm packages-microsoft-prod.deb
sudo apt-get updatesudo apt-get install -y apt-transport-httpssudo apt-get updatesudo apt-get install -y dotnet-sdk-5.0
Nginx
Pré install
sudo apt update sudo apt upgrade sudo apt install curl gnupg2 ca-certificates lsb-release
Install
sudo apt install nginx
On Check
nginx -v
Ce qui donne pour moi :
nginx version: nginx/1.18.0
on en profite pour installer un firewall ufw
apt-get update && apt-get install ufw
et on l’active
ufw enable
Alors attention, ca pourrait couper votre connexion SSH, mais les gars ils sont pas trop con, ils ont par defaut ouvert le port 22.
On ajoute les règles de bases NGinx
sudo ufw allow 'Nginx HTTP'
A ce stade on devrait avoir un site web qui tourne. Donc aller changer votre DNS pour modifier ou ajouter un domain, par exemple prout.com qui pointe vers l’ip de votre serveur. Profitez en pour ajouter une nouvelle entrée A dans votre zone DNS todoapi.prout.com qui pointe vers la meme IP.
Ca peut prendre jusqu’à 24h, mais aujourd’hui ca va plus vite. Si c’est un .fr ca devrait pas trainer. Sinon, faut pinger l’adresse jusqu’à avoir une réponse et une IP qui va bien.
Aller dans votre navigateur préféré et taper votre domaine, pour moi :
http://prout.com
et si vous voulez pas attendre taper directement l’ip de votre serveur.
Notez que pour le moment on parle pas encore de https.
Et bimm :
Tu n’as un beau serveur d’enculé !
Config Nginx
On fait un pti point pour comprendre les choses.
Dans /var/www/html on a le code source de notre site web.
Dans /etc/Nginx on a notre serveur web Nginx et ses conf
Le répertoire sites-available va contenir les configurations de nos sites web.
Le répertoire sites-enabled va contenir des liens vers les config précédentes. Ce qui les rendra actives !
C’est ce que l’on va faire, on va créer un nouveau site. Pour cela on va commencer par mettre un nouveau répertoire dans /var/www qui va contenir le publish de tout à l’heure. Alors on y va, on copie…
Ensuite il faut créer un fichier dans /etc/nginx/sites-available/, par exemple todoapi.prout.com.conf et on y met ceci
Noter 3 points, le serveur name avec le DNS de tout à l’heure. le root avec l’emplacement de notre publish. Et enfin le proxy pass et son port 5002. On y reviendra.
Pour que ca fonctionne, il faut créer un lien magique dans sites-enabled, comme expliqué ci dessus.
On check Nginx
et on le relance
Et la tu tapes http://todoapi.prout.com dans ton browser et … ça marche pas.
Normal on a pas lancer notre Kestrel, le truc qui fait tourner tout seul asp.net 5.0.
Et la faut faire un petit point…
Le petit point
En fait on pourrait se passer de Nginx et utiliser Kestrel à la place, comme on le fait déjà en dev. (vous lancer un kestrel quand vous faire un dotnet run).
Sauf que Kestrel il est un peu con con et c’est pas un vrai serveur web. Il te faut un apache, un nginx, un IIS … enfin un serveur web digne de ce nom.
Ce qui nous amène à un point important. Nginx va écouter kestrel qq part et c’est la raison de ligne proxy_pass
proxy_pass http://127.0.0.1:5002;
Sur le port 5002. Et la tu te dis, et comment je fais moi avec mon canal https sur le port 5003 de tout à l’heure, que si t’avais bien écouté, on parlait tout à l’heure… hein pti con. (je m’adresse à moi même, car je pense que personne ne lis ca. donc qq part je fais ce que je veux)
Et bien la couche https va se gérer au niveau de Nginx, donc on a plus besoin du port 5003. (Si on le laisse, ca force une redirection chelou en 5003, à cause de ce bout de code qui est part défaut :
et de
Que l’on a mis dans notre code. Ouais, je sais, c’est moi qui est dit de le mettre comme une merde. Alors on va changer ca par ces lignes :
Comme ça, tu bosses normalement en dev. Et en prod, on a qu’un seul port. Va falloir refaire un publish et une copie sur le serveur pour mettre tout ça à jour.
Ca marche toujours pas connard !
Et tu as bien raison de m’insulter. Mais on a toujours pas lancé kestrel enculé.
Alors deux options :
- à la main pour bien que tu comprennes, en allant directement dans le path /var/www/todoapi et en tapant dotnet todoapi.dll (ouais .dll, c’est ouf .net core) Et ton serveur va tourner. Sauf que si ca plante, ca redémarre pas. Donc on va créer un service proprement.
- en auto. Il faut créer un fichier dans /etc/systemd/system/todoapi.service avec ce contenu
Notez que le user est root, vous pouvez changer ca mais faudra donner les droits qui vont bien. (démerde toi)
Et ya plus qu’a le rendre enable, le lancer et checker le status avec ces commandes :
sudo systemctl enable todoapi.service
sudo systemctl start todoapi.service
sudo systemctl status todoapi.service
Si jamais vous modifier ce fichier, ou un autre, faudra relancer le deamon avec cette commande
Letsencypt
Il nous manque un dernier point. Le https. Pour ca nous faut un certificat. Ya qq année j’aurai mis des plombes a expliquer tout ca. Mais aujourd’hui, on a letsencrypt qui est une pépite tellement c’est simple
Alors on install CertBot qui un client utilisant le protocol ACME (t’es content de savoir ça hein)
https://certbot.eff.org/instructions?ws=nginx&os=debian-10
Faut suivre l’install et après on a juste a lancer ca :
sudo certbot –nginx
(Attention double tiret)
Et on est guidé. C’est super simple. Merci Letsencrypt.
Et on peut lancer la commande suivante pour automatisé le renouvellement de certificat pour bien avoir le temps de boire des bières dans le canap
sudo certbot renew –dry-run
https://todoapi.prout.fr devrait tourner avec un beau petit certificat qui va bien.
aller voir votre fichier de conf concernant le site, histoire de voir ce que vous venez de changer.
Ca marche !
Ouais ba j’espère bien, ça fait deux heures que je suis sur cet article.
Un commentaire