Documenting Woodpeckers.
This commit is contained in:
parent
2effab3a36
commit
6d14a8dfd7
99
README.md
99
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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue