LaboM Yunohost sur raspberrypi

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Cette page est obsolète: Pour l'installation de Yunohost 2.5 voir Yunohost 2.5


LaboM

Le but est d'installer un ensemble d'applications et de services Internet (via Yunohost) sur une Raspberry Pi équipée d'une carte wifi, et de faire en sorte que ces services soient consultables sans que la raspberry soit connectée au net.

ça permet de constituer un serveur ressources autonome dans lequel on peut retrouver des PADs, un wiki, un owncloud, une piratebox et toutes les applications proposées via yunohost

Installation de base

Je me suis appuyé sur ce tutoriel avec quelques modifications (merci à son auteur !) http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:yunohost-jessie

Formatage de la carte SD et y copier les fichiers raspbian

Il est nécessaire de :

  • formater la carte SD en FAT 32
    • identifier la partition, le nom de la carte SD
df
/dev/sdb1           15232464   2188800   13043664  15% /media/b01/GNURADIO

c'est sdb1

sudo umount /dev/sdb1
sudo mkfs.vfat -n 'PBKey' -I /dev/sdb1

Raspbian jessie light

Installer l'image sur la carte SD as usual  : https://www.raspberrypi.org/documentation/installation/installing-images/README.md


Il convient ensuite d'installer l'image sur une carte SD (classe 10) 16 Gbits c'est pas mal, pour installer, une fois identifié le périphérique correspondant à la carte SD avec la commande

mount

chez moi c'est /dev/sdb1, donc ça donne

umount /dev/sdb1
sudo dd bs=4M if=2016-05-27-raspbian-jessie-lite.img of=/dev/sdb

! ne pas mettre le 1 de sdb1 pour la commande dd

Dans un autre terminal, pour suivre l'avancée de dd, taper :

sudo pkill -USR1 -n -x dd

ou utiliser dcfdd qui montre la progression

sudo dcfldd statusinterval=10 bs=4M if=/mnt/diskimages/ISOs/Raspberry\ Pi/2015-11-21-raspbian-jessie-lite.img of=/dev/sdb

Suite de l'installation pour Raspbian Jessie lite ligne droite

Une fois la raspi branchée lancée (ça clignote vert), il faut ensuite trouver la raspi sur le réseau, plusieurs techniques :

sudo ifconfig

ou

hostname -I

donne l'adresse IP de son ordi type 192.168.1.101, on va scanner ce réseau avec nmap

sudo apt-get install nmap
sudo nmap -sn 192.168.1.0/24
Nmap scan report for raspberrypi.local (192.168.1.102)
Host is up (0.0031s latency).
MAC Address: 0C:D2:92:86:01:EB (Raspberry Pi Fondation)

Faire alors

ssh pi@192.168.1.102

si pas trouver, tenter un truc du genre (à adapter en fonction de son domaine)

ssh pi@raspberry.local

ça permet de rentrer en ssh dans la raspberry et de taper des commandes, on commence par

sudo raspi-config

étendre la partition (mais plus besoin avec jessie light car automatique(ne focntionne pas sur clé USB, le faire dans gparted)), adapter les Locales, rebooter, une fois cela fait, rebelote en suivant ces indications https://yunohost.org/#/install_manually_fr :

dpkg-reconfigure locales
dpkg-reconfigure tzdata
Advanced Option : Hostname : changer pi en YunoHost

Le grand ménage des packets

sudo apt-get update
sudo apt-get upgrade

Installez git

sudo apt-get install git

Clonez le dépôt du script d’installation de YunoHost

git clone https://github.com/YunoHost/install_script /tmp/install_script

L’utilisateur root doit avoir un mot de passe, si ce n’est pas le cas, créez-en un (sinon le script d’installation échoue) :

sudo passwd root

Lancez le script d’installation en root

su
cd /tmp/install_script && ./install_yunohost

Répondre oui à l'écrasement des fichiers de config de metronome et +, si tout va bien :

Yunohostpostinstallno.png


Répondre NON au lancement de la post install, regarder le log d'installation pour voir si tout va bien

cat /var/log/yunohost-installation.log
sudo apt-get -f install
sudo apt-get autoclean && apt-get autoremove
sudo reboot

J'ai fait 2 installations successives pour être sur ...

yunohost tools postinstall

Il faudra renseigner votre Nom De Domaine et définir un mot de passe d'administration, si vous n'avez pas de domaine ou sous-domaine, choisir un domaine du type mondomaine.nohost.me

