Compare commits

...

65 Commits

Author SHA1 Message Date
southerntofu 559d896542 Grosses mise à jour sur la nouvelle branche de travail some-refactoring 2022-03-20 19:13:55 +00:00
southerntofu 637e231d96 Nouvelles personnes et nouvelle clé pour merry 2022-03-17 20:04:03 +00:00
merry_envs a834451b8d Mise à jour de 'config.yml'
Mise à jour de la clef de Merry
2022-01-31 14:38:09 +00:00
southerntofu 713a001f71 C'est bon c'est corrigé simpleweb_peertube 2021-07-29 23:18:06 +00:00
southerntofu dd86ede611 Euh c'est une expérience cassée de simpleweb_peertube 2021-07-29 21:47:21 +00:00
southerntofu 646836b3b4 Repasser certains chans sous matterbridge, configurer tube.fr.tild3.org 2021-07-29 18:31:26 +00:00
southerntofu b1c617726d Shorter config, better defaults for IRC 2021-07-24 23:30:28 +00:00
southerntofu 3a2d030fc1 Configurer matterbridge et cheogram-muc-bridge 2021-07-24 13:27:26 +00:00
southerntofu 857397941e Merge branch 'master' of https://tildegit.org/tilde-fr/infra 2021-06-30 20:49:45 +00:00
southerntofu b1802a48f9 On a mergé avec joinjabber.org ! \o/ 2021-06-30 20:46:59 +00:00
southerntofu ba2afd686a Add user bsdx, promote mspe sudo 2021-03-18 16:39:02 +00:00
southerntofu 206d7aed71 Bienvenue val 2020-07-08 13:58:25 +00:00
southerntofu b317ec7bb9 Annonce IRC.. 2020-07-01 14:46:49 +00:00
southerntofu 9318ffedfc Bienvenue à bogusoverflow 2020-07-01 14:34:26 +00:00
southerntofu bc427ed013 Merge branch 'master' of https://tildegit.org/tilde-fr/infra 2020-06-18 11:14:43 +00:00
southerntofu 03a26b74da Merge pull request 'Ajout de l'utilisateur omz.' (#31) from omz/infra:ajout-utilisateur-omz into master 2020-06-18 07:12:34 -04:00
omz 10bcfd2e8e Ajout de l'utilisateur omz. 2020-06-14 12:22:01 -04:00
southerntofu 03ff3d2a7d Bienvenue vaurora 2020-05-15 11:09:26 +00:00
southerntofu 22adc965d2 Chaque utilisateurice sait trouver son onion (closes #5) 2020-04-25 17:20:28 +00:00
southerntofu b4c3f624bc Onion idempotent 2020-04-24 22:07:21 +00:00
southerntofu 15ca2904bb Ha oui les permissions 2020-04-24 22:07:09 +00:00
southerntofu a478e20ded Donner les permissions sur les multisites 2020-04-24 21:41:47 +00:00
southerntofu f54a8730d5 Point webserver to different folders for each user (multisite) 2020-04-24 21:39:42 +00:00
southerntofu 659f7d71d6 Fix handler name 2020-04-24 21:39:26 +00:00
southerntofu 9f0746b74b Créer les dossiers utilisateurices pour le multisite 2020-04-24 21:29:00 +00:00
southerntofu 98bea6b35e Hooop oublié une traduction du coup 2020-04-23 22:59:08 +00:00
southerntofu 90a2918843 Bienvenue h30x! 2020-04-23 22:34:13 +00:00
southerntofu 749f80a664 Les onions perso sont idempotents 2020-04-17 19:35:08 +02:00
southerntofu 8b77ef3651 Mise à jour de la doc deploy.sh 2020-04-17 18:57:55 +02:00
southerntofu b7ca566fc9 Traductions pour les gestionnaires de paquets 2020-04-17 18:55:28 +02:00
southerntofu 37f6b5ea0a Traduction du rôle webserver 2020-04-17 18:15:20 +02:00
southerntofu 9c2b34bf61 Changer l'ordre d'exécution des tâches 2020-04-17 17:27:02 +02:00
southerntofu 7f18a254fb Pas de variables dans les traductions 2020-04-17 16:41:39 +02:00
southerntofu a7f2063641 Début de traductions pour les playbooks! 2020-04-17 15:39:07 +02:00
southerntofu 7e00bbd393 Le message de bienvenue sur IRC est configurable 2020-04-17 15:34:17 +02:00
southerntofu 29a73f2f87 Rendre l'ordre des tâches plus logiques 2020-04-17 15:05:48 +02:00
southerntofu d1a26965f1 deploy.sh prend un argument verbose ou debug (-v ou -vvv) 2020-04-17 11:47:11 +00:00
southerntofu eecfba39bb La recette va dans le dossier roles/, pour ranger la racine 2020-04-16 11:39:48 +00:00
southerntofu 03ce84883a deploy.sh: spécifier le fichier hosts en mode remote 2020-04-16 13:36:53 +02:00
southerntofu 4c609dc1fd deploy.sh: le hosts file n'est oligatoire qu'en mode remote 2020-04-16 11:13:56 +00:00
southerntofu 8f669326f5 Les variables sont chargées directement depuis config.yml, sans host_vars/ 2020-04-16 10:45:11 +00:00
southerntofu 6a28df28dd deploy.sh: ne s'exécute (localement) que sur Debian 10 Buster 2020-04-16 11:59:02 +02:00
southerntofu e4bbb3b74d deploy.sh: on vérifie l'existence des dépendances 2020-04-16 11:53:39 +02:00
southerntofu 18a5acced8 deploy.sh a besoin d'être root pour une application locale de la recette 2020-04-16 11:34:54 +02:00
southerntofu 9ae2951159 deploy.sh: empêcher d'utiliser la config de ~fr par erreur 2020-04-16 11:31:18 +02:00
southerntofu 8b9ec6427e Annoncer les nouveaux comptes sur IRC \o/ 2020-04-15 21:36:53 +00:00
southerntofu 39ae0aa8f9 Réparer la génération d'onion 2020-04-15 21:31:28 +00:00
southerntofu c848364cc8 ./deploy.sh debug :) 2020-04-15 20:19:35 +00:00
southerntofu d9fd5a1fc9 Les paquets pour les SSG sont installés par un gestionnaire de paquets "custom" 2020-04-15 19:25:36 +00:00
southerntofu 8655facec4 Les paquets sont installés par des rôles dédiés (gestionnaires de paquets) 2020-04-15 19:19:35 +00:00
southerntofu 0604af785f L'installation des SSG se fait par un rôle à part du webserver 2020-04-15 18:19:34 +00:00
southerntofu 1b8d823b65 Le démon tor redémarre seulement s'il y a un nouveau compte (ferme #12) 2020-04-15 17:28:59 +00:00
southerntofu cef276c076 La commande deploy.sh s'applique localement par défaut 2020-04-15 17:10:38 +00:00
southerntofu c20e7a9986 Un peu de ménage pour déblayer le dossier 2020-04-15 17:03:22 +00:00
southerntofu 2b0f2947da Premier jet pour un système de peering (#23) 2020-04-15 16:48:56 +00:00
southerntofu b26a12973e rajouté de la documentation 2020-04-15 15:47:32 +00:00
southerntofu def091d76f Les rôles actifs sont définis dans la config 2020-04-15 14:52:57 +00:00
southerntofu e64f43020d Ajout d'un fichier de config par défaut 2020-04-15 14:41:39 +00:00
southerntofu 990021cf2c La configuration du serveur est à la racine du dépot 2020-04-15 14:06:19 +00:00
southerntofu 5918b84242 Ne pas créer de fichier recette.retry (ça sert à rien) 2020-04-15 14:03:36 +00:00
southerntofu 90deae7d11 les paquets qui ne sont pas des dépendances sont définis dans la config (ferme #4) 2020-04-15 13:59:09 +00:00
southerntofu 49fa247792 deploy.sh check fait la --syntax-check et peut être utilisé avec l'argument local 2020-04-15 13:37:47 +00:00
southerntofu c7c790e608 Simplifier la recette du playbook 2020-04-15 13:37:23 +00:00
southerntofu 9a0e25c961 Le rôle common est installable fraichement (manquait des paquets et un handler) 2020-04-15 12:57:32 +00:00
von_ 5e18fb41f8 Bienvenue von 2020-04-14 11:08:53 -04:00
34 changed files with 741 additions and 455 deletions

4
.gitignore vendored
View File

@ -20,4 +20,6 @@ tags
[._]*.un~
# File created by runing the playbook locally
site.retry
*.retry
hosts

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "roles"]
path = roles
url = https://codeberg.org/southerntofu/ansible-selfhosted

131
README.md
View File

@ -1,35 +1,112 @@
# infra
**ATTENTION:** Tout ce qui suit ci-dessous n'est plus d'actualité. La documentation de nos recettes est disponible [ici](https://codeberg.org/southerntofu/ansible-selfhosted).
Configuration système de fr.tild3.org
Bienvenue sur le dépôt de la configuration système de ~fr !
# Ajouter unE utilisateurice
On écrit des recettes [Ansible](https://fr.wikipedia.org/wiki/Ansible_(logiciel)) pour décrire les étapes à suivre pour configurer notre serveur basé sur Debian 10 Buster (stable). Pour l'instant, on gère:
Pour créer un compte, il suffit de le déclarer dans host_vars/fr.yml:
- des comptes shell avec authentification par clé SSH
- des sites web (avec nginx) et des pages perso pour nos utilisateurices
- des [.onion](https://fr.wikipedia.org/wiki/.onion) pour les pages perso
Nous mettons à disposition un [guide utilisateurice](docs/utilisateurice.md) et un [guide administrateurice](docs/administrateurice.md). Nous essayons de rendre notre système compréhensible et reproductible. Si quelque chose n'est pas clair, ou que ça ne fonctionne pas chez toi, c'est un bug alors n'hésite pas à le signaler.
Nos recettes visent à configurer tout un système d'hébergement mutualisé à partir d'un fichier de configuration central: [config.yml](https://tildegit.org/tilde-fr/infra/src/branch/master/config.yml). En suivant des principes [déclaratifs](https://fr.wikipedia.org/wiki/Programmation_d%C3%A9clarative), nous espérons obtenir des recettes robustes et interchangeables.
**ATTENTION:** Tout ce qui suit ci-dessous n'est plus d'actualité. La documentation de nos recettes est disponible [ici](https://codeberg.org/southerntofu/ansible-selfhosted).
# Configuration déclarative
La mise en place d'un système de configuration déclarative nous force à nous concentrer sur les fonctionnalités et services que nous voulons mettre en place (qui sont communes à de nombreux hébergeurs), sans nous soucier précisément de comment faire.
Plus précisément, cette approche nous donne de la marge de manoeuvre pour expérimenter plusieurs approches pour implémenter une fonctionnalité. Par exemple, les pages personnelles de nos utilisateurices peuvent être servies par différents serveurs web.. pourquoi devrait-on toujours réécrire des recettes spécifiquement conçues pour notre système et notre serveur web préféré ?
Nous prenons l'approche inverse : nous décrivons les fonctionnalités que nous voulons obtenir dans la configuration, et laissons le champ libre à différents roles d'implémenter l'interface de configuration correspondante pour les mettre en oeuvre concrètement. Cela nous permettrait par exemple de remplacer un serveur web par un autre de façon entièrement transparente pour les sysadmin.
De plus, cette approche facilite les nouvelles implémentations. En effet, chaque logiciel a ses spécificités et écrire des recettes génériques pour un service peut être complexe. Une fois le champ des besoins étudié et délimité, la standardisation d'une interface de configuration permet aux futures implémentations d'avoir un aperçu clair des concepts et fonctionnalités en jeu.
Bref, notre système est actuellement basé sur des recettes Ansible. Mais le but est de concevoir un système qui permettent à d'autres implémentations d'être compatibles avec nos configurations, qu'elles soient écrites en bash, en Nix, en Guix... Le projet Yunohost considère actuellement de migrer progressivement [vers un modèle déclaratif](https://github.com/YunoHost/issues/issues/1614).
# Services
L'architecture de nos recettes reposent sur la distinction entre **services** et **roles**. Un service est une référence qui définit une interface de configuration. Un role est une implémentation spécifique d'un service.
Par exemple, `webserver` est un service, qui est implémenté par un rôle apache, nginx, ou lighttpd. Pour passer de apache à nginx, on peut simplement faire:
```
- name: username
(- sudo: true)
- key: "clé publique SSH (format ~/.ssh/authorized_keys)"
$ rm roles/webserver
$ ln -s roles/nginx roles/webserver
```
# TODO
## Gestionnaires de paquets
- Services
- [x] Serveur web avec pages perso en user.fr.tild3.org
- [ ] Support du HTTP2 sur le serveur web
- [ ] Un onion pour le serveur
- [ ] Plein d'onions pour les pages perso
- [ ] Authentification centralisée (Single Sign-On)
- [x] Plateforme de blogging depuis le shell (ttbp)
- Expérience utilisateurice (UX)
- [ ] Script d'accueil pour choisir son shell, définir un MDP
- [ ] MOTD accueillant avec quelques exemples de commandes sympathiques
- [ ] byobu préconfiguré ?
- [ ] definir la locale
- Meta
- [ ] Rendre le playbook bootstrappable (ajouter des étapes intermédiaires pour éviter que nginx et certbot se mordent la queue sur une nouvelle install)
- [ ] Traduire tout le playbook en français
- [x] Hostname paramétrable (pour pouvoir forker)
- [ ] Certaines tâches devraient tourner seulement quand unE user est ajoutéE
- [ ] Un playbook pour les updates? apt + cargo
- [ ] Documenter le playbook
Les gestionnaires de paquets sont des rôles chargés de l'installation de paquets additionnels sur le système. Parmi ceux-ci, on retrouve [npm](https://www.npmjs.com/), [cargo](https://doc.rust-lang.org/cargo/) ou encore [apt](https://en.wikipedia.org/wiki/APT_(Debian)).
Interface :
```
packages:
x: [ packageA, packageB ]
y: [ packageC, packageD ]
```
Gestionnaires de paquets implémentés :
- [x] apt (appelé `debian`)
- [x] cargo (appelé `rust`)
- [ ] npm
De plus, un gestionnaire de paquets `custom` permet de définir des recettes personnalisées pour des logiciels qui ne sont pas packagés autrement.
Fonctionnalités implémentées :
- [x] liste de paquets
- [ ] sources tierces
- [ ] paramètres de compilation
Actuellement, tous les gestionnaires de paquets dans roles/ ont un nom commençant par `.`. Dans le futur, ce préfixe sera probablement renommé `pkg-`, de telle façon qu'un gestionnaire de paquets `x` soit situé dans `roles/pkg-x`.
## Webserver
Le serveur web est un service qui permet de servir des pages et applications web.
Interface :
```
webserver:
vhosts:
- hostname: example.org
aliases: [ www.example.org ]
root: /var/www/example.org
- hostname: thepiratebay.example.org
proxy: [ https://thepiratebay.org ]
```
En plus de cette interface de configuration, le service webserver peut être appelé par d'autres services avec des paramètres additionnels. Par exemple, les pages [well-known](https://en.wikipedia.org/wiki/Well-known_URIs) sont configurées directement par d'autres services, comme ceci:
```
webserver:
vhosts:
- hostname: example.org
well-known:
regex: ^/~(.+?)(/.*)?$
alias: /home/$1/public/html/tilde/$2
autoindex: on|off
```
C'est ainsi que sont activées les pages perso sur le domaine principal du serveur. (TODO: ce n'est pas encore le cas!)
# Mutualisation
Le but de ce projet est de mutualiser des recettes d'administration système afin d'encourager les bonnes pratiques et de faciliter la mise en oeuvre de services autohébergés. En cela, notre projet est similaire à [Yunohost](https://yunohost.org/), [AlternC](https://alternc.com/), [ISPConfig](https://www.ispconfig.org/), ou encore [Freedombone](https://freedombone.net/).
Pourtant, nous faisons des choix techniques radicalement différents afin d'explorer ce que la configuration déclarative pourrait apporter aux solutions d'autohébergement.
# Écrire des recettes
Pour l'instant, toutes les recettes sont contenues dans ce dépôt. Pourtant, il est possible d'utiliser des recettes tierces via des sous-modules git. Cela pose des questions de sécurité, qui ont très bien été étudiées par le projet [Guix](https://guix.gnu.org/blog/2020/securing-updates/).
Note: pour le moment, ces recettes ne sont pas spécifiquement articulées pour pouvoir facilement remplacer des bouts. Cela va demander du taf en plus mais ça avance.
# Sécurité
**ATTENTION:** les recettes présentées ici sont dévelopées avec amateurisme et ne présentent aucune garantie de fiabilité ou de sécurité. Ne nous fais pas confiance, mais viens participer au projet pour l'améliorer !

9
config.default.yml Normal file
View File

@ -0,0 +1,9 @@
hostname: mondomaine.net
roles: [ webserver ]
packages:
debian: [ htop, tmux, vim, emacs, mutt, mosh ]
rust: [ lsd ]
users:
- name: utilisateurice
sudo: true
key: "ssh-ed25519 BLABLABLA"

130
config.yml Normal file
View File

@ -0,0 +1,130 @@
hostname: "fr.tild3.org"
contact: "root@fr.tild3.org"
services:
- ".common"
- "webserver"
- "peering"
- "unix_users"
- "chatbridge"
#- "mucbridge"
- "simpleweb_peertube"
webserver:
vhosts:
- host: "fr.tild3.org"
template: "zola"
git: "https://tildegit.org/tilde-fr/site"
irc_announce:
chan: "#fr"
# TODO: reimplement peering with new recipes
simpleweb_peertube:
vhosts:
- host: "tube.fr.tild3.org"
accounts: [ "submedia@kolektiva.media", "contrainfo@kolektiva.media", "enough14@kolektiva.media" ]
channels: [ "mooc.chatons.1@framatube.org", "mobilizon@framatube.org", "bf54d359-cfad-4935-9d45-9d6be93f63e8@framatube.org" ]
- host: "tubetest.fr.tild3.org"
mucbridge:
chans:
# List of JIDs to bridge together, carefully following cheogram-muc-bridge settings
- [ { jid: "#joinjabber-fr%irc.tilde.chat@irc.localhost", tag: "~", nickChars: "Some \"a-zA-Z0-9`|^_{}[]\\\\-\"", nickLength: "Some 32" }, { jid: "fr@joinjabber.org", tag: "jabberFR", nickChars: "None Text", nickLength: "None Natural" } ]
#- [ { jid: "#whereiseveryone%irc.libera.chat@irc.localhost", tag: "libera", nickChars: "Some \"a-zA-Z0-9`|^_{}[]\\\\-\"", nickLength: "Some 32" }, { jid: "guix@rooms.dismail.de", tag: "dismail", nickChars: "None Text", nickLength: "None Natural" } ]
# Mappings of server to channel name
#- { tildechat: "#foo", jj: "foo" }
# mappings defined in settings.profiles.jjworkinggroups
#disroot: [ "anarchism", "federation" ]
#jfr: [ "anarchisme", "fédération" ]
jfr: [ "fédération" ]
disroot: [ "federation" ]
jjworkinggroups: [ "privacy", "bridging", "abuse", "translations", "sysadmin", "website" ]
settings:
host: "bridge.fr.tild3.org"
nick: "fr-bridge2"
gateway_irc: "irc.localhost" # Optional (defaults to irc.localhost + biboumi setup
accounts:
#tildechat: { host: "irc.tilde.chat", type: "irc" } # Soon we can remove tag on XMPP side, but not yet
tildechat: { host: "irc.tilde.chat", type: "irc", tag: "~chat" }
jj: { host: "joinjabber.org", tag: "jj" }
disroot: { host: "chat.disroot.org", tag: "disroot" }
jfr: { host: "chat.jabberfr.org", tag: "jfr" }
profiles:
# Profiles are mapping of profile name to a mapping of server name to chatroom name format
jjworkinggroups: { tildechat: "#joinjabber-$room", jj: "$room" }
jfr: { tildechat: "#$room", jfr: "$room" }
disroot: { tildechat: "#$room", disroot: "$room" }
chatbridge:
tilde:
- "fr"
jabberfr:
- anarchisme
#- tilde-fr
#- fédération
# disroot: #
# - anarchism # #anarchism is now relayed by matterbridge operated by anelki on muse.edist.ro
# #- federation
settings:
accounts:
- name: "jabberfr"
type: "xmpp"
login: "matrixbot@jabber.fr"
server: "chat.jabberfr.org"
- name: "disroot"
type: "xmpp"
login: "matrixbot@jabber.fr"
server: "chat.disroot.org"
- name: "joinjabber"
type: "xmpp"
login: "matrixbot@jabber.fr"
server: "joinjabber.org"
- name: "tildechat"
type: "irc"
login: "bridge"
server: "irc.tilde.chat"
profiles:
jabberfr:
tildechat: "#$room"
jabberfr: "$room"
joinjabber: "test-$room"
tilde:
tildechat: "#$room"
jabberfr: "tilde-$room"
# disroot:
# tildechat: "#$room"
# disroot: "$room"
# joinjabber: "test-$room"
peers:
- name: tilde.netlib.re
client_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEHsVZvvVX3VPj2sWxrb8LJrn3650aoLAZgbY7+CB+NU"
server_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHUAIuwEhFXTDfOEG+hQ2d/xeUwsgPJQF7oeNYr1ZXnG"
packages:
debian: [ subversion, mercurial, htop, tmux, vim, emacs, mutt, weechat, elinks, rsync, dnsutils, make, g++, libssl-dev, mosh, gopher, sl, jq ]
rust: [ lsd ]
users:
- name: tofu
sudo: true
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG4bKe9LSA3/AY4gCB20eyJVPW+zOg07/b3A4QC0Z6XC"
- name: kumquat
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZ5FBnDlBIGlJ4TI0babTTmS5ECPM3yuDP1AhnNQUDZ"
- name: mspe
sudo: true
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICZAs76kQJ0/Et2NGzhxurK2wE0VhYsG9wl85iCmR9xH"
- name: merry
key: |
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxPbGSCW0KOOreD0FZGu3PFKMNIEi5VrJHzub8+poVs
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMGEuG1axFQBefQ+nCCj3VihcJWR+izHVnhYM+gXNxAf
- name: von
key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBl15MKr9LqpJrohoQ/JBg95o2dFTOx6zEmdVO3peAt4FyrH8IfGj8H8DfOu4FQ9cay17X+/tV6znnW0D3XJro8fEavXWfNmpJ20EYwS2FeJ67lgL/7t4vUA4QGo/QR2vzxrLzP41bE5Bb3a4Rh1wJwvB06e0QCETyZNurxlLJ7E/IS0Axjcc+GTmFuR+I0Tj1dzRBn/DS8EVgRxCpx5eYUrh+uzLIyhKJEq6tGaQzIbSgNYFSorXcdf1IAkWRsV29VCTH8narzFfc8fuwetWhBc60WyRAyzGm4K7m+YNBj1JmWXvCeYGsRdaQQrOqY44fxo0WdVWbjLbQKTZMgPB3Ag34egI/RM4hQqQeOSPjzZM9t2yfSp1Uv5W5gBI6hg71CpVicz0ZkXaBNONxX6RRyav4Dmk62I87R2RrY4YkgwWyX3KrzdOuCV7IZZWWUIolaXpQxXhIA6svQ8/Gs+wwq+o1gPvBife9j4V19UnUxl4gtUwVcnSNfzNJgGYDyvOszz+hjxqVj1jD30UCzjnxe+vuxxY+mgr8RNSyjDvcruBAOGk0VXU292zdtYM9Wi0va5sxnhItgsabxlmjmUr2y1S3mDxnf8HC7yZQ7xMueksqDEavqxpWA1e11BPedWL9W38ZlnDpunx9lg1SClqLGCmYBVPOSMzl2WOxYGjivw== von"
- name: h30x
key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDVwgt0+qgrRVVT6Je9JHD2IBIt7pbfeRovGecOtP8H8q5pOOxTmvWwTkLVeOVVWJsWrCso2IQo95z4pUg1yUuXlvassHVCU5oWXlkE2Ax19M/ZjcLZ4eoGwtEJRlcibZwJK/8dD4SffNzd5cmFk+Bs6+hbCvFRG5/tAxdBZnAazB/mK8hUlmQbB0KCcaGXUEB3RYw15Kij7X9+vMAwhyYmYRyQeZmy/mMr0lc49WPQSGWl0oh9B6+rUsV1o8v7OEu3yincnEzUm86RAdgPbFVKMtYX9CEoram6M15Ca5/0fpgIST5ZB3lKc03dSk/cq+yMzLtzmD1XW0u8WHhTnlf2vNMgxOlDH7K1zsZSQkCeJtkOSHff6JFuPqH2zmfMxKWnvnRgIf3J4yZSCImI/Cv4DzRQUE3QS7XNlBKWuIfhaJ67bpwYjyWuFip9BGvBMdYv+htEgSpiSaeIozI55HDVU+zLp0ZpnAKt49/dXdX1OPW9w9GH1/XVuPLYsifrDhs="
- name: vaurora
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM0mpVI7iWm1pQ9Kl7Bjn9ItgVlBn+EX1yv8MCyxwyau"
- name: omz
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIElh8AfX6EQsMjrZPcD5hwAvWlP1Bo6S1CWWUVVASrdM"
- name: bogusoverflow
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAu2hTNKdHe/UjY479VvL5/HdcjYlnA2bOXA0wN6yjNU"
- name: val
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIjJoY4XBTTNsxLVF/sUKBI4WGR2AIiR9qfMdspnsRfJ "
- name: dsx
key: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAm12PbmQ64+BZx2VUUrcVnHUh21zOcp3mC7ZXHMz5u6rQmBwM7c4UJJ39dJBcN1mFKrz4EL7n0AMf/po+fpz+gUj1sB6LKVugN1AOaB75gY2+wSbipu+zFOOVS68lv/VvRppdPNDptOLj+60QshK+Z5QtbDoWBwTvIrDVhdscAmNMUlRpo6syIdS1LiPOHBTVmfXRWrJHSq+0nYalJ219l9vvn/yn9O5r0/u6gHSDVO+++KO9jrGGRjxeNIeO2lZop/qS0DJDir2s/9aWb946+/cSJYeLS2QfziYsYJ5tymab+nacN2iBVamH3vBOsGIenhGvH5y9yQqp3lSDmXMnRQ=="
- name: sebbu
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILPIE7uFg+Kua9B2EgxD2N0F3Ang31iSDK0KH6UUVRe5"
- name: kaliko
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9GKMSkGcE4n5pOuO8DwEbV18H47L6hvRwGEuJolrni"

View File

@ -1,10 +1,82 @@
#!/bin/bash
if [[ $1 = "test" ]]; then
ansible-playbook --check -i hosts site.yml
elif [[ $1 = "local" ]]; then
ansible-playbook --connection=local --inventory 127.0.0.1, --limit 127.0.0.1 \
site.yml -i hosts
CMD="ANSIBLE_RETRY_FILES_ENABLED=0 ansible-playbook -e @config.yml roles/main.yml"
DEPS=("ansible-playbook" "grep")
REMOTE=false
doc_admin() {
echo " Pour plus d'information sur l'installation/configuration du serveur, se référer au manuel d'administration."
echo " ~~> docs/administrateurice.md"
}
# Vérifier que les dépendances sont installées, des fois qu'une personne n'aurait pas lu la doc
for dep in ${DEPS[*]}; do
which "$dep" > /dev/null
if [[ $? != 0 ]]; then
echo "ERREUR: La commande $dep n'existe pas dans mon \$PATH."
echo " Notre recette a besoin des programmes suivants: $DEPS"
doc_admin
exit 2
fi
done
for arg in "$@"; do
if [[ $arg = "remote" ]]; then
REMOTE=true
CMD="$CMD -i hosts"
fi
if [[ $arg = "check" ]]; then
CMD="$CMD --syntax-check"
fi
if [[ $arg = "debug" ]] || [[ $arg = "-vvv" ]]; then
CMD="$CMD -vvv"
fi
if [[ $arg = "verbose" ]] || [[ $arg = "-v" ]]; then
CMD="$CMD -v"
fi
done
if [[ $REMOTE = false ]]; then
# Vérifier que la distribution est bien Debian buster, sinon on risque de tout casser
grep "Debian GNU/Linux 10" /etc/issue > /dev/null
if [[ $? != 0 ]]; then
echo "ERREUR: Cette recette ne fonctionne que sur Debian 10 Buster! /etc/issue n'indique pas qu'on est sur buster."
doc_admin
exit 3
fi
# Sécurité pour empêcher une personne d'appliquer par erreur le playbook de ~fr sur son propre serveur
# Si le hostname dans config.yml est configuré pour fr.tild3.org mais que /etc/hostname n'est pas "fr",
# alors on ne fait rien... sauf bien sûr en mode remote.
grep -E "^hostname:.*?fr.tild3.org.*?$" config.yml > /dev/null
FR=$?
cur_host="$(cat /etc/hostname)"
if [[ "$cur_host" != "fr" ]] && [[ $FR = 0 ]]; then
echo "ERREUR DE CONFIGURATION"
echo " Tu essayes d'appliquer la recette avec la configuration du serveur ~fr (hostname: fr.tild3.org), pourtant il semble que ce serveur n'est pas ~fr (/etc/hostname = $cur_host)."
echo " Pour configurer ton serveur de zéro, tu peux partir du fichier d'exemple config.default.yml."
doc_admin
exit 1
fi
# Vérifier qu'on exécute le playbook en root, sinon on a pas assez de privilèges et ça ne sert à rien!
if [[ "$EUID" != 0 ]]; then
echo "ERREUR: Ce script doit être exécuté en root si exécuté localement."
echo " Tu veux que je configure quoi pour toi si j'ai pas les permissions? ;)"
exit 2
fi
CMD="$CMD --connection=local --inventory 127.0.0.1, --limit 127.0.0.1"
else
ansible-playbook -i hosts site.yml
# Running remotely, ensure there's a hosts file
if [ ! -f ./hosts ]; then
echo "ERREUR: On a besoin d'un fichier hosts pour appliquer la recette à distance."
doc_admin
exit 4
fi
CMD="$CMD -i hosts"
fi
eval $CMD

113
docs/administrateurice.md Normal file
View File

@ -0,0 +1,113 @@
# Administration du serveur
⚠ Si tu veux installer ton propre serveur, tu peux sauter à la section [Installation](#installation).
Les principaux paramètres du serveur sont configurés dans le fichier `host_vars/127.0.0.1.yml`. Ensuite, le dossier roles abrite des recettes pour le système de base (common), pour le serveur web et les utilitaires associés (webserver) et pour le DNS (nameserver). Ces recettes sont appelées dans `site.yml` qui définit leurs paramètres spécifiques.
## Gestion des utilisateurices
Pour créer un nouveau compte utilisateurice, il faut le déclarer dans la configuration du serveur:
```
- name: username
(- sudo: true)
- key: "clé publique SSH (format ~/.ssh/authorized_keys)"
```
## Configuration
Les principales directives de configuration du serveur sont expliquées dans cette section.
### hostname
Définit le nom de domaine principal associé au serveur.
```
hostname: fr.tild3.org
```
### users
Définit une liste d'utilisateurices configuréEs sur la machine. Chaque utilisateurice est un dictionnaire comprenant une clé 'name' portant son pseudonyme, une clé 'key' portant sa clé publique, et une clé optionnelle sudo contenant un booléen (true/false) pour définir si l'utilisateurice doit pouvoir exécuter des commandes admin.
```
users:
- name: user1
key: "-- REMPLACEZ MOI PAR UNE CLÉ SSH --"
- name: new_admin
sudo: true
key: "-- REPLACEZ MOI PAR UNE CLÉ SSH --"
```
### peers
Définit les serveurs amis, et nous permet de stocker des informations à leur propos et notamment des clés publiques. Chaque peer est un dictionnaire contenant les clés suivantes :
```
peers:
- name: ns1.tildeverse.org
key: "-- REMPLACEZ MOI PAR UNE CLÉ SSH --"
fingerprint: "-- REMPLACEZ MOI PAR UNE FINGERPRINT SSH --"
```
La clé SSH définie ici ouvre automatiquement un accès SSH chrooté aux serveurs pairs, pour leur permettre de mettre à jour leurs secrets sur notre serveur. Ce processus est notamment utilisé par le rôle nameserver pour échanger de façon sécurisée les clés (symmétriques) TSIG afin de sécuriser les mises à jour des zones DNS.
L'empreinte de clé définie dans la clé fingerprint correspond à la clé publique du serveur SSH du serveur pair. Cela nous permet de vérifier qu'une tierce personne n'est pas en train d'extirper nos secrets.
## Installation
Alors tu veux monter ton petit serveur? Chouette, on espère que tu vas trouver ici des recettes pour te permettre d'avancer. Pour appliquer notre recette, il te faut un serveur sous Debian 10 (buster). Comme on utilise Ansible, on peut soit appliquer les recettes à distance par SSH, soit en local en installant ansible directement sur le serveur.
### Installation à distance
Pour pouvoir appliquer la recette à distance, il faut que le serveur ait SSH d'installé et configuré. Il faut que tu puisses te connecter au serveur en tant que root, et il est conseillé d'utiliser l'authentification par clé publique.
Ensuite, il faut créer un fichier `hosts` à la racine du dépot pour qu'Ansible trouve le serveur auquel se connecter:
```
nomDuServeur ansible_host=monserveur.example.com ansible_user=root
```
👍 Si tu souhaites utiliser Tor pour configurer ton serveur, il te suffit de [configurer ton client SSH](utilisateurice.md#se-connecter-par-tor) pour passer par Tor. Ansible ne fait rien d'autre qu'exécuter des commandes en SSH. En pratique, c'est suffisamment lent pour te donner envie de faire une installation locale.
### Installation locale
Pour appliquer la recette localement, il faut que ton serveur ait ansible d'installé. Si tu dois cloner le dépot directement sur le serveur, alors il faut aussi installer git.
Par exemple:
```
root@server:~ # apt install ansible git
...
root@server:~ # git clone https://tildegit.org/tilde-fr/infra
```
### Appliquer la recette
Pour pouvoir appliquer la recette, il faut modifier le fichier de configuration config.yml. Celui fourni dans le dépot est le fichier de configuration de ~fr, mais il y a un fichier de config par défaut qu'il suffit de copie à la place :
```
$ cp config.default.yml config.yml
```
Pour une configuration minimale, il faut au moins changer le hostname (en mettant ton nom de domaine) et la clé SSH (voire le nom) de l'utilisateurice. Le reste de la configuration est décrit dans la section [Configuration](#configuration).
Enfin, pour appliquer les changements, il faut lancer le playbook ansible. On utilise pour cela le script deploy.sh. Par défaut, la recette est appliquée localement et il faut donc la lancer en root. Si un argument "remote" est trouvé, alors la recette est exécuté sur le serveur défini dans le fichier hosts.
```
# Exécuter la recette à distance
user@client:~/infra $ ./deploy.sh remote
...
# Appliquer la recette localement
root@server:~/infra $ ./deploy.sh
```
Additionnellement, deploy.sh accepte un argument `check` qui déclenche une simple vérification de la syntaxe Ansible. Enfin, la commande accepte également un argument "debug" ou "-vvv" qui envoie "-vvv" à Ansible, et un argument "verbose" ou "-b" qui envoie "-v" à ansible. En résumé :
```
deploy.sh [remote|check|debug(-vvv)|verbose(-v)] ..
check: vérifie la syntaxe ansible
remote: applique la recette sur un serveur distant (défini dans ./hosts)
debug: active le mode debug de ansible (afficher TOUT)
verbose: active le mode verbose (afficher les résultats des tâches modifiées)
```

115
docs/utilisateurice.md Normal file
View File

@ -0,0 +1,115 @@
# Guide utilisateurice
Bienvenue sur le serveur ~fr ! Ici, tu trouveras peut-être des réponses à tes questions.
## Configurer ton client SSH
Si tu n'es pas encore connectéE au serveur, tu as peut-être besoin d'un petit coup de pouce !
### Générer une paire de clés
Pour se connecter, on utilise des clés SSH. Ces clés vont par paire, une clé publique et une clé privée. La clé privée, tu la garde sur ta machine: elle te permet grâce à un mot de passe, de t'authentifier auprès de n'importe qui connaît ta clé publique. Du coup, pour créer un compte, faut nous envoyer ta clé publique.
Quand tu génères une paire de clés avec la commande ssh-keygen, cela génère dans ton dossier ~/.ssh un fichier sans extension (la clé privée), et un fichier du même nom avec une extension .pub. Pour avoir une connexion sécurisée sans pomper trop de ressources, on utilise des clés de type ed25519 en passant le paramètre `-t ed25519` à la commande :
```
$ ssh-keygen -t ed25519
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tonutilisateurice/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tonutilisateurice/.ssh/id_rsa.
Your public key has been saved in /home/tonutilisateurice/.ssh/id_rsa.pub.
The key fingerprint is:
f6:61:38:25:25:df:4d:4b:13:11:70:cf:4c:c8:a0:22 tonutilisateurice@tamachine
```
La commande te demande où stocker la clé (le paramètre par défaut est très bien pour commencer), puis te demande de renseigner une phrase de passe qui protègera l'utilisation de ta clé privée si jamais tu te la fais dérober. Après avoir reconfirmé ta phrase de passe, hop ta clé est crée ! On peut maintenant la lire, par exemple avec la commande cat :
```
$ cat .ssh/id_ed25519.pub
ssh-ed25519 BLABLABLA tonutilisateurice@tamachine
```
Pour qu'on puisse te créer un compte, c'est cette clé publique qu'il faut nous transmettre. Le dernier bout, par contre n'est pas obligatoire et peut t'empêcher de te connecter depuis une autre machine en copiant simplement ta clé ailleurs, parce que le nom de ta machine ou ton nom d'utilisateurice aura changé.
### Se connecter
Une fois que ton compte aura été activé, tu peux maintenant te connecter au serveur avec SSH :
```
$ ssh utilisateurice@fr.tild3.org
Enter passphrase for key '/home/tonutilisateurice/.ssh/id_ed25519':
```
### Configurer SSH pour raccourcir la commande
C'est long à taper. Vite, comment configurer des Hosts!
TODO
### Gérer plusieurs clés SSH
Ton client SSH peut gérer plusieurs paires de clés à la fois. Si tu as besoin d'en créer d'autres, tu peux leur donner des petits noms avec le paramètre `-f ~/.ssh/taclé` de ssh-keygen, ou bien en renseignant un autre emplacement pour stocker la clé quand le programme te le demande. Ces clés peuvent être stockées plus ou moins n'importe où sur ta machine, mais en général on trouve ça plutôt pratique de les garder dans le dossier ~/.ssh.
Pour te connecter à un serveur en utilisant une clé spécifique, on utilise `ssh -i ~/.ssh/taclé utilisateurice@fr.tild3.org`. Si ça devient un peu long à tout taper, le fichier de configuration de ton client SSH a une option `IdentityFile` dans le Host qui te permet de spécifier la clé à utiliser pour ce serveur :
```
Host fr
IdentityFile ~/.ssh/taclé
...
```
Comme tu sais maintenant configurer ton client SSH, il y a une option pratique pour gérer plusieurs clés. Un Host dans le fichier de configuration SSH
### Se connecter en passant par Tor
Pour se connecter au serveur en passant pas le réseau Tor, il suffit d'ajouter les paramètres suivants à la configuration du Host correspondant :
```
...
ProxyCommand connect -4 -S localhost:9050 $(tor-resolve %h localhost:9050) %p
CheckHostIP no
...
```
Bien sûr cela ne fonctionne que si tor est installé et fonctionnelle sur ta machine. Sur Debian GNU/Linux, il te suffit d'installer le paquet tor (apt install tor) et tout marche.
## Configurer tes pages perso
Nous proposons de l'hébergement de pages/fichiers statiques sur le web. Si ton nom d'utilisateurice est `username`, alors tu contrôles les addresses username.fr.tild3.org et fr.tild3.org/~username. En plus de cela, une adresse en .onion est générée pour toi à la création de ton compte, et te permet de fournir un accès sécurisé et anonymes à tes pages perso.
Par défaut, ces trois adresses servent le même contenu, que tu trouveras dans ~/public_html/ c'est à dire le dossier public_html dans ton dossier personnel. Si tu veux rajouter du contenu sur ton site, il suffit de le verser dans ce dossier.
TODO: Si tu souhaites avoir des sites différents sur ces trois adresses, pas de problème! En réalité, chaque site est servi par un dossier différents dans le dossier public/ de ton compte. Mais pour te simplifier la vie, à la création de ton compte, ces trois dossiers sont par défaut reliés à ton dossier ~/public_html avec des liens symboliques, pour éviter de perdre la tête.
Maintenant, si tu supprimes un de ces liens symboliques, tu peux le remplacer par un dossier qui sert du contenu spécifique à cette adresse :
```
$ rm ~/public/utilisateurice
$ mkdir ~/public/utilisateurice
$ echo "Bienvenue sur mon sous-domaine perso!" > ~/public/utilisateurice/index.html
# Et ce fichier est désormais accessible sur le web
$ curl https://utilisateurice.fr.tild3.org/
Bienvenue sur mon sous-domaine perso!
```
Ces trois dossiers sont disponibles:
- ~/public/tilde: le contenu servi à l'adresse fr.tild3.org/~utilisateurice
- ~/public/utilisateurice: le contenu servi à l'adresse utilisateurice.fr.tild3.org
- ~/public/onion: le contenu servi à l'adresse en .onion (à trouver dans ~/onion)
## Envoyer des fichiers sur le serveur
Si tu as fait un petit site web en local que tu veux publier sur le serveur, ou que tu veux stocker des trucs sur ton compte, cela se passe directement avec tes identifiants SSH! Pas besoin de configurer un client FTP ou Dropbox, tu peux simplement taper dans ta console (sur ta machine, pas sur le serveur) :
```
# Envoie un fichier au serveur dans le dossier personnel
$ scp monfichier username@fr.tild3.org:~
# Envoie mon dossier dans le fichier personnel
$ scp -r Documents username@fr.tild3.org:~
# La partie derrière les : indique dans quel dossier envoyer
$ scp -r mon_site/* username@fr.tild3.org:~/public_html
```
Si cela te ferait plaisir, on peut activer rsync aussi.

View File

@ -1 +0,0 @@
fr.yml

View File

@ -1,11 +0,0 @@
hostname: fr.tild3.org
users:
- name: tofu
sudo: true
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG4bKe9LSA3/AY4gCB20eyJVPW+zOg07/b3A4QC0Z6XC"
- name: kumquat
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZ5FBnDlBIGlJ4TI0babTTmS5ECPM3yuDP1AhnNQUDZ"
- name: mspe
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICZAs76kQJ0/Et2NGzhxurK2wE0VhYsG9wl85iCmR9xH"
- name: merry
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxPbGSCW0KOOreD0FZGu3PFKMNIEi5VrJHzub8+poVs"

1
hosts
View File

@ -1 +0,0 @@
fr ansible_host=fr.tild3.org ansible_user=root

93
i18n/en.yml Normal file
View File

@ -0,0 +1,93 @@
task: Task
handler: Handler
SUMMARY: SUMMARY
Gathering Facts: Gather facts
changed: changed
ok: ok
ignored: ignored
failed: failed
unreachable: unreachable
#### roles/.common
# roles/.common/tasks/main.yml
common-backports: Enable backports
common-base-pkg: Install base packages
common-certbot-setup: Configure certbot with the contact email
common-users-gen: Generate user accounts
common-peering: Setup peering with friendly servers
common-additional-packages: Install additional packages
common-roles: Apply roles defined in config
# roles/.common/tasks/packages.yml
common-package-managers: Start package managers
# roles/.common/tasks/tor.yml
common-tor-create: Create /etc/tor/onions/ for tor config
common-tor-config: Load onions from /etc/tor/onions
# roles/.common/tasks/peering/main.yml
common-peering-home: Create /home/peers
common-peering-remote: Configure peer server
# roles/.common/tasks/peering/setup_local.yml
common-peering-local-account: Create account peer
common-peering-local-ln: Create symbolic link to the local peer
common-peering-local-genkey: Generate SSH key for local peer
common-peering-local-confkey: Force SSH as ed25519 for local peer
# roles/.common/tasks/peering/setup_peer.yml
common-peering-remote-account: Create account for peer server
common-peering-remote-key: Configure SSH key for peer
common-peering-remote-known: Declare key for peer server on account peer
# roles/.common/tasks/users/main.yml
common-users-tor-reload: Reload tor to generate new onions
common-users-tor-wait: Wait for onions to be generated
# roles/.common/tasks/users/setup_user.yml
common-users-setup-account: Create account for new user
common-users-setup-sudo: Give admin powers to new user
common-users-setup-key: Authorize associated SSH key
common-users-setup-onion: Generate a personal onion
common-users-setup-irc: Welcome the user on IRC
common-users-tor-wait: Wait for onions to be generated
#### roles/webserver
# roles/webserver/handlers/main.yml
webserver-reload-nginx: Restart web server
# roles/webserver/tasks/certbot.yml
webserver-certbot-main: Generate main certificate
webserver-certbot-users: Generate user certificates
# roles/webserver/tasks/nginx.yml
webserver-default-config: Generate config for default site
webserver-default-symlink: Enable config for default site
webserver-tls-config: Configure webserver TLS settings
webserver-personal-pages: Setup personal pages
webserver-bucket-size: Configure webserver for long domain names (onions)
# roles/webserver/tasks/onions_perso.yml
webserver-onion-hostname: Read personal onion
webserver-onion-giveuser: Tell user about their onion address
webserver-onion-config: Configure personal onion page
webserver-onion-symlink: Enable personal onion page config
# roles/webserver/tasks/packages.yml
webserver-pkg: Setup packages for the webserver
# roles/webserver/tasks/pages_perso.yml
webserver-perso-config: Configure personal pages for webserver
webserver-perso-symlink: Enable personal pages config
webserver-perso-publichtml: Create public_html folder in skel
webserver-perso-onions: Prepare personal pages on onions
webserver-perso-multisite: Enable multisite support by linking to ~/public_html
# roles/webserver/tasks/multisite.yml
webserver-multisite-check: Verify that ~/public/html exists
webserver-multisite-folder: Create ~/public/html
webserver-multisite-symlink: Create symlinks to ~/public_html
#### .debian
# roles/.debian/tasks/main.yml
debian-pkg: Setup Debian packaged défined in config
#### .rust
# roles/.rust/tasks/main.yml
rust-setup: Setup rust and cargo
rust-user: Create a rust account to compile packages
rust-cargo-folder: Create folder for cargo
rust-bin-ownership: Give rust ownership over local bin directory
rust-bin-symlink: Create symbolic link from cargo to local bin directory
rust-pkg: Setup rust packages defined in config
#### .custom
# roles/.custom/tasks/zola/main.yml
custom-zola-setup: Setup zola static site generator (SSG)
# roles/.custom/tasks/ttbp/main.yml
custom-ttbp-source: Download ttbp source
custom-ttbp-pkg: Setup ttbp dependencies
custom-ttbp-setup: Setup Tilde Team Blogging Platform (ttbp)
custom-ttbp-tmp: Delete ttbp temporary files

92
i18n/fr.yml Normal file
View File

@ -0,0 +1,92 @@
task: Tâche
handler: Gestionnaire
SUMMARY: RÉSUMÉ
Gathering Facts: Rassembler les faits
changed: changéE
ok: ok
ignored: ignoré
failed: échoué
unreachable: injoignable
#### roles/.common
# roles/.common/tasks/main.yml
common-backports: Activer les backports
common-base-pkg: Installer les paquets de base
common-certbot-setup: Configurer certbot avec le mail de contact
common-users-gen: Générer les comptes des utilisateurices
common-peering: Mettre en place le peering avec les serveurs amis
common-additional-packages: Installer les paquets supplémentaires
common-roles: Appliquer les rôles définis dans la config
# roles/.common/tasks/packages.yml
common-package-managers: Exécuter les gestionnaires de paquets
# roles/.common/tasks/tor.yml
common-tor-create: Créer /etc/tor/onions pour la config Tor
common-tor-config: Charger les onions tor depuis /etc/tor/onions
# roles/.common/tasks/peering/main.yml
common-peering-home: Créer /home/peers
common-peering-remote: Configurer le serveur pair
# roles/.common/tasks/peering/setup_local.yml
common-peering-local-account: Créer un compte peer
common-peering-local-ln: Créer un lien symbolique vers le pair local
common-peering-local-genkey: Créer une clé SSH pour le compte peer
common-peering-local-confkey: Forcer SSH en ed25519 sur le compte peer
# roles/.common/tasks/peering/setup_peer.yml
common-peering-remote-account: Créer un compte pour le serveur pair
common-peering-remote-key: Configurer la clé SSH autorisée pour le pair
common-peering-remote-known: Déclarer la clé du pair sur le compte peer
# roles/.common/tasks/users/main.yml
common-users-tor-reload: Redémarrer tor pour générer les nouveaux onions
common-users-tor-wait: Attendre que les onions soient générés
# roles/.common/tasks/users/setup_user.yml
common-users-setup-account: Créer le nouveau compte
common-users-setup-sudo: Donner les droits d'admin au nouveau compte
common-users-setup-key: Autoriser la clé SSH associée
common-users-setup-onion: Générer un onion perso
common-users-setup-irc: Accueillir l'utilisateurice sur IRC
#### roles/webserver
# roles/webserver/handlers/main.yml
webserver-reload-nginx: Redémarrer le serveur web
# roles/webserver/tasks/certbot.yml
webserver-certbot-main: Générer le certificat principal
webserver-certbot-users: Générer les certificats perso
# roles/webserver/tasks/nginx.yml
webserver-default-config: Générer la configuration du site par défaut
webserver-default-symlink: Activer la config du site par défaut
webserver-tls-config: Paramétrer TLS pour le serveur web
webserver-personal-pages: Mettre en place les pages perso
webserver-bucket-size: Configurer le serveur web pour les longs domaines (.onion)
# roles/webserver/tasks/onions_perso.yml
webserver-onion-hostname: Récupérer l'onion perso
webserver-onion-giveuser: Indiquer à l'utilisateurice l'adresse de son onion
webserver-onion-config: Configurer les pages perso en onion
webserver-onion-symlink: Activer la configuration des pages perso en onion
# roles/webserver/tasks/packages.yml
webserver-pkg: Installer les paquets pour le serveur web
# roles/webserver/tasks/pages_perso.yml
webserver-perso-config: Configurer les pages perso
webserver-perso-symlink: Activer la configuration des pages perso
webserver-perso-publichtml: Créer le dossier public_html dans /etc/skel
webserver-perso-multisite: Activer le multi-site en pointant vers ~/public_html
webserver-perso-onions: Préparer les pages perso en onion
# roles/webserver/tasks/multisite.yml
webserver-multisite-check: Vérifier si ~/public/html existe
webserver-multisite-folder: Créer ~/public/html/
webserver-multisite-symlink: Créer les liens symboliques vers ~/public_html
#### .debian
# roles/.debian/tasks/main.yml
debian-pkg: Installer les paquets Debian définis dans la config
#### .rust
# roles/.rust/tasks/main.yml
rust-setup: Installer rust et cargo
rust-user: Créer un compte rust pour compiler les paquets
rust-cargo-folder: Créer le dossier pour cargo
rust-bin-ownership: Donner à rust la gestion des exécutables locaux
rust-bin-symlink: Créer un lien symbolique de cargo vers les exécutables locaux
rust-pkg: Installer les paquets rust qui nous intéressent
#### .custom
# roles/.custom/tasks/zola/main.yml
custom-zola-setup: Installer le générateur de sites statiquse (SSG) zola
# roles/.custom/tasks/ttbp/main.yml
custom-ttbp-source: Télécharger la source de ttbp
custom-ttbp-pkg: Installer les dépendances de ttbp
custom-ttbp-setup: Installer Tilde Team Blogging Platform (ttbp)
custom-ttbp-tmp: Supprimer les fichiers temporaires de ttbp

1
roles Submodule

@ -0,0 +1 @@
Subproject commit 42c4547358504d25275eede195b25e9e50095ffa

View File

@ -1,5 +0,0 @@
# Because we are using logrotate for greater flexibility, disable the
# internal certbot logrotation.
max-log-backups = 0
rsa-key-size = 4096
email = southerntofu@thunix.net

View File

@ -1,3 +0,0 @@
HiddenServiceDir /var/lib/tor/{{ item.name }}
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:80

View File

@ -1,45 +0,0 @@
- name: Activer les backports
lineinfile:
path: /etc/apt/sources.list.d/backports.list
line: deb http://mirror.bhh.sh/debian buster-backports main contrib
create: yes
state: present
- name: Installer les paquets de base
apt:
state: present
name: "{{ packages }}"
update_cache: yes
vars:
packages:
- git
- subversion
- mercurial
- htop
- tmux
- vim
- emacs
- certbot
- mutt
- weechat
- elinks
- rustc
- cargo
- cargo-doc
- rsync
- dnsutils
- make
- g++
- libssl-dev
- mosh
- name: setup certbot with contact email
copy:
src: ../files/letsencrypt_cli.ini
dest: /etc/letsencrypt/cli.ini
- include: tor.yml
- include: rust_packages.yml
- include: users.yml

View File

@ -1,56 +0,0 @@
- name: Installer rust et cargo
apt:
state: present
name: "{{ packages }}"
update_cache: yes
vars:
packages:
- rustc
- cargo
- cargo-doc
- name: Créer unE user rust pour compiler les crates
user:
name: "rust"
state: present
skeleton: /etc/skel
shell: /bin/bash
system: no
createhome: yes
home: "/home/rust"
- name: Créer le dossier pour cargo
file:
path: /home/rust/.cargo
state: directory
owner: rust
group: rust
- name: Transférer les permissions de /usr/local/bin à rust
file:
path: /usr/local/bin
state: directory
owner: rust
group: rust
mode: 0755
recurse: yes
- name: Créer un symlink de ~rust/.cargo/bin vers /usr/local/bin
file:
dest: /home/rust/.cargo/bin
src: /usr/local/bin
force: yes
follow: no
state: link
- name: Installer les paquets rust qui nous intéresse
become:
become_user: rust
command:
cmd: "cargo install {{ item }}"
creates: "/usr/local/bin/{{ item }}"
loop: "{{ crates }}"
vars:
crates:
- lsd

View File

@ -1,26 +0,0 @@
- name: Register users
user:
name: "{{ item.name }}"
state: present
skeleton: /etc/skel
shell: /bin/bash
system: no
createhome: yes
home: "/home/{{ item.name }}"
- name: Make admins sudo
user:
name: "{{ item.name }}"
group: sudo
when: item.sudo|default(false) == true
- name: Publish SSH keys
authorized_key:
user: "{{ item.name }}"
state: present
key: "{{ item.key }}"
- name: Génerer un onion pour l'utilisateurice
template:
src: ../files/onion.conf.j2
dest: "/etc/tor/onions/{{ item.name }}.conf"

View File

@ -1,14 +0,0 @@
- name: Tor charge les onions depuis /etc/tor/onions/
lineinfile:
path: /etc/tor/torrc
line: "%include /etc/tor/onions"
state: present
notify: reload tor
- name: On crée le dossier pour les onions
file:
path: /etc/tor/onions
state: directory
owner: debian-tor
group: debian-tor
mode: '0740'

View File

@ -1,12 +0,0 @@
- include_tasks: setup_user.yml
loop: "{{ users }}"
- name: Redémarrer le démon tor pour générer les onions
service:
name: tor
state: restarted
- name: Attendre que les onion perso soient générés
wait_for:
path: "/var/lib/tor/{{ item.name }}/hostname"
loop: "{{ users }}"

Binary file not shown.

View File

@ -1,37 +0,0 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
location /.well-known/acme-challenge {
try_files $uri $uri/ =404;
}
location / {
return 302 https://$host$request_uri;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/{{ hostname }}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ hostname }}/privkey.pem;
server_name _;
root /var/www/html;
index index.html;
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/public_html/$2;
autoindex on;
#try_files $2 $2/ = 404;
}
location / {
try_files $uri $uri/ =404;
}
}

View File

@ -1,12 +0,0 @@
server {
listen 80;
listen [::]:80;
server_name {{ web_onion.stdout }};
root /home/{{ item.name }}/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

View File

@ -1,16 +0,0 @@
# Taken from https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

View File

@ -1,16 +0,0 @@
{% for user in users %}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/{{ user.name }}.{{ hostname }}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ user.name }}.{{ hostname }}/privkey.pem;
server_name {{ user.name }}.{{ hostname }};
root /home/{{ user.name }}/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
{% endfor %}

View File

@ -1,2 +0,0 @@
- name: reload nginx
service: name=nginx state=restarted

View File

@ -1,10 +0,0 @@
- name: Generate main certificate
command:
creates: /etc/letsencrypt/live/{{ hostname }}/fullchain.pem
cmd: certbot certonly --non-interactive --agree-tos --webroot -w /var/www/html -d {{ hostname }} -d www.{{ hostname }}
- name: Generate user certificates
command:
creates: "/etc/letsencrypt/live/{{ item.name }}.{{ hostname }}/fullchain.pem"
cmd: "certbot certonly --non-interactive --agree-tos --webroot -w /var/www/html -d {{ item.name }}.{{ hostname }}"
loop: "{{ users }}"

View File

@ -1,7 +0,0 @@
---
# This playbook contains all of the www config
- include: packages.yml
# TODO: Some certbot is needed before we can load the whole nginx config so we need some intermediary step (bootstrapping process)
- include: nginx.yml
- include: certbot.yml

View File

@ -1,27 +0,0 @@
- name: Deploy default site configuration
template:
src: ../files/default-site.conf.j2
dest: /etc/nginx/sites-available/default-site.conf
notify: reload nginx
- name: Prepare symlink for default site
file:
src: /etc/nginx/sites-available/default-site.conf
dest: /etc/nginx/sites-enabled/default-site.conf
state: link
- name: Deploy TLS config
copy:
src: ../files/ssl.conf
dest: /etc/nginx/conf.d/ssl.conf
notify: reload nginx
- name: Déployer les pages perso
include: pages_perso.yml
- name: Configurer nginx pour les noms de domaine longs
lineinfile:
path: /etc/nginx/nginx.conf
line: "server_names_hash_bucket_size 128;"
insertafter: "^http {"
notify: reload nginx

View File

@ -1,15 +0,0 @@
- name: Récupérer le hostname en onion
command: "cat /var/lib/tor/{{ item.name }}/hostname"
register: web_onion
- name: Configurer l'onion pour les pages perso de l'utilisateurice
template:
src: ../files/onion.conf.j2
dest: "/etc/nginx/sites-available/{{ item.name }}.onion.conf"
notify: reload nginx
- name: Activer la configuration nginx
file:
src: "/etc/nginx/sites-available/{{ item.name }}.onion.conf"
dest: "/etc/nginx/sites-enabled/{{ item.name }}.onion.conf"
state: link

View File

@ -1,75 +0,0 @@
# Install apache and accoutrements www, irrespective of what role they might have
---
- name: Install packages for webserver
apt:
name: "{{ packages }}"
state: present
update_cache: yes
vars:
packages:
- nginx
- php-fpm
- php-curl
- php-gd
- php-intl
- php-sqlite3
- php-mbstring
# Malheureusement zola compile pas sur debian buster (rustc v1.34 contre 1.36 requis)
# Donc on copie un binaire que j'ai compilé avec amour
- name: Installer le générateur de site statique zola
copy:
src: ../files/bin/zola
dest: /usr/local/bin/zola
mode: 0755
# - stat:
# path: /usr/local/bin/zola
# register: zola
#
# - name: Télécharger la source de zola
# git:
# dest: /tmp/zola
# repo: https://github.com/getzola/zola
# version: "v0.10.1"
# when: not zola.stat.exists
#
# Zola a besoin de make, g++, libssl-dev et libsass-dev qui sont installés dans main.yml
#
# - name: Compiler zola
# command: "cargo install --path /tmp/zola"
# when: not zola.stat.exists
#
# - name: Supprimer les fichiers temporaires de zola
# file:
# path: /tmp/zola
# state: absent
# when: not zola.stat.exists
- stat:
path: /usr/local/bin/ttbp
register: ttbp
- name: Télécharger la source de ttbp
git:
repo: https://tildegit.org/envs/ttbp.git
dest: /tmp/ttbp
when: not ttbp.stat.exists
- name: ttbp a des dépendances non installées dans main.yml
apt:
name: "python-setuptools"
state: present
- name: Compiler ttbp
command:
cmd: "python /tmp/ttbp/setup.py install"
chdir: /tmp/ttbp
when: not ttbp.stat.exists
- name: Supprimer les fichiers temporaires de ttbp
file:
path: /tmp/ttbp
state: absent
when: not ttbp.stat.exists

View File

@ -1,21 +0,0 @@
- name: Créer les liens symboliques pour la config des sites
file:
src: /etc/nginx/sites-available/users-site.conf
dest: /etc/nginx/sites-enabled/users-site.conf
force: yes
follow: no
state: link
- name: Configurer les pages perso pour nginx
template:
src: ../files/users.conf.j2
dest: /etc/nginx/sites-available/users-site.conf
- name: Ajouter un dossier public_html dans le squelette
file:
path: /etc/skel/public_html
state: directory
- name: Configurer les pages perso en onion
include: onions_perso.yml
loop: "{{ users }}"

View File

@ -1,9 +0,0 @@
- name: Setup common utilities
hosts: all
roles:
- common
- name: Setup web server
hosts: all
roles:
- webserver