Parte 1. Selección de computadoras y componentes
Los principales requisitos para un servidor doméstico eran compacidad y bajo consumo de energía. Como computadora, consideré varios dispositivos de placa única, incluso pensé en dispositivos de placa única en arquitectura x64. Los principales criterios de búsqueda fueron el exceso de RAM de 8 GB, puertos modernos: usb3.0 y gigabit LAN. La idea era colocarlo todo en una especie de caja miniATX, utilizando interfaces usb-sat para discos duros. Este descubrimiento no me gustó estéticamente y no tenía prisa por implementarlo. De repente me encontré con una ballena estadounidense por la cuarta frambuesa de los chinos de Radha.
Según tengo entendido, el sombrero sata en sí ya se presentó hace algún tiempo e incluso se agotó muy rápidamente en una edición limitada. Pero esta vez, los chinos también ofrecieron una caja. Toda la estructura se veía muy compacta y tan bonita como mis brazos no muy rectos nunca podrían hacerlo yo mismo. Busqué en Google este cuadro, encontré una reseña paga en YouTube y, en principio, me pareció bien. Decidí no pensar durante mucho tiempo, porque, lo más probable, el lote se agotará rápidamente y la fuente de alimentación se entregó sin cargo para la promoción. Una caja de sombrero sata con envío urgente desde Shenzhen me costó 125,23 € en el momento de la compra. La elección de la caja redujo automáticamente la elección de las computadoras a la cuarta frambuesa, que compré en Amazon por 79,97 € para el modelo con 8 GB de RAM. También en Amazon se compraron 2 discos duros VD 2.5 ”2 TB a 63,81 € cada uno,y una tarjeta SD Samsung EVO 120 por 15,25 € en aliexpress. Total 348,07 €, pensé que el lector estaría interesado en la cuestión financiera.
Todo esto se ensambla de manera muy simple, los queridos camaradas chinos se encargaron de todo, un ejemplo se puede ver en la imagen a continuación. También grabé un par de videos cortos del dispositivo ensamblado. De los momentos agradables de los que no tenía conocimiento a la hora de encargar el dispositivo:
- la carrocería es de una sola pieza de metal, pintada en el exterior con pintura blanca;
- el fondo con orificios de ventilación también es metálico;
- tornillos y tuercas de montaje: metal (no metal, solo la cubierta superior de plástico translúcido con orificios para un ventilador grande);
- sata sombrero de la próxima revisión, y no la que tenía el vlogger en YouTube, y tiene conector de batería;
- una pequeña pantalla helada muestra información sobre el estado del sistema;
- un ventilador grande y una pantalla de hielo funcionan instalando el software de Radha, que son scripts de Python, y se instala ingresando un comando en la terminal.
Por defecto, el ventilador superior tiene 4 modos de funcionamiento en función de la temperatura del procesador, que se diferencian en la intensidad de rotación y el ruido producido: en el nivel 1 es casi inaudible, el nivel 2 es audible, 3-4 es audible demasiado bien. De esto, de hecho, los scripts de Python son responsables.
En general, estaba satisfecho con este dispositivo, pero tenía un comentario. El kit utiliza una pantalla acristalada en funcionamiento, que se puede pedir fácilmente a Alishechka, pero la pantalla está soldada a la placa, los chinos no necesitan usar el conector FPC / FCC en la placa. Esto simplificaría enormemente el reemplazo de la pantalla de hielo en caso de quemado, por ejemplo.
2.
Bueno, todo está ensamblado, comencemos a configurar el software. No voy a copiar y pegar, por lo que los puntos generales se presentarán mediante enlaces a hauta desde la línea de búsqueda, omitiré algunos, pero puede detenerse en las trampas con más detalle.
Elegí el sistema operativo ubuntu server 20.04.1, una guía maravillosa para instalar Kanonikl escrita por ti mismo. A continuación, instalamos el software de Radha según su maná . Aquí había un error número 1. El hecho es que para ciertas necesidades de torrents necesitaba usar VPN, pero mi proveedor de VPN no es compatible con IPv6. Cuando configuré openvpn para mi proveedor, descubrí que mi anonimato, digamos, fluye precisamente a través de IPv6. Bueno, está bien, a nivel de sistema, IPv6 se puede desactivar en Ubuntu de forma bastante sencilla.
Cómo exactamente
sysctl
:
, 6 , :
:
:
$ 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
Pero luego sucedió lo inesperado, el gran ventilador de la caja dejó de funcionar.
Habiendo excluido la posibilidad de una falla de hardware, comencé a buscar una causa de software. La salida de estado del servicio rockpi-sata mostraba errores relacionados con el script de 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’
Lo cual no es nada interesante excepto por el método de inicialización GPIO. Para esto, se escribe una clase completa allí:
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()
Me preguntaba qué valor se usa para inicializar el host, que se muestra con el comando netstat -l | grep -o '\ S *: 8888' | tr -d ': 8888'?
ipv6-localhost
Si IPv6 está desactivado, el comando genera una línea vacía y el script no funciona. Francamente, fui por el camino más largo al principio. Busqué en el módulo python pigpio.py, en el que se describía en detalle la inicialización del host, y descubrí que, en principio, el método pigpio.pi () no necesita ningún argumento. Después de haber probado sin éxito las opciones para llamar a este método sin un argumento, con el argumento lcoalhost y otras opciones que ya no recuerdo, dentro del script fan.py, me di cuenta de que no era más inteligente que los autores y fui por el camino fácil. El caso es que el módulo PIGPIO se puede llamar en modo IPv4, para ello solo es necesario editar un archivo:
$ sudo nano /lib/systemd/system/pigpiod.service
Y arregle el parámetro ExecStart al siguiente valor
ExecStart=/usr/local/bin/pigpiod -l -m -n 127.0.0.1 -p 8888
Ahora el comando netstat -l | grep -o '\ S *: 8888' | tr -d ': 8888' imprime:
localhost
¡y el ventilador está funcionando!
Parte 3. Separación del tráfico
Además, se configuraron raid type 1, samba, openvpn, Transmission Demon y Killswitch para ufv. La descripción de estos procedimientos, creo que el lector promedio es capaz de buscar en Google por su cuenta.
El rendimiento del dispositivo resultante es, en principio, normal. Aunque no entiendo dónde cae la velocidad al copiar. Aquí hay un ejemplo de una copia de un papá que contiene 39 episodios de anime con un tamaño total de aproximadamente 40 GB.
Y aquí hay un ejemplo de cómo descargar un archivo grande.
Se puede ver que el sistema puede utilizar todo el recurso de red gigabit cuando lo desee. Todavía no me he ocupado de las reducciones en la velocidad de copia.
El segundo escollo no se aplica al sata hat, sino, de hecho, al servidor Linux como objeto de cultura material. La tarea era que el servidor se usara para diferentes tareas: habrá un servidor web (nube), al que llamaré desde afuera, y una bomba de flujo de bits no seleccionada a través de vpn. El problema resultó ser que necesitaba separar de alguna manera el tráfico para que todo funcionara en paralelo. Mi primer pensamiento fue instalar un firewall. Usé las siguientes reglas:
$ 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
Creer ingenuamente que todo funcionará bien. La idea era que tal vez el firewall redirigiera todas las conexiones a través de tun0, excepto algunas a través de ez0, que uso en la red local, y un par de puertos que necesito llamar al servidor desde el exterior. Esta configuración funciona bien en una red local o si vpn está deshabilitado: no se realizan otras conexiones que las permitidas. Cuando la VPN está activada, es imposible establecer una conexión con el exterior. Los paquetes llegan, pero las respuestas no se redirigen a través de ez0, sino que siguen siendo una varilla a través de tun0. Pasé 2 días pero aún no sabía cómo solucionarlo, y luego decidí probar Docker, ya que el contenedor que necesitaba ya está allí.
Esta fue mi primera experiencia con Docker. Fue difícil para mí, no entendía por dónde empezar, cuál es la diferencia entre docker y docker-compose, cuál es el contenido del git desde el enlace, cuál es la imagen, cuál es el contenedor, todavía no entiendo cómo logré construir este contenedor localmente y lo que la ventana acoplable compuso descargado de Internet, pero esto funcionó.
Después de descomprimir el repositorio, debe editar el archivo docker-compose.yml. Y cambie su contenido a:
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
En esta configuración, si desea usarlo para sus necesidades, deberá prestar atención a los valores del puerto externo (para el contenedor), la ruta a su puerto, en el que el demonio de transmisión guardará datos, y donde puede editar su configuración, ingrese los parámetros de su red local. También deberá configurar su proveedor de VPN de la lista . Yo uso un surfshark, el valor del parámetro OPENVPN_CONFIG determina la elección de la configuración (de hecho, este valor es el nombre del archivo de configuración requerido) * archivo .ovpn del servidor específico al que desea conectarse. En este ejemplo, el servidor está en la República de Macedonia del Norte.
A continuación, construimos y ejecutamos el contenedor con nuestra configuración:
$ sudo docker-compose up
Si todo va bien, verá al final del registro del cliente openvpn sobre el establecimiento exitoso de la conexión. Bien o no, nunca se sabe que utiliza otro proveedor de VPN que requiere horas de trabajo adicionales. Pero si todo está bien, puede presionar cntrl-s e iniciar el contenedor como un proceso en segundo plano. Por cierto, el contenedor ya sabe cómo iniciarse al inicio del sistema y reiniciarse en caso de error.
$ sudo docker start vpntrans
Para calmar la paranoia, puede ir a la consola dentro del contenedor:
$ sudo docker exec -ti vpntrans /bin/bash
Y verifique la dirección IP pública:
$ curl ifconfig.co/json
Si todo salió bien, la conclusión debería ser así:
Sin embargo, tal prueba es de poca utilidad para calmar la paranoia muy oscilante, así que usé un tiburón y miré las conexiones mientras descargaba un torrent con alguna distribución popular de Linux, digamos, ubunta. Habiendo excluido de la salida las conexiones no relacionadas con los dispositivos en la red local, el servidor vpn, así como algunas transmisiones automáticas, no sucedió nada sospechoso durante la descarga de la imagen de 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"
Pero, ¿qué sucede si openvpn pierde su conexión o el servicio se detiene repentinamente? La utilidad superior se está ejecutando dentro del contenedor, su salida se parece a esto:
Elimine el proceso openvpn:
$ kill -9 6
Después de eso, el contenedor se reinició. Más tarde leí en algún lugar de los foros que el contenedor está configurado de tal manera que si se pierde la conexión a openvpn o este proceso finaliza, el contenedor simplemente se reinicia. Tal es la bruja asesina. Yo estaba satisfecho.
Parte 4. Nube
Seleccioné la nube NextCloud y la instalé una guía a la vez . La principal diferencia entre mi configuración es que usé otros nabos apache y php:
$ sudo add-apt-repository ppa:ondrej/apache2 $ sudo add-apt-repository ppa:ondrej/php
Después de configurar NextCloud, recomiendo verificar las advertencias en el panel de administración y corregirlas.
Arreglos
. . :
:
, . - , , . :
:
:
:
:
, :
);
:
:
$ 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
En teoría, la nube se puede conectar como una unidad de red a través de WebDAV, pero por alguna razón no en Windows 10. Con la utilidad Cyberduck, probé el funcionamiento de la nube en una red local. Como puede ver en las capturas de pantalla a continuación, las velocidades de carga en la nube alcanzan los 12 MB / s aceptables y las cargas en la nube alcanzan los 35 MB / s decentes. Los datos de velocidad se obtuvieron con el cifrado habilitado en la nube con la clave pca4096.
Parte 5. Consumo de energía
Inicialmente, quería darle a este servidor una semana para que se ejecutara con el fin de traer estadísticas usando el medidor de potencia. Pero, desafortunadamente, no he descubierto cómo configurar correctamente este medidor de potencia, por lo que daré una imagen con los datos del indicador. Como puede ver, en modo inactivo, el sistema consume 8.5 W de energía, y durante la sincronización activa con la nube (una carpeta con datos personales de aproximadamente 200 GB de tamaño) hasta 16.88 W. Las estadísticas detalladas nos permitirían calcular el valor promedio del consumo de energía por día, pero debido a su ausencia y suponiendo que el servidor está inactivo la mayor parte del tiempo, tomo 10 W para el valor promedio del consumo de energía de un vistazo, lo que da:
A precios actuales en 0,31 € por 1 kWh, el importe de los costes de mantenimiento del servidor por mes será de unos 2,23 €, lo que no debería afectar mucho en mi consumo medio de energía. Una vez que averiguamos el consumo y los costos, propongo realizar una pequeña evaluación de las inversiones financieras y compararlas con las ofertas de servidores virtuales en el mercado. Desafortunadamente, no obtuve una comparación equivalente porque, según tengo entendido, el mercado de servidores virtuales ofrece
ya sea servidores de rendimiento o servidores de almacenamiento. Suponga que el servidor doméstico resultante tiene un rendimiento comparable al de los servidores de almacenamiento y analice los precios actuales. Como puede ver en el enlace , alquilar un servidor con 2 TB de espacio en disco costará 100 € al año. La factura anual de la luz del miniservidor de mi casa en la cuarta frambuesa debería costar unos 27,16 €. Con 348,07 € gastados, resulta que la amortización del servidor doméstico se llevará a:
que de largo, y el lector será el adecuado en principio, decidido que no valía la pena.
Consideremos otra opción con una actualización a 4 TB de espacio en disco. En el caso de un servidor doméstico, compraría 2 discos adicionales de 2 TB cada uno, que a precios actuales en Amazon suman 127,62 € adicionales. El consumo del servidor tendrá que crecer y, digamos, tendrá una media de 18 vatios. Esto dará una factura de luz anual de 48,88 €. Ahora comparemos con el costo de un servidor de almacenamiento de 4 TB (€ 340 por año) y estimemos el retorno de la inversión:
lo que un corto período de tiempo, y ya no se ve la inversión controvertido.
Conclusión
En esta publicación aprendimos sobre un maravilloso sombrero sata para la cuarta frambuesa y sobre una linda ballena basada en él para un servidor doméstico. Observamos el rendimiento de este sistema utilizando el ejemplo de copia de archivos a través de la red, así como el rendimiento de la nube NextCloud que se ejecuta en este servidor. Las cuestiones de consumo de energía, costes y gastos de este servidor tampoco quedan fuera. Gracias por leer este material. Los comentarios críticos sobre las soluciones presentadas son bienvenidos.
En particular, me gustaría pedirle al lector que comparta su experiencia sobre los siguientes temas:
- ZFS?
- Disminuye la velocidad de copia en red, ¿qué hacer al respecto?
- Apache o es nginks?
- ¿Qué uy elegir?
- ¿Por qué Docker elude las reglas de VPN?