Documenting Woodpeckers.

This commit is contained in:
Julien Palard 2023-03-28 12:33:52 +02:00
parent 2effab3a36
commit 6d14a8dfd7
Signed by: mdk
GPG Key ID: 0EFC1AC1006886F8
3 changed files with 73 additions and 84 deletions

View File

@ -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 cest 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,
cest 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`.
Cest 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`.
Cest 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
Cest 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, noubliez pas dy 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 puisquil 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 linventaire 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 lautre 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.
Jutilise du `ssh agent forwarding`, si vous nen utilisez-pas vous
aurez peut-être à rsync sur votre machine dabord.
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 ♥
Cest un « Gandi VPS V-R1 » 1 CPU, 1 GB RAM, 25 GB disk.
Cest [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 na pas besoin dIPv4, donc une vieille machine recyclée
planquée chez vous sans NAT mais avec de lIPv6 ça suffit. Pas de
Raspberry PI par contre, nous navons pour le moment pas de tâches à
faire tourner sur arm64.
### boole.mdk.woodpecker-agents.afpy.org
♥ Machine sponsorisée par Julien Palard ♥
Cest un vieux laptop à moi, 4 cœurs, 8GB de RAM, planqué sous mon bureau.
Il sert uniquement dagent au Woodpecker, et cest pour le moment le seul.
## discourse1.afpy.org
♥ Machine sponsorisée par Gandi ♥
C'est un VPS `V-R4 2 CPUs · 4 GB RAM`.
Cest 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 quon 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 lancienne 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 lAPI 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.
Lavantage du DNS-01 cest quon 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 lutilise
assez peu maintenant, on lutilise 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 davoir 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 :
Jy ai appliqué un poil de ssh-hardening :
AuthenticationMethods publickey
LogLevel VERBOSE
Ensuite j'ai [rsync les enregistrements depuis le bbb
Ensuite jai [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 jai sauvegardé/restauré la DB de greenlight :
# Sur l'ancienne machine :
# Sur lancienne 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 lancienne 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 soccuper 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 quexim et le firewall (attention cest 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
Linstallation de BBB nétant pas gérée par Ansible, pour le moment la
conf TURN/STUN est faite à la main, cest 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 dhote 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 quil faut faire ressemble à :
deb2-afpy-org._domainkey.deb2.afpy.org. IN TXT "v=DKIM1; k=rsa; p=MIG...QAB"

View File

@ -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

View File

@ -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
#
#
#
#
#