L'adresse d'administration de votre YunoHost est https://monserveur.org/yunohost/admin/ et l'adresse du portail de votre YunoHost est https://monserveur.org/.

Si l'erreur "utilisateur admin inconnu" s'affiche au début de la postinstallation en la faisant avorter, il n'y a pas de solutions simples à votre problème ! Recommencez la procédure du formatage de la carte SD, ma quatrième installation ce fut la bonne (Ale)...

Nom de domaine

Si on dispose d'un nom de domaine

Chez Gandi

La page détaillée de la configuration du domaine chez Gandi L'interface des fichiers de zones est très confuse !!

Chez OVH

Créer un sous-domaine :

https://www.ovh.com/fr/g1332.attacher-domaine-ou-sous-domaine-a-mon-hebergement-web#ajouter_un_sous-domaine_vers_votre_hebergement_web

Création d'un DynHost :

https://www.ovh.com/fr/g2024.mutualise_dynhost

La création du DynHost prend 24H, j'ai du refaire la manipulation, car le DynHost ne s'affichait pas. Suite à la création d'une DNS dynamique, il reste néanmoins l'adresse du sous-domaine chez OVH. Dans l'onglet Zone DNS, il faut supprimer les différentes occurrences du sous-domaines concerné en cliquant sur les corbeilles de chaque champ.

Mettre à jour l'IP

  • Script pour mettre à jour l'IP dynamique de la box :

http://zwindler.fr/wordpress/2014/09/22/mise-a-jour-de-votre-dns-chez-ovh-avec-dynhost/

Pour que les script fonctionne de manière optimale, modifier la ligne suivante comme suit :

OLDIP=`dig +short @dns17.ovh.net $HOST` 

Pour forcer à regarder le serveur DNS d'OVH.

Explication de crontab pour modifier la temporalité des mises à jour de l'adresse :

https://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux/executer-un-programme-a-une-heure-differee

  • ddclient :

https://doc.ubuntu-fr.org/ddclient

  • Ipcheck

http://ipcheck.sourceforge.net

Si on ne dispose pas de nom de domaine > nohost.me

Se connecter avec son navigateur à l'adresse https://mondomaine.nohost.me/, mais pour que cela marche :

  • Il faut configurer sa box internet pour que les ports 80 et 443 soient routés vers l'ip de la raspberry, ça se passe en général à travers l'interface web de gestion de la box

Sur Free-box

PI freebox.png

  • OU modifier le fichiers hosts de SON ordinateur comme cela :
sudo nano /etc/hosts
127.0.0.1       localhost
127.0.1.1       db.ultimedia    db
192.168.1.88 labominable.nohost.me

Sur Livebox

Se connecter chez soi à la livebox, taper dans un navigateur :

192.168.1.1

Il faut s'identifier. Le mot de passe d’administration de la Livebox est initialisé avec les 8 premiers caractères de la clé de sécurité WiFi par défaut inscrite sur la Livebox. Cliquer sur l'onglet Configuration avancée. Puis sur l'onglet PAT/NAT

Pour ajouter une règle personnalisée, choisir les configurations suivantes : PI livebox.png

Il n'est pas possible de se connecter sur le serveur en étant sur le même réseau que celui-ci car la LIvebox ne possède pas de fonction de loopback. Pour y accéder utilisez en un autre ou un smartphone pour les tests.

Une fois rentré à la maison

Modifier son fichier /etc/hosts

Regarder depuis votre ordinateur quelle adresse IP la raspberry a pris sur votre réseau local (type 192.168.1.*** par exemple)

sudo nmap -sP 192.168.1.0/24

doit donner l'adresse de la pi, disons 192.168.1.101

L'interface de votre Box internet peut aussi vous donner l'adresse IP de la Pi directement (voir la partie DHCP)

ensuite, il faut dire à yunohost que le domaine enregistré a changé d'IP publique, se connecter en ssh à la pi :

ssh pi@192.168.1.101

et taper, une fois loggué sur la Pi en ssh  :

yunohost domain dns-conf mondomaine.nohost.me

Vérifier que vous avez fait le routage des ports sur votre box internet pour qu'à minima, les ports 80 et 443 soient routés vers l'adresse de la pi soit 192.168.1.101

Au final, votre box doit être désormais visible de l'extérieur, pour être sur, il faut enlever la ligne du fichier hosts de votre ordinateur :

sudo nano /etc/hosts

Exemple de fichier /etc/hosts

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

#127.0.1.1      Yunohost
#192.168.1.18   mondomaine.nohost.me

Administrer son yunohost

