From 6d14a8dfd7d4d964dd93250ef49f4cd2fcbe1bcd Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Tue, 28 Mar 2023 12:33:52 +0200 Subject: [PATCH] Documenting Woodpeckers. --- README.md | 99 +++++++++++++++++++++++++++++++++----------------- inventory | 2 +- woodpecker.yml | 56 ++++------------------------ 3 files changed, 73 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index c3d8df2..0a51eb5 100644 --- a/README.md +++ b/README.md @@ -20,21 +20,21 @@ Récupérez le secret dans [afpy/pass](https://github.com/AFPy/pass/): Puis pour jouer les *playbooks* : -- Pour tout relancer : `ansible-parallel *.yml` -- Pour configurer les PyCons : `ansible-playbook pycons.yml` +- Pour tout relancer : `ansible-parallel *.yml` +- Pour configurer les PyCons : `ansible-playbook pycons.yml` ## Faire, ne pas faire -Faire : Configurer les machines : +Faire : Configurer les machines : - `apt install`, - fichiers de configuration, - créer les utilisateurs, -- éventuellement un premier `git clone` pour que ça marche si c'est un site statique. +- éventuellement un premier `git clone` pour que ça marche si c’est un site statique. Ne pas faire : -- Deployer. En dehors de l'éventuel premier git clone, - c'est le rôle de la CI (Github Actions, ...), pas de nos playbooks. +- Deployer. En dehors de l’éventuel premier git clone, + c’est le rôle de la CI (Github Actions, ...), pas de nos playbooks. # Servers @@ -51,7 +51,7 @@ La distinction services/serveurs : ♥ Machine sponsorisée par Gandi ♥ -C'est un VPS `V-R4 2 CPUs · 4 GB RAM`. +C’est un VPS `V-R4 2 CPUs · 4 GB RAM`. Elle héberge les services suivants : @@ -68,14 +68,14 @@ Elle héberge les services suivants : ♥ Machine sponsorisée par Gandi ♥ -C'est un VPS `V-R8 4 CPUs · 8 GB RAM`. +C’est un VPS `V-R8 4 CPUs · 8 GB RAM`. ## backup1.afpy.org ♥ Machine sponsorisée par Gandi ♥ -C'est un « Gandi Cloud V5 » à Bissen au Luxembourg avec 512MB de RAM +C’est un « Gandi Cloud V5 » à Bissen au Luxembourg avec 512MB de RAM et 512GB de disque, il sauvegarde (via rsnapshot) les autres machines (voir `backup.yml`). @@ -131,13 +131,13 @@ machine « from scratch ». #### Commander une nouvelle machine Typiquement chez Gandi une `V-R1: 1 CPU · 1 GB RAM`, avec une Debian -11, n'oubliez pas d'y mettre une clé SSH. +11, n’oubliez pas d’y mettre une clé SSH. #### Nommer la machine Typiquement `gitea2.afpy.org`, configurer les DNS, en profiter pour -réduire le TTL de git.afpy.org puisqu'il faudra le changer à la fin. +réduire le TTL de git.afpy.org puisqu’il faudra le changer à la fin. #### Autoriser à se ssh en root @@ -145,7 +145,7 @@ réduire le TTL de git.afpy.org puisqu'il faudra le changer à la fin. ssh debian@giteatest.afpy.org sudo cp /home/debian/.ssh/authorized_keys /root/.ssh/ -#### Ajouter la machine dans l'inventaire Ansible +#### Ajouter la machine dans l’inventaire Ansible Ça devra donc ressembler à : @@ -154,7 +154,7 @@ réduire le TTL de git.afpy.org puisqu'il faudra le changer à la fin. gitea2.afpy.org ``` -On peut probablement supprimer l'autre qui ne marche plus... +On peut probablement supprimer l’autre qui ne marche plus... #### Lancer Ansible @@ -164,8 +164,8 @@ On peut probablement supprimer l'autre qui ne marche plus... #### rsync la sauvegarde -J'utilise du `ssh agent forwarding`, si vous n'en utilisez-pas vous -aurez peut-être à rsync sur votre machine d'abord. +J’utilise du `ssh agent forwarding`, si vous n’en utilisez-pas vous +aurez peut-être à rsync sur votre machine d’abord. Adapté de : https://docs.gitea.io/en-us/backup-and-restore/#restore-command-restore @@ -195,11 +195,42 @@ Un rapide test peut être effectué via : Puis il faut mettre à jour le CNAME de git.afpy.org pour le faire pointer vers la nouvelle machine. +## woodpecker1.afpy.org + +♥ Machine sponsorisée par Gandi ♥ + +C’est un « Gandi VPS V-R1 » 1 CPU, 1 GB RAM, 25 GB disk. + +C’est [Woodpecker CI](https://woodpecker.afpy.org) lié à notre [forge](https://git.afpy.org). + +Il ne fait tourner aucune tâche, ce sont les agents qui font tourner +les tâches. Si vous avez une machine de libre, vous êtes invités à +proposer un agent. Il suffit de : + +- Installer une Debian. +- Y ajouter nos [authorized_keys](https://git.afpy.org/AFPy/infra/src/branch/main/group_vars/all/authorized_keys). +- Nous donner son IP. + +Un agent n’a pas besoin d’IPv4, donc une vieille machine recyclée +planquée chez vous sans NAT mais avec de l’IPv6 ça suffit. Pas de +Raspberry PI par contre, nous n’avons pour le moment pas de tâches à +faire tourner sur arm64. + + +### boole.mdk.woodpecker-agents.afpy.org + +♥ Machine sponsorisée par Julien Palard ♥ + +C’est un vieux laptop à moi, 4 cœurs, 8GB de RAM, planqué sous mon bureau. + +Il sert uniquement d’agent au Woodpecker, et c’est pour le moment le seul. + + ## discourse1.afpy.org ♥ Machine sponsorisée par Gandi ♥ -C'est un VPS `V-R4 2 CPUs · 4 GB RAM`. +C’est un VPS `V-R4 2 CPUs · 4 GB RAM`. Elle héberge https://discuss.afpy.org une instance Discourse. @@ -214,13 +245,13 @@ Voici la procédure - Ajouter les enregistrements A et AAAA de la machine. - Baisser le TTL du CNAME `discuss.afpy.org`. -- Mettre à jour le SPF pendant qu'on y est. +- Mettre à jour le SPF pendant qu’on y est. - Configurer le reverse DNS de la nouvelle machine. - Côté Ansible, ajouter la machine au groupe `[discourse]` dans le fichier `inventory`. - Copier sa clé ssh sur la machine dans `/root/.ssh/authorized_keys`. - Lancer `ansible-playbook discuss.yml`. - Lancer à la main dans `/var/discourse/`: `./launcher rebuild app` (ça prend ~10mn). -- Sur l'ancienne machine, faire une sauvegarde, soit via https://discuss.afpy.org/admin/backups, soit : +- Sur l’ancienne machine, faire une sauvegarde, soit via https://discuss.afpy.org/admin/backups, soit : ``` ./launcher enter app discourse backup @@ -248,15 +279,15 @@ On utilies ces rôles Ansible : ## roles/nginx -Ce rôle configure un nginx avec Letsencrypt en DNS-01 via l'API Gandi (nos domaines étant chez Gandi). +Ce rôle configure un nginx avec Letsencrypt en DNS-01 via l’API Gandi (nos domaines étant chez Gandi). -L'avantage du DNS-01 c'est qu'on peut configurer un nouveau serveur **avant** que le DNS ne pointe sur lui. +L’avantage du DNS-01 c’est qu’on peut configurer un nouveau serveur **avant** que le DNS ne pointe sur lui. ## julienpalard.nginx -Ce rôle configure un nginx avec Letsencrypt en HTTP-01, on l'utilise -assez peu maintenant, on l'utilise là où on ne peut pas faire de +Ce rôle configure un nginx avec Letsencrypt en HTTP-01, on l’utilise +assez peu maintenant, on l’utilise là où on ne peut pas faire de DNS-01 (pour `fr.pycon.org` par exemple). Voir la [doc](https://github.com/JulienPalard/ansible-role-nginx). @@ -264,7 +295,7 @@ Voir la [doc](https://github.com/JulienPalard/ansible-role-nginx). ## common -*common* est un rôle "de base" permettant d'avoir une conf "normale" +*common* est un rôle "de base" permettant d’avoir une conf "normale" sur toutes nos machines (emacs et vim installés, nos authorized-keys, pas de mlocate, hostname propre, firewall, ce genre de broutilles). @@ -273,17 +304,17 @@ pas de mlocate, hostname propre, firewall, ce genre de broutilles). Hébergé sur bbb2.afpy.org chez Gandi. -J'y ai appliqué un poil de ssh-hardening : +J’y ai appliqué un poil de ssh-hardening : AuthenticationMethods publickey LogLevel VERBOSE -Ensuite j'ai [rsync les enregistrements depuis le bbb +Ensuite j’ai [rsync les enregistrements depuis le bbb précédent](https://docs.bigbluebutton.org/2.2/customize.html#transfer-published-recordings-from-another-server). -Puis j'ai sauvegardé/restauré la DB de greenlight : +Puis j’ai sauvegardé/restauré la DB de greenlight : - # Sur l'ancienne machine : + # Sur l’ancienne machine : docker exec greenlight_db_1 /usr/bin/pg_dumpall -U postgres -f /var/lib/postgresql/data/dump.sql # Sur la nouvelle machine : @@ -293,7 +324,7 @@ Puis j'ai sauvegardé/restauré la DB de greenlight : docker-compose down rm -fr db - # Configurer le même mot de passe dans .env et docker-compose.yml que l'ancienne machine + # Configurer le même mot de passe dans .env et docker-compose.yml que l’ancienne machine # En profiter pour vérifier le SAFE_HOSTS dans le .env. docker-compose up -d # Attendre un peu avec un top sous les yeux que ça se termine vraiment @@ -302,7 +333,7 @@ Puis j'ai sauvegardé/restauré la DB de greenlight : docker exec greenlight_db_1 /usr/local/bin/psql -U postgres -f /var/lib/postgresql/data/dump.sql rm db/production/dump.sql docker-compose down - docker-compose up -d # Il va s'occuper de la migration + docker-compose up -d # Il va s’occuper de la migration docker-compose logs -f # pour voir si tout va bien `rsync` des certificats TLS aussi : @@ -342,14 +373,14 @@ Il faut configurer le `.env` tel que: SMTP_DOMAIN=greenlight.afpy.org SMTP_SENDER=bbb@afpy.org -Puis vérifier qu'exim et le firewall (attention c'est peut-être `ufw`) +Puis vérifier qu’exim et le firewall (attention c’est peut-être `ufw`) les acceptent. ### Configuration TURN/STUN -L'installation de BBB n'étant pas gérée par Ansible, pour le moment la -conf TURN/STUN est faite à la main, c'est la seule chose à faire, elle +L’installation de BBB n’étant pas gérée par Ansible, pour le moment la +conf TURN/STUN est faite à la main, c’est la seule chose à faire, elle ressemble à : ```xml @@ -396,11 +427,11 @@ dans `/usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml`. Le playbook exim configure une clé DKIM et signe les mails avec. Mais un humain doit la propager sur les DNS. -Le nom d'hote est le nom du serveur, donc pour `deb2`, +Le nom d’hote est le nom du serveur, donc pour `deb2`, `d=deb2.afpy.org`, et le selecteur vaut le nom de domaine avec des `-`, soit `s=deb2-afpy-org`. -TL;DR la configuration qu'il faut faire ressemble à : +TL;DR la configuration qu’il faut faire ressemble à : deb2-afpy-org._domainkey.deb2.afpy.org. IN TXT "v=DKIM1; k=rsa; p=MIG...QAB" diff --git a/inventory b/inventory index 3e49395..9925fb7 100644 --- a/inventory +++ b/inventory @@ -2,7 +2,7 @@ gitea1.afpy.org [woodpeckers] -boole.mdk.woodpecker-agents.afpy.org +woodpecker1.afpy.org [woodpecker_agents] boole.mdk.woodpecker-agents.afpy.org diff --git a/woodpecker.yml b/woodpecker.yml index 095dcd3..9822224 100644 --- a/woodpecker.yml +++ b/woodpecker.yml @@ -19,8 +19,11 @@ name: woodpecker-agent state: restarted daemon_reload: yes - + tasks: + - name: Basic setup + include_role: name=common + - name: Setup nginx include_role: name=nginx vars: @@ -129,6 +132,9 @@ - WOODPECKER_VERSION: "0.15.7" - WOODPECKER_AGENT_SECRET: "{{ vault_woodpecker_agent_secret }}" tasks: + - name: Basic setup + include_role: name=common + - name: Install requirements package: name: docker.io @@ -189,51 +195,3 @@ enabled: yes state: started daemon_reload: yes - -# -# - hosts: woodpecker_agents -# vars: -# - WOODPECKER_AGENT_SECRET: "{{ vault_woodpecker_agent_secret }}" -# tasks: -# - name: Install requirements -# package: -# name: [docker.io, docker-compose] -# state: present -# -# - name: Ensure docker is listening -# service: -# name: docker.socket -# state: started -# -# - name: Create woodpecker directory -# file: -# path: '/root/woodpecker' -# state: directory -# mode: 0755 -# -# - name: Setup a docker-compose file -# copy: -# dest: /root/woodpecker/docker-compose.yml -# mode: 0644 -# content: | -# version: '3' -# -# services: -# woodpecker-agent: -# image: woodpeckerci/woodpecker-agent:latest -# command: agent -# restart: always -# volumes: -# - /var/run/docker.sock:/var/run/docker.sock -# environment: -# - WOODPECKER_SERVER=woodpecker.afpy.org:9000 -# - WOODPECKER_AGENT_SECRET={{WOODPECKER_AGENT_SECRET}} -# -# - name: Run Woodpecker agent -# docker_compose: -# project_src: woodpecker -# -# -# -# -#