Radxa Sata Hat pour Raspberry Pi 4: serveur domestique avec nous, téléchargement cloud et torrent via VPN dans Docker

À la fin de l'année civile, le gouvernement a resserré le verrouillage et imposé un couvre-feu pour les vacances. Il y avait 10 jours de week-end à venir, et j'ai décidé que le moment était venu de m'occuper de la mise en place d'un serveur domestique, dont j'avais l'idée depuis un certain temps.



Partie 1. Sélection des ordinateurs et des composants



Les principales exigences pour un serveur domestique étaient la compacité et la faible consommation d'énergie. En tant qu'ordinateur, j'ai envisagé divers appareils monocarte, j'ai même pensé aux appareils monocarte sur une architecture x64. Les principaux critères de recherche étaient l'excès de RAM de 8 Go, les ports modernes: usb3.0 et Gigabit LAN. L'idée était de tout assembler dans une sorte de boîtier miniATX, en utilisant des interfaces USB-sat pour les disques durs. Je n'aimais pas du tout cette réalisation esthétiquement, et je n'étais pas pressé de la mettre en œuvre. Soudain, je suis tombé sur une baleine américaine pour la 4e framboise des Chinois de Radha.



Si je comprends bien, le chapeau sata lui-même a déjà été présenté il y a quelque temps et même très rapidement épuisé en édition limitée. Mais cette fois, les Chinois ont également proposé une boîte. La structure entière avait l'air très compacte et aussi jolie que mes mains pas si égales ne pourraient jamais le faire moi-même. J'ai cherché sur Google cette boîte, trouvé une critique payante sur YouTube et, en principe, cela me convenait. J'ai décidé de ne pas réfléchir pendant longtemps, car, très probablement, le lot sera rapidement épuisé et l'alimentation électrique a été fournie gratuitement pour la promotion. Une boîte de chapeau sata avec livraison express depuis Shenzhen m'a coûté 125,23 € au moment de l'achat. Le choix de la box a automatiquement réduit le choix des ordinateurs à la 4ème framboise, que j'ai achetée chez Amazon pour 79,97 € pour le modèle avec 8 Go de RAM. Également sur Amazon ont été achetés 2 disques durs VD 2,5 "2 To à 63,81 € chacun,et une carte SD Samsung EVO 120 pour 15,25 € sur aliexpress. Total 348,07 €, je pensais que le lecteur serait intéressé par la question financière.



Tout ce matériel est assemblé très simplement, les chers camarades chinois se sont occupés de tout, un exemple peut être vu dans l'image ci-dessous. J'ai également enregistré quelques courtes vidéos de l'appareil assemblé. Parmi les moments agréables dont je n'étais pas au courant au moment de la commande de l'appareil:



  • le corps est fait d'une seule pièce de métal, peint à l'extérieur avec de la peinture blanche;
  • le fond avec des trous de ventilation est également en métal;
  • vis et écrous de montage: métal (pas de métal, seulement le couvercle supérieur en plastique translucide avec des trous pour un grand ventilateur);
  • chapeau sata de la prochaine révision, et non celui que le vlogger avait sur YouTube, et dispose d'un connecteur de batterie;
  • un petit écran glacé affiche des informations sur l'état du système;
  • un grand ventilateur et un écran de glace fonctionnent en installant le logiciel de Radha, qui est des scripts python, et sont installés en entrant une commande dans le terminal.


image



Par défaut, le ventilateur supérieur dispose de 4 modes de fonctionnement en fonction de la température du processeur, qui diffèrent par l'intensité de rotation et le bruit produit: au niveau 1 c'est presque inaudible, le niveau 2 est audible, 3-4 est trop bien audible. Pour cela, en fait, les scripts python sont responsables.







En général, j'étais satisfait de cet appareil, mais j'avais un commentaire. Le kit utilise un écran vitré en cours d'exécution, qui peut être facilement commandé auprès d'Alishechka, mais l'écran est soudé à la carte, les Chinois n'ont pas besoin d'utiliser le connecteur FPC / FCC sur la carte. Cela simplifierait grandement le remplacement de l'écran de glace en cas de burnout, par exemple.