Se rendre sur l'interface via l'adresse du domaine yunohost en ajoutant /admin à la fin de l'adresse (exemple:https://tondomaine/yunohost/admin), puis y saisir le mot de passe qui a été personnalisé pour le root.

La Moulinette

La Moulinette permet d'administer, configurer Yunohost:

Des détails Moulinette

Se connecter à sa pi à distance via un terminal

Quand on est loin de sa raspberry pi (mettons que vous êtes aux Tongas, et que votre Pi se trouve au 108 rue de Bourgogne à Orléans), et que l'on veut avoir accès à sa pi via un terminal, comme quand on est près de cette pi, rien de plus simple. Il suffit de se souvenir de l'identifiant d'utilisateur que l'on a indiqué lors de l'installation, et du mot de passe, et de taper la commande suivante, dans un terminal, en adaptant à votre situation (en remplaçant monnomutilisateur, mondomainecheri.cheri.cheri et monmotdepasse), en acceptant le certificat, et en saississant le mot de passe quand c'est demandé:

ssh monnomdutilisateur@mondomaincheri.cheri.cheri

Installer des applications Yunohost / La Brique

Owncloud

La page détaillée de l'installation de Owncloud


Etherpad

Pour l'instant l'appli etherpad n'est pas prête pour yunohost 2.4, installation à la main en suivant ce tutoriel qui a fonctionné pour debian jessie, pas le passage sur le port 80 pour lequel il doit plutot falloir adopter la méthode proposée par le deuxième tuto

pour revenir en arrière sur le port 80 et rétablir le port 9001 :

setcap 'cap_net_bind_service=-ep' /usr/bin/nodejs

changer le port dans

nano /home/etherpad/etherpad-lite/settings.json

Il faut décommenter la partie concernant le compte admin sinon, pas d'admin !

donc enlever les :
/*

*/

Installer une interface graphique type XFCE, MATE ou LXCE

Troubleshootings

Votre sd card déconne

Installer sur une clé USB

Metronome

  • Sur Raspberry B+ : erreur sur installation de metronome: compiler avec ce tuto

Ressources

Doc:

Pour l'installation:

A voir:

Version de noyau

Mise à jour du noyau avec:

sudo rpi-update

en particulier si raspbian est sur une clé usb, la sd card n'est pas mise à jour lors d'une nouvelle install sur la clé.

Bonus

Lignes de commande utiles

  • Changer le mot de passe root
sudo passwd root
  • Changer le mot de passe pi
sudo passwd pi
  • Eteindre la pi
sudo shutdown now

Ajouter une passerelle

Si problème du type

SIOCADDRT: Le réseau n'est pas accessible

ajouter sa propre adresse ip comme passerelle et ensuite celle du routeur

sudo route add default gw 192.168.0.2
sudo route add default gw 192.168.1.254

hotspot wifi

Les différents type de hotspot : "normal", via vpn, via TOR

Pour installer la brique internet (hotspot wifi), se rendre dans l'espace d'administration de Yunohost puis Applications / Installer / Installer une application personnalisée et coller ce lien :

https://github.com/labriqueinternet/hotspot_ynh

Une fois installé vous avez un réseau sans accès internet (une Pirate box). Pour avoir un réseau internet VPN, il faut répéter la même opération avec ce lien

https://github.com/labriqueinternet/vpnclient_ynh

Si, en revanche, vous souhaitez un réseau TOR :

https://github.com/labriqueinternet/torclient_ynh

Troubleshooting

Dans mon cas, hostapd ne voulait pas démarrer,

sudo service hostapd status
sudo hostapd -dd  /etc/hostapd/hostapd.conf

donne :

nl80211: Failed to set interface 3 to mode 3: -16 (Device or resource busy)

il a fallu trouver le service à désactiver :

sudo apt-get install aircrack-ng
sudo airmon-ng check
sudo airmon-ng check kill : pour tout tuer en mode bourin

le processus coupable était là wpa_supplicant

sudo nano /etc/network/interfaces

et commenter les 2 lignes appelant wpa_suppli

#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

a priori pas besoin de désactiver wpa2 dans l'admin du wifi ...

Pour rendre Internet accessible via le wifi, il m'a fallu :

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

et rendre tout ça pérenne : sauvegarder les régles

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" to save the rules to the file /etc/iptables.ipv4.nat 
sudo nano /etc/rc.local and just above the line exit 0, add the following line:
iptables-restore < /etc/iptables.ipv4.nat  

Ressources complémentaires

