Gestion des services
Vous trouverez ici décrites les différentes étapes du cycle de vie d'un service, de la décision de sa création à sa fermeture en passant par sa maintenance.
Création, installation, déploiement
Conditions d'ouverture
Avant de penser à ouvrir un nouveau service, il faut s'assurer d'avoir un objet unique et précis qui corresponde à un besoin très concret. Il faut donc vérifier que le service auquel on pense ne fasse pas entièrement ou en partie doublon avec un autre, ou qu'il ne puisse pas être intégré à une autre unité existante, ou inversement. Une fois ces conditions vérifiées, il faut effectuer les étapes suivantes dans l'ordre :
- Ouvrir une issue dans https://git.felinn.org/FELINN/asso en utilisant le modèle « création de service ». Le titre doit adopter le format « [service : création]
{{ nom de l'unité concernée }}
» et la description doit détailler le besoin et l'objectif. - L'issue doit être approuvée au niveau CC-CP-V dans le cas d'un service en production et CC-CV-V dans le cas d'un service en test ou d'un VPS.
- Si approuvée, l'issue doit donner lieu à la création de l'unité. L'issue ne peut être fermée que lorsque les décisions suivantes ont été prises :
- un·e ou des membres responsables de son administration
- mise place des permissions
- domaine à appliquer au service :
{{ service }}.felinn.org
pour les services en production (FELINN core){{ service }}.labs.felinn.org
pour les services en test (FELINN labs){{ nom }}.{{ domaine }}
pour les VPS
- type de virtualisation :
LXC
par défaut pour les services de la FELINNKVM
uniquement s'il y a besoin d'isoler le noyau (par exemple en cas d'accès root pour des personnes extérieures)
- ressources allouées
- logiciel pour le service en question:
- libre de préférence, open source au minimum (la différence est notamment expliquée ici)
- bien maintenu
- avec une communauté active
- léger
- dans le cas d'une
KVM
, le nom d'hôte (hostname
) et lelogin
(nom d'utilisateurice régulier) désirés
Création de l'unité
- Sur container LXC
- Sur machine virtuelle KVM
En complément du protocole ci-dessous, ne pas hésiter à consulter la documentation officielle de notre hyperviseur Proxmox.
- Se loguer en @(ssh) sur felinn.org et mettre à jour les images disponibles avec
pveam update
(ou vérifier que les images sont à jour). - Télécharger la dernière image disponible et stable de Debian (ou de la distribution désirée), visible sur l'interface PVE dans
storage (local)
ou avec la commandepveam available | grep debian
. Les images sont enregistrées dans/var/lib/vz/template/cache/
. S'il y a une version plus à jour, télécharger l'imagesystem
avecpveam download local debian-{{ version }}.tar.gz
et pensez à supprimer les images obsolètes. - Créer un container (
Create CT
) sur l'interface PVE (ou enssh
avec la commandepct
) avec les paramètres suivants (laisser par défaut ce qui n'est pas précisé) :
General
CT-ID
par défaut (le plus bas disponible). À partir de 100 pour les services FELINN et 200 pour les autres.Hostname
nom du service complet (avec URL) tel que décidé dans l'issue dédiéeRessource pool
FELINN-core, FELINN-labs ou VPS en fonction du type de service choisiPassword
le créer dans le répertoirepass
de la FELINN (voir la documentation dédiée) avecpass generate -c FELINN/{{ hostname }}/root
. Cette commande génère et copie dans le presse papier pendant 45sec.
Template
: choisir le dernier template debian (ou autre OS téléchargé) stableRoot disk
local-zfs
- capacité en fonction de ce qui a été décidé (utiliser des puissances de 2, c'est la tradition 😆)
CPU
: en fonction de ce qui a été décidé (il est possible de mettre plus de cœurs juste le temps de l'installation pour aller plus vite )Memoire
- en fonction de ce qui a été décidé (il est possible de mettre plus de mémoire juste le temps de l'installation pour aller plus vite !)
- SWAP = RAM
Network
IPv4
192.168.10.{{ pct_id }}/24
si c'est un serviceFELINN core
192.168.20.{{ pct_id }}/24
si c'est un service VPS pour isoler les deux sous-réseaux
Gateway
:192.168.10.1
ou192.168.20.1
en fonction de si c'est un serviceFELINN core
ouVPS
Confirmation
, bien relire et vérifier !- vous pouvez lancer le container
- Entrer dans le container en
ssh
avec la commandepct enter {{ pct_id }}.
- Nettoyer l'installation debian et installer les outils cool de base avec ce snippet.
- Vérifier que la TMZ est bien paramétrée sur
Europe/Paris
- Vérifier que les
locales
par défaut sont bien paramétrées enEN_US.utf8
- De préférence, activer
zsh
avecchsh
: choisir/bin/zsh
En complément du protocole ci-dessous, ne pas hésiter à consulter la documentation officielle de notre hyperviseur Proxmox.
Pour simplifier la procédure qui suit, il existe un template basé sur Debian pour les VM accessibles dans proxmox avec le nom VM-TEMPLATE
. Il suffit de cloner le template et de modifier en fonction des besoins.
Assurez vous d'avoir préalablement récupéré toutes les informations nécessaires avant de vous lancer dans l'installation.
Pour créer une VM « from scratch », suivre les indications suivantes :
Depuis l'hôte : télécharger la dernière image disponible et stable de Debian (ou de la distribution désirée), visible sur le site officiel (ici de Debian).
Sauf validation d'un option contraire lors de la décision de la création du service, il est préférable d'utiliser une image légère de type netinst.
Les images sont enregistrées dans /var/lib/vz/template/iso/
. S'il y a une version plus à jour, télécharger l'image avec wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-{{ version }}-amd64-netinst.iso
et pensez à supprimer les images obsolètes.
Créer une VM (Create VM
) sur l'interface PVE (ou en ssh
avec la commande qm
) avec les paramètres suivants (laisser par défaut ce qui n'est pas précisé ci-dessous) :
General
VM-ID
par défaut (le plus bas disponible). À partir de 100 pour les services FELINN et 200 pour les autres.Name
nom du service complet (avec sous-domaine) tel que décidé dans l'issue dédiéeRessource pool
FELINN-core, FELINN-labs ou VPS en fonction du type de service choisi
OS
Use CD/DVD disc image file (iso)
choisir le dernier iso debian (ou autre OS téléchargé) stableGuest OS
décrire le type d'OS utilisé
System
: laisser par défautHard Disk
local-zfs
- capacité en fonction de ce qui a été décidé (utiliser des puissances de 2, c'est la tradition 😆)
CPU
: en fonction de ce qui a été décidé (il est possible de mettre plus de cœurs juste le temps de l'installation pour aller plus vite !)Memoire
: en fonction de ce qui a été décidé (il est possible de mettre plus de mémoire juste le temps de l'installation pour aller plus vite !)Network
MAC address
: générer une adresse MAC avececho {{ $FQDN }}|md5sum|sed -E 's/^(..)(..)(..).*$/68:e1:66:\1:\2:\3/'
ou laisser enauto
Confirm
: bien relire et vérifier
✅ Vous pouvez lancer la VM
Il faut désormais installer et configurer la distribution.
Entrer dans la VNC de la machine virtuelle via l'interface web de PVE en cliquant sur le nom de la VM dans le menu de gauche, puis >_ Console
. Cette action ouvrira une fenêtre pop-up d'un terminal de la machine (noVNC par défaut).
Si on a affaire à Debian, voici la configuration de préférence :
- l'installation classique (la non graphique) est plus légère
English
comme langue pour avoir les manuels d'origine.Other
dansCountry
pour éviter les problèmes de comptabilitéFrançais
pour le keymap (peu d'importance dans la mesure ou aucun clavier ne sera réellement branché dessus 😆)DNS name server
utiliser les serveurs DNS de la FDN- le nom d'hôte désiré par la personne (physique ou morale) responsable de la VM
- le FQDN pour le nom de domaine
- générer pour
root
un mot de passe aléatoire de 8 caractères de long le temps de l'installation pour pouvoir l'écrire directement dans la VNC (cf. le tuto sur pass). full name
le pseudo désiré par lae futur·e admin- générer pour l'utilisateurice un mot de passe aléatoire de 8 caractères de long le temps de l'installation pour pouvoir l'écrire directement dans la VNC.
Europe
dans continentfrance
dans country (la deuxième fois lorsque ce choix est disponible)en_US.UTF-8
en configuration deslocales
par défaut- le chiffrement de la partition montée sur
/
implique de connaitre la phrase de passe pendant la séquence de boot. Dans certains cas, il est plus intéressant de chiffrer uniquement la partition avec les données sensible. À discuter avec l'administrateurice responsable de la VM. - LVM est un bon choix car on peut modifier la taille de la partition sans redémarrer la machine virtuelle (voir notamment la doc proxmox à ce sujet)
- ne pas scanner de CD ou DVD additionnel
- comme la VM n'est pas encore connectée,
Go back
pour poursuivre l'installation sans choisir de miroir - il n'y a pas de proxy pour les connexions sortantes
- installer GRUB sur la seule partition proposée
- se loguer en root dans le VNC
- éditer le fichier de configuration réseau debian
vi /etc/network/interfaces
avecnano
pour configurer l'interfaceens18
ou équivalente
auto lo
iface lo inet loopback
auto ens18
iface ens18 inet static
address 192.168.20.100
netmask 255.255.255.0
gateway 192.168.20.1
- lancer la commande
systemctl restart networking
pour prendre en charge la nouvelle configuration réseau - tester la connexion avec la commande
ping felinn.org
- ajouter le miroir de Rezopole dans
/etc/apt/sources.list
:
# […]
deb http://ftp.rezopole.net/debian buster main contrib
deb-src http://ftp.rezopole.net/debian buster main contrib
- faites les mises à jours avec :
apt update && apt full-upgrade
- installer OpenSSH sur la VM invitée
apt install openssh-server
# vérifier que le service est lancé
ss -tunlp
- autoriser sur la VM invitée une connexion SSH en root avec mot de passe dans
/etc/ssh/sshd_config
:
# […]
# PermitRootLogin prohibit-password
PermitRootLogin yes
# […]
-
appliquer la nouvelle configuration en relançant le service:
service ssh restart
-
configurer une règle NAT sur l'hôte sur un port alternatif libre dans
/etc/conf.d/nat/nat.conf
:
#=== SSH ===#
# […]
77.95.64.26:1822 192.168.20.205:22
# ↑port ↑VM-ID
-
recharger la configuration NAT avec
run-nat.sh
-
ouvrir une connexion SSH depuis l'extérieur avec
ssh -p 1822 user@77.95.64.26
Dès que l'accès SSH est établi, il est possible de copier/coller des mots de passe compliqués. Il faut le faire pour root
et le nom de l'utilisateurice.
Le mieux est d'ajouter l'utilisateurice au groupe admin avec sudo, d'ajouter une authentification par clé RSA et de désactiver le login root en SSH.
Si un enregistrement DNS A
pointe vers l'IP de la FELINN 77.95.64.26
pour le domaine dédié à la VM, il est possible de se connecter avec la commande ssh -p 1822 root@domain.tld
.
Pour ne plus avoir à préciser le port, il est possible d'ajouter le port alternatif à la configuration du client SSH en local sur votre machine dans $HOME/.ssh/config
:
Host domain.tld
Port 1822
Pour rendre un service web sur la VM accessible depuis l'exterieur, consulter la section sur le reverse-proxy.
Installation du service
Cette section et les suivantes ne sont obligatoires que pour les services de la FELINN. Pour les VPS, chacun·e est responsable de la gestion de son service. Mais nous vous encourageons tout de même à vous inspirer de ce qui suit !
RTFM pour être sûr d'installer uniquement ce qui est nécessaire ! Si besoin, suivre des tutoriels non officiels. Ceux de DigitalOcean par exemple sont souvent des références pertinentes. Quelques bonnes pratiques en vrac :
Permissions
Pour les services web, il faut bien faire attention à les faire tourner en user:group
www-data
ou équivalent et jamais en root, ainsi que l'installation dans la mesure du possible.
Arborescence
- Par convention, l'installation des services web se fait dans
/var/www/{{ hostname }}
. - Si le code est téléchargé à la main, il est possible de faire un lien symbolique :
/var/www/foo.felinn.org -> /var/www/code-v1.23
, ça permet de simplifier les mises à jour.
Base de données
- utiliser
postgresql
de préférence pour les performance,mariadb
sinon,sqlite3
en dernier recours s'il s'agit d'un service très léger et statique mysql
est remplacé parmariadb
- penser à changer le mot de passe
root
et à créer unuser
dédié avec des mots de passe générés avecpass
Cache
- Le proxy gère une partie du cache pour les ressources web.
- Si l'utilisation d'une instance de Redis est possible, utiliser le container dédié
110
avec les paramètres suivants :
IP
:192.168.10.110
port
:6379
password
: tel que généré avec [pass
]
Courriel
SMTP
: container105
, pas d'authentification pour le même sous-réseauIP
:192.168.10.105
port
:25
tls
:True
IMAP
: container105
, créer un compte sur mail.felinn.org/admin et stocker les identifiants danspass
IP
:192.168.10.105
port
:993
ssl/tls
:True
user/password
:pass
Proxy
- notre reverse proxy gère les connexions depuis l'extérieur ainsi que les certificats SSL
- si besoin d'un serveur web local, utiliser
nginx
avec un certificat auto signé (ou des copies de ceux du proxy), nul besoin de les renouveler puisqu'ils servent uniquement à chiffrer les connexion internes - si besoin de générer un certificat et une clé SSL :
mkdir /etc/nginx/ssl && openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/{{ hostname }}.felinn.org.key -out /etc/nginx/ssl/{{ hostname }}.felinn.org.crt
- pour homogénéiser, on crée le fichier de conf
/etc/nginx/sites-available/{{ hostname }}.felinn.org.conf
puis un lien symboliqueln -s /etc/nginx/sites-{available,enabled}/{{ hostname }}.felinn.org.conf
- le nom des logs :
{{ hostname }}.felinn.org-access.log
{{ hostname }}.felinn.org-error.log
- pour tester la configuration
nginx
et recharger le service :nginx -t && nginx -s reload
Configuration
Dans la mesure du possible, stocker les fichiers de configuration des services dans /etc/{{ service }}/{{ foo }}.conf
afin qu'ils puissent être versionnés par git.
Reverse proxy
Le reverse proxy est installé dans le container 100
. Il permet de router le trafic depuis l'extérieur vers les bons CT/VM en fonction du nom de domaine. Voici les étapes à suivre afin de configurer le nouveau CT ou la nouvelle VM sur le reverse proxy :
- entrer dans le container avec
pct enter 100
depuis l'hôte - utiliser le script nginx-new-host pour créer le service
- vérifier et recharger
nginx
avecnginx -t && nginx -s reload
- visiter le site et adapter les paramètres
SCP
dansnginx
en fonction des erreurs de la console du navigateur
Versionnage du /etc
Le versionnage des fichiers de configuration permet :
- la traçabilité des changements dans la vie d'un service
- de documenter la résolution des problèmes avec Gitlab
- de récupérer une configuration en cas de disparition, migration ou duplication d'un service
Pour mettre en place le versionnage des configurations, il faut configurer votre connexion SSH de sorte à transmettre vos variables GIT au serveur, afin que Git enregistre l'auteurice des modifications. Pour cela, merci de suivre le tutoriel dédié à la gestion de la traçabilité avec git et ssh.
- Une fois le service configuré, installer Etckeeper (dans les dépôts Debian stable par défaut). Par défaut, un répertoire git est alors automatiquement créé dans
/etc
. - Créer un nouveau projet privé dans Gitlab, dans le groupe approprié (
FELINN core
,Labs
,Friends
) portant le nom du domaine complet, ex:{{ service }}.felinn.org
et commiter les changements locaux si besoin. - Ajouter l'
upstream
au répertoire git local et pousser les modifications :
# ajouter le `remote` dans le repo git du service
git remote origin set-url "https://git.felinn.org/{{ group }}/{{ service }}.git"
# /!\ Si aucun remote n'a préalablement été configuré, ce qui est probable lors de l'installation, préférez la commande suivante
git remote add origin "https://git.felinn.org/{{ group }}/{{ service }}.git"
# pousser les modifications, notez que l'option -U ne semble pas être forcément reconnue
git push -U origin master
- Vérifier que tout les fichiers sont bien présents dans le projet Gitlab.
- Pour pouvoir ouvrir un projet Gitlab de la FELINN au public, il faut configurer les permissions comme suit :
Issues
: « Everyone With Access »Repository
: « Only Project Members »Wiki
: « Only Project Members »
Sécurisation
- supprimer les logiciels inutilisés (ceux qui auraient été installés par mégarde ou qui sont inutiles de fait, comme Apache)
- vérifier que les paquets sont à jour :
apt update && apt full-upgrade
- vérifier que les services web tournent avec un
user
autre queroot
:ps aux | grep <service>
outop
- vérifier que seuls les ports nécessaires sont ouverts et vérifier les interfaces d'écoute depuis l'extérieur :
ss -tunlp
- des outils comme wapiti peuvent aider à vérifier la santé d'un service web
- en cas de problème venant du reverse proxy, ouvrir une issue sur le projet
Documentation
Si. Il faut la faire. Voir la [documentation de la documentation](lien vers la doc de la doc) pour pouvoir bien la faire.
Publication de l'état de fonctionnement
Voir l'issue à ce sujet.
Maintenance
La personne qui a installé le service en est de fait la principale responsable.
Voir l'issue à ce sujet.
Durée de vie & fin de vie
Tous les services sont maintenus à durée indéterminée par défaut. Ils peuvent être fermés dans les cas suivants :
- le service n'est plus utilisé ou ne répond à plus aucun besoin
- le ou les logiciels utilisés par le service changent de statut et sont incompatibles avec la charte de la FELINN
- le service induit des failles de sécurité incorrigibles
- le service utilise trop de ressource par rapport à ce qu'il offre
Pour fermer un service il faut respecter la démarche suivante :
- Ouvrir une issue dans https://git.felinn.org/FELINN/asso en utilisant le modèle « suppression de service ». Le titre doit adopter le format « [service : suppression]
{{ nom de l'unité concernée }}
» et la description doit détailler les raisons de la suppression. - L'issue doit être approuvée au niveau CC-CP-V dans le cas d'un service en production et CC-CV-V dans le cas d'un service en test ou d'un VPS.
- Si approuvée, l'issue doit donner lieu au choix d'un délai, à une annonce de la fermeture de l'unité auprès des utilisateurices et/ou de la communauté concernée, ainsi qu'à la désignation des membres qui seront responsables de la suppression.
- Une fois le délai de fermeture écoulé, éteindre le CT ou la VM.
- Si aucun problème n'est survenu dans la semaine suivante, nettoyer les traces du service :
- supprimer les fichiers de configuration sur le proxy
- supprimer le container ou la machine virtuelle du service en purgeant les fichiers de configuration dans PVE
- supprimer les volumes ZFS et les snapshots associés
- archiver le projet Gitlab associé pour garder la trace de la vie du service (peut servir à d'autres et évite de refaire certaines erreurs)