2.



Eh bien, tout est assemblé, commençons à configurer le logiciel. Je n'inonderai pas le copier-coller, donc des points généraux seront présentés par des liens vers hauta à partir de la ligne de recherche, je vais en sauter quelques-uns, mais vous pouvez vous attarder sur les pièges plus en détail.



J'ai choisi le système d'exploitation ubuntu server 20.04.1, un merveilleux guide pour installer Kanonikl écrit vous-même. Ensuite, nous installons les logiciels de Radha en fonction de leur mana . Ici, il y avait un piège numéro 1. Le fait est que pour certains besoins de torrenting, je devais utiliser VPN, mais mon fournisseur VPN ne prend pas en charge IPv6. Lorsque j'ai configuré openvpn pour mon fournisseur, j'ai constaté que mon anonymat, disons, passe précisément par IPv6. Bon, d'accord, au niveau du système, IPv6 peut être désactivé dans Ubuntu tout simplement.



De quelle façon précisément
sysctl



$ sudo nano /etc/sysctl.conf
      
      









	net.ipv6.conf.all.disable_ipv6=1
	net.ipv6.conf.default.disable_ipv6=1
	net.ipv6.conf.lo.disable_ipv6=1
      
      





:



$ sudo sysctl -p
      
      





, 6 , :



$ sudo nano /etc/rc.local
      
      





:



	#!/bin/bash
	# /etc/rc.local
	/etc/sysctl.d
	/etc/init.d/procps restart
	exit 0
      
      





:



$ sudo chmod 755 /etc/rc.local
      
      







Mais ensuite, l'inattendu s'est produit, le grand ventilateur de la boîte a cessé de fonctionner du tout.

Ayant exclu la possibilité d'une panne matérielle, j'ai commencé à chercher une cause logicielle. La sortie d'état du service rockpi-sata affichait des erreurs liées au script python fan.py:



ubuntu@ubuntu:~$ sudo service rockpi-sata status
● rockpi-sata.service - Rockpi SATA Hat
Loaded: loaded (/lib/systemd/system/rockpi-sata.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-12-25 17:16:07 CET; 11min ago
Main PID: 1879 (python3)
Tasks: 4 (limit: 9252)
CGroup: /system.slice/rockpi-sata.service
├─1879 /usr/bin/python3 /usr/bin/rockpi-sata/main.py on
├─2896 /usr/bin/python3 /usr/bin/rockpi-sata/main.py on
├─2897 /usr/bin/python3 /usr/bin/rockpi-sata/main.py on
└─2898 /usr/bin/python3 /usr/bin/rockpi-sata/main.py on

Dec 25 17:16:57 ubuntu python3[2899]: self._target(*self._args, **self._kwargs)
Dec 25 17:16:57 ubuntu python3[2899]: File “/usr/bin/rockpi-sata/fan.py”, line 81, in running
Dec 25 17:16:57 ubuntu python3[2899]: change_dc(get_dc())
Dec 25 17:16:57 ubuntu python3[2899]: File “/usr/bin/rockpi-sata/fan.py”, line 75, in change_dc
Dec 25 17:16:57 ubuntu python3[2899]: gpio.hardware_PWM(12, 25000, dc * 10000)
Dec 25 17:16:57 ubuntu python3[2899]: File “/usr/local/lib/python3.8/dist-packages/pigpio.py”, line 2044, in hardware_PWM
Dec 25 17:16:57 ubuntu python3[2899]: return _u2i(_pigpio_command_ext(
Dec 25 17:16:57 ubuntu python3[2899]: File “/usr/local/lib/python3.8/dist-packages/pigpio.py”, line 1062, in _pigpio_command_ext
Dec 25 17:16:57 ubuntu python3[2899]: sl.s.sendall(ext)
Dec 25 17:16:57 ubuntu python3[2899]: AttributeError: ‘NoneType’ object has no attribute ‘sendall’
      
      





Ce qui n'a rien d'intéressant à part la méthode d'initialisation GPIO. Pour cela, une classe entière y est écrite:



class MockPigpio:
    @classmethod
    def pi(cls):
        try:
            host = misc.check_output("netstat -l | grep -o '\S*:8888' | tr -d ':8888'")
            gpio = pigpio.pi(host=host)
        except Exception:
            gpio = cls()
        return gpio

    def __init__(self):
        syslog.syslog('PWM of pigpio is not available. Use on/off to control the fan.')
        syslog.syslog('If you use pre-release kernel, please go back to stable release.')

    def hardware_PWM(self, pin, _, dc):
        misc.set_mode(pin, bool(dc))

gpio = MockPigpio.pi()
      
      





Je me suis demandé à quoi sert cette valeur pour initialiser l'hôte, qui est affichée par la commande netstat -l | grep -o '\ S *: 8888' | tr -d ': 8888'?



ipv6-localhost
      
      





Si IPv6 est désactivé, la commande génère une ligne vide et le script ne fonctionne pas. Franchement, j'ai parcouru le long chemin au début. J'ai regardé dans le module python pigpio.py, dans lequel l'initialisation de l'hôte a été décrite en détail, j'ai découvert que, en principe, la méthode pigpio.pi () ne nécessite aucun argument. Ayant essayé sans succès les options pour appeler cette méthode sans argument, avec l'argument lcoalhost et d'autres options dont je ne me souviens plus, à l'intérieur du script fan.py, j'ai réalisé que je ne suis pas plus intelligent que les auteurs, et j'ai choisi la voie la plus simple. Le fait est que le module PIGPIO peut être appelé en mode IPv4, pour cela il vous suffit d'éditer un fichier:



$ sudo nano /lib/systemd/system/pigpiod.service
      
      





Et fixez le paramètre ExecStart à la valeur suivante



ExecStart=/usr/local/bin/pigpiod -l -m -n 127.0.0.1 -p 8888
      
      





Maintenant, la commande netstat -l | grep -o '\ S *: 8888' | tr -d ': 8888' imprime:



localhost
      
      





et le ventilateur tourne!



Partie 3. Séparation du trafic



De plus, un raid de type 1, samba, openvpn, transmission démon et killswitch pour ufv ont été mis en place. La description de ces procédures, je pense que le lecteur moyen est capable de google par lui-même.



Les performances de l'appareil résultant sont en principe normales. Bien que je ne comprends pas où la vitesse diminue lors de la copie. Voici un exemple de copie d'un papa contenant 39 épisodes d'anime d'une taille totale d'environ 40 Go.



image



Et voici un exemple de téléchargement d'un gros fichier.



image



On peut voir que le système peut utiliser la totalité de la ressource réseau gigabit quand il le souhaite. Je n'ai pas encore compris les baisses de vitesse de copie.



Le deuxième écueil ne s'applique pas au chapeau sata, mais, en fait, au serveur Linux en tant qu'objet de culture matérielle. La tâche était que le serveur soit utilisé pour différentes tâches: il y aura un serveur Web (cloud), sur lequel je vais frapper de l'extérieur, et une pompe de flux de bits non sélectionnée via vpn. Le problème s'est avéré être que je devais en quelque sorte séparer le trafic pour que tout fonctionne en parallèle. Ma première pensée a été de mettre en place un pare-feu. J'ai utilisé les règles suivantes:



$ sudo ufw default deny incoming
$ sudo ufw default deny outgoing
$ sudo ufw allow in on eth0 from 192.168.178.1
$ sudo ufw allow out on eth0 to 192.168.178.1
$ sudo ufw allow in on eth0 from 192.168.178.20
$ sudo ufw allow out on eth0 to 192.168.178.20
$ sudo ufw allow in on eth0 from any to any port 22,443 proto tcp
$ sudo ufw allow out on eth0 from any to any port 22,443 proto tcp
$ sudo ufw allow in on eth0 from any to any port 1194 proto udp
$ sudo ufw allow out on eth0 from any to any port 1194 proto udp
$ sudo ufw allow out on tun0 from any to any
$ sudo ufw allow in on tun0 from any to any
      
      





Croire naïvement que tout fonctionnera bien. L'idée était que peut-être le pare-feu redirigera toutes les connexions via tun0, à l'exception de certaines via ez0, que j'utilise sur le réseau local, et quelques ports dont j'ai besoin pour frapper le serveur de l'extérieur. Cette configuration fonctionne correctement sur un réseau local ou si vpn est désactivé: aucune connexion autre que celles autorisées ne passe. Lorsque vpn est activé, il est impossible d'établir une connexion à l'extérieur. Les paquets arrivent, mais les réponses ne sont pas redirigées via ez0, mais elles sont néanmoins envoyées via tun0. J'ai passé 2 jours mais je ne savais toujours pas comment le réparer, puis j'ai décidé d'essayer docker, car le conteneur dont j'avais besoin est déjà là.



C'était ma première expérience avec docker. C'était difficile pour moi, je ne comprenais pas par où commencer, quelle est la différence entre docker et docker-compose, quel est le contenu du git du lien, quelle est l'image, quel est le conteneur, je ne comprends toujours pas comment j'ai réussi à construire ce conteneur localement et ce que le docker compose téléchargé depuis Internet, mais cela a fonctionné.



Après avoir décompressé le référentiel, vous devez éditer le fichier docker-compose.yml. Et changez son contenu en:



version: '2'
services:
 transmission:
  image: haugene/transmission-openvpn
  container_name: vpntrans
  cap_add:
    - NET_ADMIN
  devices:
    - /dev/net/tun
  restart: always
  ports:
    - "9092:9091"
  dns:
    - 8.8.8.8
    - 8.8.4.4
#  sysctls:
    - net.ipv6.conf.all.disable_ipv6=1
  volumes:
    - /etc/localtime:/etc/localtime:ro
    - /mnt/raid0/downloads/:/data
  environment:
    - OPENVPN_PROVIDER=SURFSHARK
    - OPENVPN_CONFIG=mk-skp_udp
    - OPENVPN_USERNAME=*your username*
    - OPENVPN_PASSWORD=*your password*
    - OPENVPN_OPTS=--inactive 3600 --ping 10 --ping-exit 60
    - LOCAL_NETWORK=192.168.178.0/24
# proxy:
    - WEBPROXY_ENABLED=false
    - TRANSMISSION_PORT_FORWARDING_ENABLED=true
    - TRANSMISSION_PEER_PORT=51413
    - PUID=1000
    - PGID=100
      
      





Dans cette config, si vous souhaitez l'utiliser pour vos besoins, vous devrez faire attention aux valeurs du port externe (pour le conteneur), au chemin de votre port où le démon de transmission enregistrera les données, et où vous pourrez modifier ses paramètres, entrez les paramètres de votre réseau local. Vous devrez également configurer votre fournisseur VPN à partir de la liste . J'utilise un surfshark, la valeur du paramètre OPENVPN_CONFIG détermine le choix de la configuration (en fait, cette valeur est le nom du fichier de configuration requis) * fichier .ovpn du serveur spécifique auquel vous souhaitez vous connecter. Dans cet exemple, le serveur se trouve en République de Macédoine du Nord.



Ensuite, nous construisons et exécutons le conteneur avec nos paramètres:



$ sudo docker-compose up
      
      





Si tout se passe bien, vous verrez à la fin du journal du client openvpn un établissement de connexion réussi. Eh bien ou pas, vous ne savez jamais que vous utilisez un autre fournisseur VPN qui nécessite des heures de travail supplémentaires. Mais si tout va bien, vous pouvez appuyer sur cntrl-s et démarrer le conteneur en tant que processus en arrière-plan. À propos, le conteneur sait déjà comment se démarrer au démarrage du système et redémarrer en cas d'erreur.



$ sudo docker start vpntrans
      
      





Pour calmer la paranoïa, vous pouvez accéder à la console à l'intérieur du conteneur:



$ sudo docker exec -ti vpntrans /bin/bash
      
      





Et vérifiez l'adresse IP publique:



$ curl ifconfig.co/json
      
      





Si tout s'est bien passé, la conclusion devrait être la suivante:



image



Néanmoins, un tel test est peu utile pour calmer la paranoïa très balancée, alors j'ai utilisé un requin et j'ai regardé les connexions tout en téléchargeant un torrent avec une distribution Linux populaire, disons, Ubunta. Après avoir exclu de la sortie les connexions non liées aux périphériques sur le réseau local, le serveur VPN, ainsi que certaines diffusions automatiques, rien de suspect ne s'est produit lors du téléchargement de l'image ubuntu:



sudo tshark -i eth0 | grep -v "192.168.178.1" | grep -v "192.168.178.20" | grep -v "185.225.28.109" | grep -v "AVMAudio" | grep -v "SSDP" | grep -v "MDNS" | grep -v "LLMNR"
      
      





image



Mais que se passe-t-il si openvpn perd sa connexion ou si le service s'arrête soudainement? L'utilitaire supérieur s'exécute à l'intérieur du conteneur, sa sortie ressemble à ceci:



image

Tuez le processus openvpn:



$ kill -9 6
      
      





Après cela, le conteneur a redémarré. J'ai lu plus tard quelque part sur les forums que le conteneur est configuré de telle manière que si la connexion avec openvpn est perdue ou que ce processus se termine, le conteneur est simplement redémarré. Tel est le killswitch. J'étais satisfait.



Partie 4. Cloud



J'ai sélectionné le cloud NextCloud et je l'ai installé un guide à la fois . La principale différence entre ma configuration est que j'ai utilisé d'autres navets apache et pkhp:



$ sudo add-apt-repository ppa:ondrej/apache2
$ sudo add-apt-repository ppa:ondrej/php
      
      





Après avoir configuré NextCloud, je recommande de vérifier les avertissements dans le panneau d'administration et de les corriger.



image



Corrections
. . :



$ cd /var/www/nextcloud/
$ sudo -u www-data php occ db:add-missing-indices
      
      





:



$ sudo apt install php-bcmath php-imagick
      
      





, . - , , . :



$ sudo apt install redis-server php-memcached memcached php-apcu -y
      
      





:



$ sudo systemctl start redis-server
$ sudo systemctl enable redis-server
$ sudo systemctl start memcached
$ sudo systemctl enable memcached
      
      





:



$ sudo nano /etc/redis/redis.conf
      
      





:



	port 0
	unixsocket /var/run/redis/redis.sock
	unixsocketperm 700
      
      





:



$ sudo usermod -aG redis www-data
      
      





, :



$ sudo nano /var/www/nextcloud/config/config.php
      
      





);



'memcache.local' => '\OC\Memcache\APCu',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' =>
   array (
    'host' => '/var/run/redis/redis.sock',
    'port' => 0,
    'timeout' => 0,
    'password' => '',
    'dbindex' => 0,
),
      
      





:



$ sudo nano /etc/php/7.4/apache2/php.ini
      
      





	opcache.enable=1
	opcache.enable_cli=1
	opcache.interned_strings_buffer=8
	opcache.max_accelerated_files=10000
	opcache.memory_consumption=128
	opcache.save_comments=1
	opcache.revalidate_freq=1
      
      





:



$ sudo systemctl restart apache2
      
      







Le cloud peut théoriquement être connecté en tant que lecteur réseau via WebDAV, mais pour une raison quelconque pas sous Windows 10. En utilisant l'utilitaire Cyberduck, j'ai testé le fonctionnement du cloud sur un réseau local. Comme vous pouvez le voir dans les captures d'écran ci-dessous, les vitesses de téléchargement sur le cloud atteignent 12 Mo / s acceptables, et les téléchargements depuis le cloud atteignent 35 Mo / s. Les données de vitesse ont été obtenues avec le cryptage activé dans le cloud avec la clé pca4096.



image



image



Partie 5. Consommation d'énergie



Au départ, je voulais donner à ce serveur une semaine de fonctionnement afin d'apporter des statistiques à l'aide du wattmètre. Mais, malheureusement, je n'ai pas compris comment configurer correctement ce wattmètre, je vais donc donner une image avec les données de l'indicateur. Comme vous pouvez le voir, en mode veille, le système consomme 8,5 W d'énergie, et pendant la synchronisation active avec le cloud (un dossier contenant des données personnelles d'environ 200 Go) jusqu'à 16,88 W. Des statistiques détaillées permettraient de calculer la valeur moyenne de la consommation électrique par jour, mais du fait de son absence et dans l'hypothèse où le serveur est inactif la plupart du temps, je prends 10 W pour la valeur moyenne de la consommation électrique en un coup d'œil, ce qui donne:



Aux prix actuels en 0,31 € pour 1 kWh, le montant des frais de maintenance du serveur par mois sera d'environ 2,23 €, ce qui ne devrait pas avoir d'incidence importante sur ma consommation d'énergie moyenne. Une fois que nous avons compris la consommation et les coûts, je propose de faire un petit bilan des investissements financiers et de comparer avec les offres de serveurs virtuels du marché. Malheureusement, je n'ai pas obtenu de comparaison équivalente, car, si je comprends bien, le marché des serveurs virtuels offre102430=7,2







image



soit des serveurs de performance, soit des serveurs de stockage. Supposons que le serveur domestique résultant présente des performances comparables à celles des serveurs de stockage et analysez les prix actuels. Comme vous pouvez le voir sur le lien , la location d'un serveur avec 2 To d'espace disque coûtera 100 € par an. La facture annuelle d'électricité de mon mini-serveur domestique sur la 4ème framboise devrait coûter environ 27,16 €. Avec 348,07 € dépensés, il s'avère que le retour sur investissement du serveur domestique prendra:



que long, et le lecteur aura droiten principe,décidé qu'il était paspeine. 348,07/(100/27,16/)=4,78







Considérons une autre option avec une mise à niveau vers 4 To d'espace disque. Dans le cas d'un serveur domestique, j'achèterais 2 disques supplémentaires de 2 To chacun, ce qui, aux prix actuels sur Amazon, s'élèverait à 127,62 € supplémentaires. La consommation des serveurs devra augmenter et, disons, sera en moyenne de 18 watts. Cela donnera une facture annuelle d'électricité de 48,88 €. Comparons maintenant avec le coût d'un serveur de stockage 4 To (340 € par an) et estimons le retour sur investissement:



quel temps, et ne semble plusinvestissement controversé. 475,69/(340/48,88/)=1,63







Conclusion



Dans cet article, nous avons découvert un magnifique chapeau sata pour la 4ème framboise et une jolie baleine basée sur celui-ci pour un serveur domestique. Nous avons examiné les performances de ce système à l'aide de l'exemple de copie de fichiers sur le réseau, ainsi que les performances du cloud NextCloud s'exécutant sur ce serveur. Les problèmes de consommation d'énergie, de coût et de dépenses pour ce serveur ne sont pas non plus laissés de côté. Merci d'avoir lu ce matériel. Les commentaires critiques sur les solutions présentées sont les bienvenus.



En particulier, je voudrais demander au lecteur de partager son expérience sur les questions suivantes:



  1. ZFS?
  2. La vitesse de copie réseau diminue, que faire?
  3. Apache ou tous les mêmes nginks?
  4. Quel oups choisir?
  5. Pourquoi Docker contourne-t-il les règles VPN?



All Articles