Aller au contenu principal

FAQ

Semantic-release

Semantic-release est utilisé pour créer des releases automatiques lors d'un merge sur la branche principale et alpha, beta, next.

La release est conditionnée par la présence d'un commit conventionnel de type fix: some fix ou feat: some new feature (semantic-relase default commit conventions)

Ajoutez un fichier .github/workflows/release.yml à votre repo.

Déployer un hotfix

Si votre branche master a évolué, mais que vous souhaitez déployer un hotfix en préprod ou prod, créez une nouvelle branche beta ou alpha à partir de la derniere release et commitez un fix:.

semantic-release déclenchera alors une release alpha ou beta puis le workflow production vous proposera de la déployer.

Pour publier sur npm

Les packages npm doivent être publiés en tant que @socialgouv/package-name.

Le champ author doit être positionné à Fabrique numérique des Ministères Sociaux <contact@fabrique.social.gouv.fr> (https://fabrique.social.gouv.fr)

dans package.json, ajouter "publishConfig":{"access": "public"}

Pour publier sur npm, il vous faudra un fichier release.yml particulier, exemple

Le groupe GitHub SocialGouv fournit plusieurs secrets utilisables dans vos jobs :

  • secrets.SOCIALGROOVYBOT_NPM_TOKEN
  • secrets.SOCIALGROOVYBOT_NAME
  • secrets.SOCIALGROOVYBOT_EMAIL

Utilisation de renovate

Le bot renovate permet d'automatiser la maintenance des dépendances de votre projet.

Vous devez ajouter un fichier .github/renovate.json dans votre projet avec la config souhaitée

Nous proposons deux presets de base :

Config standard

Pour une maintenance quotidienne de votre projet

{
"enabled": true,
"extends": ["github>SocialGouv/renovate-config"]
}

Config light

Pour une maintenance raisonnée de votre projet

  • patchs appliqués en groupe toutes les lundi matin automagiquement
  • mineurs tous les 1er du mois via une PR groupée
  • majors séparées tous les 1er du mois via des PR distinctes
{
"enabled": true,
"extends": ["github>SocialGouv/renovate-config:light"]
}

Customisation

renovate propose de nombreuses options pour étendre ces presets et les adapter à vos besoins.

Il est possible de consulter les logs des jobs renovate ici : https://app.renovatebot.com/dashboard

Créer un secret pour accéder à un registre GitLab privé

  1. Dans le projet GitLab, "Settings/Repository/Deploy Tokens", créer un nouveau token avec les droits read_registry

  2. Créez le sealed-secret

#!/bin/sh
gitlab_project=some_gitlab_project_name
gitlab_user=gitlab+deploy-token-xxx
gitlab_token=somepass

sre-seal --name regcred "dockerconfigjson={\"auths\":{\"registry.gitlab.factory.social.gouv.fr/socialgouv/$gitlab_project\":{\"auth\":\"`echo -n \"$gitlab_user:$gitlab_token\"|base64`\",\"password\":\"$gitlab_token\",\"username\":\"$gitlab_user\"}}}"

Dans le YAML généré, modifier le type de Opaque à kubernetes.io/dockerconfigjson

NB : ajouter --cluster prod --namespace [app-namespace] --name regcred pour un secret de production

  1. Référencez ce secret dans votre deploiement
spec:
imagePullSecrets:
- name: regcred

Grafana

Dashoards

Vous pouvez créer vos propres dashboards et vos propres groupes de dashboards qui regroupent les métriques techniques issues de l'infrastructure (réseau, storage, bases de donnés), du service (cpu, mem, hits...) ou de l'application si vous exposez des métriques OpenMetrics. Pour interroger Prometheus qui expose les métriques, il faut utiliser le language PromQL. Exemples : https://timber.io/blog/promql-for-humans

Logs Loki

Vous pouvez interroger vos logs applicatifs dans la section Explore de Grafana avec LogQL.

Les logs applicatifs doivent respecter les bonnes pratiques de logging

Exemples

Logs de vos containers : {cluster="dev2", namespace=~"myapp.*"} |= "webhook"

Affiche les logs applicatifs qui contiennent webhook dans les namespaces myapp* du cluster dev2.

Logs Ingress : {cluster="dev2", namespace="ingress-basic"} | json | vhost=myapp.dev2.fabrique.social.gouv.fr status=403

Affiche les logs en erreur 403 du front nginx de votre application (ingress)

Cf cheat sheet LOKI : https://megamorf.gitlab.io/cheat-sheets/loki/

Next.js

Variables d'environnement côté frontend

Voir l'implémentation de template

Bases de données

Bases de données PostgreSQL CNPG

Vous aurez besoin de kubectl installé avec les bons KUBECONFIG récupérés depuis rancher.

⚠️ Attention à bien utiliser le bon contexte lorsque vous utilisez kubectl.

Identifiez vos noeuds PostgreSQL : kubectl -n[NAMESPACE] get po --selector=cnpg.io/podRole=instance -o=custom-columns="NAME:.metadata.name,ROLE:.metadata.labels.role".

Pour de la lecture seule, choisissez un replica, et primary si besoin d'écrire.

💡 CNPG utilise des certificats SSL self-signés, il faut désactiver le SSL selon les clients

Se connecter avec un client PostgreSQL

  • récupérer le secret pg-app dans le namespace de la base de données : kubectl -n[NAMESPACE] get secret pg-app -o jsonpath='{.data.DATABASE_URL}' | base64 -d
  • ouvrir un port-forward : kubectl port-forward -n [NAMESPACE] [POD] 5435:5432
  • se connecter à postgres://[USER]:[PASS]@127.0.0.1:5435/[DB]?sslmode=disable
Avec kubectl

On peut lancer un cli psql directement : kubectl exec -ti -n [NAMESPACE] [POD] psql. Ex: kubectl exec -ti -n template pg-1 psql. idem pour pg_dump & all.

Récupération d'un dump

  • via un client S3 : en récupérant le secret backups présent dans le namespace de la base de données
  • ou via kubectl : kubectl --context CONTEXT -n NAMESPACE exec -ti pg-N -- pg_dump -Fc -d DATABASE -n public --no-privileges --quote-all-identifiers > backup.dump

Remplacer CONTEXT (ovh-dev ou ovh-prod), NAMESPACE, pg-N par le pod pg d'un replica en lecture ou du master si pas de replica en lecture.

Voir aussi : https://cloudnative-pg.io/documentation/current/troubleshooting/#emergency-backup

Bases de données Azure Postgres

⚠️ Les PG azure sont en cours de remplacement par des instances CNPG (cf paragraphe précédent).

ERROR: cannot execute xxx in a read-only transaction

Si le serveur est trop plein, il se met automatiquement en "read-only". Pour pouvoir faire le ménage, executer SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE; pour reactiver la mode "writeable".

Voir aussi la doc Microsoft.

Too many failed login attempts

Par défaut, le connection_throttling est activé sur les logins PG. Il peut se désactiver via la console Azure PG / Server parameters puis désactiver connection_throttling.

remaining connection slots are reserved for non-replication superuser connections

Les serveurs PG avec 1 core sont limités à 50 connections simultannées.

Se connecter au serveur PG en admin et :

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND state_change < current_timestamp - INTERVAL '30' MINUTE;

See also Limits in Azure Database for PostgreSQL

Accès aux serveurs de bases de données PG de dev (Azure managé)

Notez bien que vous devez faire partie de la team Admins de votre startup sur GitHub pour pouvoir accéder à la db

Vous pouvez vous connecter à vos instances PostgreSQL via Teleport.

  • Téléchargez et installez le GUI Teleport Connect (c'est l'application Teleport qui est sélectionnée par défaut sur la page, il faut sélectionner Teleport Connect)
  • Lancez l'application Teleport Connect
  • Renseignez l'addresse suivante quand elle vous est demandée: teleport.fabrique.social.gouv.fr et authentifiez vous avec Github.
  • Naviguez dans l'onglet "Databases"
  • Choisissez votre serveur Postgres et cliquez sur "Connect" (avec le user PostgresAdmins) puis renseignez le nom de la db postgres que vous souhaitez accéder et cliquer sur run. (ex: preprod)

⚠️ De plus vous accéderez à la base de donnée en administrateur, vous êtes responsable de vos actions.

Alternative via le CLI teleport tsh

  • Téléchargez et installez le CLI Teleport
  • Localement, se logger sur teleport avec : tsh login --proxy=teleport.fabrique.social.gouv.fr teleport.fabrique.social.gouv.fr --auth=github
  • Se connecter à une DB avec psql : tsh db connect --db-user=PostgresAdmins --db-name=postgres [DBNAME]
    • Pour ouvrir seulement un tunnel SSH et pouvoir connecter l'outil de votre choix (par exemple pg_dump) : tsh proxy db --db-user=PostgresAdmins --db-name=postgres --tunnel [DBNAME]

💡 Pour configurer un client Postgres avec teleport, cf https://goteleport.com/docs/connect-your-client/gui-clients/

Azure Storage

Hebergement vidéo

Un stockage azure peut être utilisé pour stocker des vidéos hors de GIT. Il faut placer les videos dans un "blob container" public, et jouer la commande suivante pour autoriser le "seek" (headers content-range) : az storage account blob-service-properties update --account-name xxxxx --default-service-version '2020-10-02'

Hasura

JWK_KEY

Il vaut mieux utiliser une JWK_KEY statique plutôt qu'une JWK_URL qui nécessite que l'url soit disponible au démarrage d'hasura.

Kubernetes

comment débugger

Utiliser rancher ou k9s pour aller dans votre namespace puis votre pod et inspecter les logs et events.

Consulter les logs dans Grafana

requests/limits

Pour optimiser ces valeurs, scruter les graphs de grafana. Les requests sont les ressources minimales requises pour démarrer un pod. Les limits vont capper le CPU, et si la mémoire utilisée excède la limite définie, le pod sera tué et redémarré.

Il est important d'ajuster finement ces valeurs pour optimiser les ressources sur le cluster et pouvoir aller vers de la scalabilité.

Lancer un job de backup de la BDD

Des jobs de backup des BDDs sont executés quotidiennement. Pour forcer un nouveau backup pour l'appli xxx, lancer kubectl --context prod --namespace xxx create job --from=cronjob/backup-db-xxx my-backup.

IPs du cluster

Azure

NomIP
Ingress PROD20.74.14.77
Ingress DEV51.103.10.142
IP de sortie PROD20.74.10.146
IP de sortie DEV20.74.14.116

OVH

NomIP
Ingress PROD57.128.91.43
Ingress DEV162.19.108.127
IP de sortie PROD57.128.58.116
IP de sortie DEV57.128.42.205

Scaleway

NomIP
Runner SCW151.15.230.115
Runner SCW251.158.120.34

Noms de domaines externes

Adresses des serveurs DNS à configurer sur votre nom de domaine (à confirmer):

  • Name server 1: ns1-04.azure-dns.com.
  • Name server 2: ns2-04.azure-dns.net.
  • Name server 3: ns3-04.azure-dns.org.
  • Name server 4: ns4-04.azure-dns.info

La fabrique peut gérer votre nom de domaine sur son compte OVH.

Nginx : request entity too large

Si vous devez envoyer de gros fichiers, vous pouvez être limité à l'envoi avec cette erreur côté serveur; dans ce cas, ajoutez les annotations ingress nginx suivantes dans votre values.yaml :

my-component:
ingress:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 512m

Nginx : custom headers

Vous pouvez facilement ajouter des headers customs sur votre "ingress" nginx :

app:
ingress:
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';

Mattermost

Mattermost reminder bot

Reminder récurrent avec lien de meeting sur channel public:

/remind ~s-domifa-dev "
# DOMIFA WEEKLY MEETING :stopwatch:
:video_camera: https://whereby.com/teamdomifa
" every wednesday at 11:00AM

Autres exemples: https://github.com/scottleedavis/mattermost-plugin-remind/wiki/Usage Documentation: https://github.com/scottleedavis/mattermost-plugin-remind

Mattermost Github integration

Se connecter en utilisant le client Web (semble ne pas fonctionner sinon): https://mattermost.fabrique.social.gouv.fr

Dans n'importe quel canal, taper:

/github connect

Puis cliquer sur le lien qui apparait pour autoriser l'accès à votre compte github.

Commandes utiles:

# activer les notifications
/github settings notifications on

# s'abonner à un repo (pulls,issues,creates,deletes)
/github subscriptions add SocialGouv/domifa

# liste ses abonnements:
/github subscriptions list

Source du plugin: https://github.com/softdevteam/mattermost-github-integration

Nettoyage des environnements Kube de dev

Les ressources de dev sont détruites à la fermeture des branches ou sont nettoyées automatiquement par kube-janitor :

RessourceDurée de vie
dev/*7j
dev/renovate*24h
dev/jobs/complete24h
dev/jobs/failed7j
prod/jobs/complete24h
prod/jobs/failed7j