Rendre les services accessibles via le hotspot wifi sans connexion au net

1) modifier le fichier /etc/resolvconf.conf pour indiquer à LaboM que le serveur DNS à utiliser est lui-même

sudo nano /etc/resolvconf.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
name_servers=10.0.242.1

2) modifier le fichier /etc/dnsmasq.conf pour indiquer au service dnsmasq la correspondance entre l'IP le domaine labom.lobotomie.org

# Add domains which you want to force to an IP address here.
# The example below send any host in double-click.net to a local
# web-server.
address=/labom.lobotomie.org/10.0.242.1

3) modifier le fichier /etc/hosts au cas où mais à priori pas nécessaire, en ajoutant la ligne :

10.0.242.1 labom.lobotomie.org

4) modifier l'IP du DNS Resolver du réseau Wifi de LaboM

dans l'interface utilisateur de Yunohost, ouvrir l'app Wifi HotSpot (par défaut https://domain.tld/wifiadmin/1). Dans l'onglet "IPv4" du réseau Wifi utilisé pour se connecter à la Brique (à priori le Hotspot 1), modifier l'adrese IP des champs "First DNS Resolver" en indiquant 10.0.242.1 et "Second DNS resolver" en indiquant 80.67.169.12

5) redémarrer dnsmasq

sudo service dnsmasq restart

Installer Letsencrypt pour avoir de jolis certificats https

Ajouter jessie-backports pour installer certbot

sudo nano /etc/apt/sources.list

ajouter :

deb http://ftp.debian.org/debian jessie-backports main

puis

sudo apt-get update
sudo apt-get install certbot -t jessie-backports
cd /etc/yunohost
sudo cp -r certs certs.bak
sudo service nginx stop

on utilise la méthode standalone qui implique que les dns choisis (paramètre -d) pointent bien vers la raspberry (port 80 et 443) et donc votre box internet doit être configurée pour router ces ports vers l'ip de la raspberry

sudo certbot certonly --standalone -d labom.lobotomie.org -d labompad.lobotomie.org
Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/labom.lobotomie.org/fullchain.pem
Your cert will expire on 2016-12-25 ...

Il faut ensuite relier ces certificats générés avec la config (btw, j'ai du recommencer le certbot pour le deuxième domaine, don't know why) :

cd /etc/yunohost/certs/labom.lobotomie.org
sudo ln -sf /etc/letsencrypt/live/labom.lobotomie.org/privkey.pem key.pem
sudo ln -sf /etc/letsencrypt/live/labom.lobotomie.org/fullchain.pem crt.pem
cd /etc/yunohost/certs/labompad.lobotomie.org
sudo ln -sf /etc/letsencrypt/live/labompad.lobotomie.org-0001/privkey.pem key.pem
sudo ln -sf /etc/letsencrypt/live/labompad.lobotomie.org-0001/fullchain.pem crt.pem
sudo chown root:metronome /etc/letsencrypt/live /etc/letsencrypt/archive
sudo chmod g+rx /etc/letsencrypt/live /etc/letsencrypt/archive
sudo service nginx start

Automatiser le renouvellement des certificats

sudo nano /etc/systemd/system/letsencrypt.service
[Unit]
Description=Renews letsencrypt certificates with certbot
After=network.target

[Service]
Type=oneshot
WorkingDirectory=/etc/letsencrypt
ExecStart=/usr/bin/certbot renew
sudo nano /etc/systemd/system/letsencrypt.timer
[Unit]
Description=letsencrypt timer

[Timer]
OnCalendar=daily  
Persistent=true  
Unit=letsencrypt.service

[Install]
WantedBy=basic.target
sudo mkdir /etc/systemd/system/letsencrypt.service.d
sudo nano /etc/systemd/system/letsencrypt.service.d/nginx.conf
[Service]
ExecStartPost=/bin/systemctl reload nginx

Test

date
systemctl restart letsencrypt.service
journalctl -xn

done :

sudo systemctl status letsencrypt.service
● letsencrypt.service - Renews letsencrypt certificates with certbot
   Loaded: loaded (/etc/systemd/system/letsencrypt.service; static)
  Drop-In: /etc/systemd/system/letsencrypt.service.d
           └─nginx.conf
   Active: inactive (dead)

sept. 26 17:54:43 raspberrypi certbot[4681]: -------------------------------------------------------------------------------
sept. 26 17:54:43 raspberrypi certbot[4681]: -------------------------------------------------------------------------------
sept. 26 17:54:43 raspberrypi certbot[4681]: Processing /etc/letsencrypt/renewal/labompad.lobotomie.org-0001.conf
sept. 26 17:54:43 raspberrypi certbot[4681]: -------------------------------------------------------------------------------
sept. 26 17:54:43 raspberrypi certbot[4681]: The following certs are not due for renewal yet:
sept. 26 17:54:43 raspberrypi certbot[4681]: /etc/letsencrypt/live/labompad.lobotomie.org-0001/fullchain.pem (skipped)
sept. 26 17:54:43 raspberrypi certbot[4681]: /etc/letsencrypt/live/labom.lobotomie.org/fullchain.pem (skipped)
sept. 26 17:54:43 raspberrypi certbot[4681]: /etc/letsencrypt/live/labompad.lobotomie.org-0001/fullchain.pem (skipped)
sept. 26 17:54:43 raspberrypi certbot[4681]: No renewals were attempted.
sept. 26 17:54:43 raspberrypi systemd[1]: Started Renews letsencrypt certificates with certbot.

Pour que cela marche, j'ai du copier le contenu de /etc/letsencrypt/renewal $ sudo nano labompad.lobotomie.org-0001.conf dans /etc/letsencrypt/renewal $ sudo nano labompad.lobotomie.org.conf

j'ai fini par générer le certificat en standalone et à nettoyer les 2 fichiers de confs du début du post car le serveur nginx n'arrivait pas à aller chercher les fichiers temporaires tels qu'indiqués dans le tuto

Si le renouvellement automatique n'a pas fonctionné:
Si le renouvellement automatique n'a pas fonctionné, et que vous avez choisi l'installation ci-dessus en mode "standalone", connectez vous sur votre raspberry pi en mode console, puis lancez la commande indiquée dans les détails de recommandations de Certbot (<https://certbot.eff.org/docs/using.html#renewal>).

Dans votre terminal, tapez la commande suivante et le certificat se renouvelle:

sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

Cette commande vous renvoie l'information de renouvellement du certificat (bien sûr, ce n'est pas mon.nomdedomaine.afterix qui va apparaître dans le texte généré, mais votre nom de domaine à vous):

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/mon.nomdedomaine.afterix.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Running pre-hook command: service nginx stop
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for mon.nomdedomaine.afterix
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/mon.nomdedomaine.afterix/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/mon.nomdedomaine.afterix/fullchain.pem (success)
Running post-hook command: service nginx start

Cloner un site web en utilisant Multi_webapp et wget

cd /var/www/webapp_b01/zotero/
sudo wget -r -k -E -np https://www.zotero.org/groups/1.camp/items
-nd pour ne pas créer l'arborescence de répertoire
-np pas remonter dossier parent
-p pour prendre les fichiers prérequis associés

Faire un lien symbolique pour remplacer le index.html par un lien vers la racine du site aspiré

cd /var/www/webapp_b01/zotero/
sudo mv index.html index.bak
sudo ln -s www.zotero.org/groups/1.camp/items.html index.html

Installer LibViz sous flask nginx python

Installer flask

sudo apt install python-virtualenv
cd LibViz
virtualenv venv
source venv/bin/activate
pip install -r requirements.txtt install python-virtualenv
cd LibViz
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

Utiliser uwsgi avec nginx

sudo uwsgi -s /tmp/LibViz.sock --manage-script-name --mount /LibViz=run:app --plugin python

et en même temps mais bizar

sudo chown www-data:www-data /tmp/LibViz.sock

Configurer nginx

sudo nano /etc/nginx/conf.d/labom.lobotomie.org.d/webapp_LibViz.conf

location = /LibViz { rewrite ^ /LibViz/; }
location /LibViz { try_files $uri @LibViz; }
location @LibViz {
  include uwsgi_params;
  uwsgi_pass unix:/tmp/LibViz.sock;
}

Ressources


Vous pouvez aussi contribuer à ce projet ici https://doc.yunohost.org/#/contribute_fr.

Mettre en place un atelier

Chaque participant doit se munir de

- une Raspberry Pi
- une carte SD ou mini sd d'au moins 10 Go et rapide ( au moins pour démarrer le GRUB )
- une alim de 5 volts
- clavier (USB)
- une souris (USB)
- un ordinateur


Celui qui donne l'atelier doit se munir de

- un écran HDMI (pour brancher directement la Pi en cas de problème)
- un dépôt local de Debian type proxy cash
- un switch RJ45 (chaque participant y branchera son ordi et sa Raspberrypi)
- 2 câbles ethernets par participants