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