Servidor privado y de bajo consumo de backups
Configurar un backup de nuestros archivos que sea seguro, de gran almacenamiento y de poco consumo debería ser una prioridad para cualquier persona, es por ello que en este post muestro cómo configurar un servidor usando NixOS que sea capaz de sincronizarse con tus equipos para realizar un backup periódico, apagándose después de realizarlo para aumentar la seguridad del sistema.
¿Por qué NixOS?
NixOS es un sistema operativo UNIX que permite definir todos sus programas, utilidades y servicios en un archivo de configuración declarativo, idempotente y centralizado. Gracias a esto podremos crear un único archivo de configuración que podremos guardar en caso de trasladar nuestras operaciones a cualquier otro ordenador.
No obstante, todo lo que aquí se explica se podría trasladar a cualquier otro servidor UNIX, ya sea manualmente o mediante una herramienta de configuración declarativa como Ansible.
WOL (Wake On LAN)
Si nuestro equipo está funcionando 24/7 tendremos que:
- Pros:
- Sincronizaciones continuas: Nuestro servidor hará backups todo el tiempo, lo que nos permitirá que, en caso de que nuestro servidor principal falle, este servidor secundario tenga la última versión posible de los datos almacenados.
- Disponibilidad: Nuestro servidor estará accesible mediante SSH constantemente, lo que nos permitirá modificarlo en cualquier momento e incluso correr otros servicios que si requieran de una disponibilidad constante.
- Cons:
- Consumo: Si nuestro equipo está constantemente conectado, esta perdiendo energía de forma constante, lo cual supone un gasto energético considerable.
- Seguridad: El equipo más seguro que existe es aquel que está apagado, es imposible para un tercero acceder a un equipo que no tiene corriente.
- Desgaste: Un equipo encendido 24/7 tiene un mayor desgaste que uno que solo funciona un rato al día.
Es por ello que he decidido que este equipo de sincronización solo funcionará mientras uno de mis equipos esté activo. Con esto en mente he configurado el equipo para funcionar con el sistema Wake On LAN (WOL), el cual permite a la placa base escuchar por uno de sus puertos RJ45 a un “paquete mágico”. Si en algún momento se lee este paquete mágico el equipo se encenderá. Esto se puede configurar en la configuración de nix de la siguiente forma:
1networking = {
2 interfaces = {
3 ens3 = {
4 wakeOnLan.enable = true;
5 };
6 };
7 firewall = {
8 allowedUDPPorts = [ 9 ];
9 };
10};Con esto nuestro equipo podrá ser encendido de forma remota si cualquier máquina que esté en su red local manda:
wakeonlan -i 192.168.0.xxx { link/ether }Podremos añadir esta instrucción en un cronjob en todas las máquinas que se deseen sincronizar, de forma que, si alguna está online y en su red local, sincronizará sus datos con nuestro servidor.
Apagados automatizados
Ahora encender nuestro servidor de forma automática, pero, ¿Cómo lo apagamos? Para conseguir esto se podría crear un pequeño cronjob que realizara este apagado, pero, ¿y si lo eatamos usando? Es por ello que he creado un cronjob que corre el siguiente script BASH:
1{ config, pkgs, ... }:
2
3let
4 turnOffNoSessions = pkgs.writeShellScript "turn-off-no-sessions" ''
5 # Exit if any user is logged in
6 if who | grep .; then
7 exit 0
8 fi
9
10 # Otherwise shut down
11 shutdown -h now
12 '';
13in
14{
15 ...
16}Este script comprueba que no exista ninguna sesión SSH activa y si es el caso apaga el servidor. Este cronjob podrá habilitarse en NixOS de la siguiente forma:
1 services.cron = {
2 enable = true;
3 systemCronJobs = [
4 "*/5 * * * * root ${turnOffNoSessions}"
5 ];
6 };Sincronización
Para la sincronización existen varias posibles opciones. En primer lugar el mismo script que enciende la máquina de sincronización mediante WOL podrá, tras un pequeño offset, hacer una copia al disco remoto usando scp o rsync. Esta soluciôn sería muy eficaz en el caso de tener un solo equipo, pero al tener una infinidad de equipos con uptimes muy diferentes prefiero usar syncthing.
Syncthing es un programa de sincronización de archivos peer-to-peer disponible para todas las plataformas, incluida android. Además de esto, permite configurar un control de versiones de los documentos, permitiendo hacer rollbacks sobre los mismos.
Para correr el servicio de syncthing se añadirá la siguiente línea al archivo de configuración configuration.nix1:
1 services.syncthing = {
2 enable = true;
3 openDefaultPorts = true; # Open ports in the firewall for Syncthing. (NOTE: this will not open syncthing gui port)
4 user = "gabriel";
5 dataDir = "/home/gabriel";
6 configDir = "/home/gabriel/.config/syncthing";
7 };Verificación
Finalmente, se deberá implementar un método de verificación de que los archivos están siendo guardados y sincronizados de forma correcta. Una forma muy simple de hacer esto es crear un cronjob adicional que corra cada minuto y guarde en la(s) carpeta(s) que se estén sincronizando un achivo de texto que muestre la fecha de la última actualización, de esta forma se tendría un registro desde cualquier otra máquina de la última sincronización que ha tomado el escritorio remoto.
1{ config, pkgs, ... }:
2
3let
4 logSync = pkgs.writeShellScript "log-sync" ''
5 set -euo pipefail
6 date '+%Y-%m-%d %H:%M:%S' > /home/gabriel/Sync/ultima_sincronizacion.txt
7 '';
8in
9{
10 services.cron = {
11 enable = true;
12 systemCronJobs = [
13 "* * * * * gabriel ${logSync}"
14 ];
15 };
16}Deberá abrirse el puerto
8483para poder editar la configuración de Syncthing. ↩︎