- mar, 04 junio
- Laboratorio
- @fotosycaptura
- #blog, #personal, #laboratorio
Un poco de recuerdos...
Si bien ocupé tiempo atrás una raspberry para ser un server casero Git, puede dar mucho más, pero ahí estaba, descansando y acumulando algo de polvo... Bueno, tiempo atrás borré todo e instalé un Kali, pero anda tan tan lento, otro día creo que les comentaré ese caso. De momento, solo les comentaré lo lento, puesto que, bueno, la raspi que tengo es la 1 b+, es un modelo bastante más arcaico para los tiempos actuales, pero no por ello inutilizable para proyectos actuales...
Y si...
... Hacemos que se convierta en un servidor de este blog, pero que además sea capaz de desplegar las visitas que tiene más gráficamente?
Piensalo por un momento. Actualmente mi sitio web solo cuenta a la forma antigua, bueno, en cierta forma digamos que tengo cierto espíritu de retro o viejuno XDDD, pero es cierto, antiguamente las primeras páginas webs al menos en mi tiempo, tenían un contador de visitas, como el que está al pie de esta página Web.
Pero, estando alojado en un servidor del que tengo control, tengo acceso a los logs, y con algo de programación pues.. Magia!
Partimos
Así que comenzamos con bajar una versión de raspbian del sitio oficial utilizando la aplicación que tienen para ello. Quito la microSD y la inserto en el PC, comienza el proceso de grabación de la imagen a la tarjeta y cuando finaliza, la vuelvo a insertar en la Raspberry pi. La conecto y con con breve barrido de red con nmap encuentro en que ip está dentro de mi red para ingresar vía SSH.
Hasta aquí todo bien. Dado el contexto de ciberseguridad que rige hoy en día, lo primero a comenzar a realizar es actualizar el sistema operativo. Así que comenzamos con:
sudo apt update
sudo apt upgrade
Luego de esto, veamos... Necesitamos un servidor Web, como la raspi es de las primeras, creo que lo mejor es nginx, así que procedemos con nuestro querido gestor de paquetes apt.
sudo apt nginx
Ahora, si uno se dirige a un PC con un navegador y pone la ip de la raspi con http, se debería de visualizar una página de pruebas que dispone nginx.
nginx, recién instalado
Bueno, ya estamos con lo escencial... No, todavía no, en mi caso, si bien escribir en consola es lo usual, me gusta usar algo similar al Comandante Norton que usaba en ms-dos, pero como estoy en GNU/Linux, pues... Acá tiene otro nombre, Midnight Commander, así que, vamos con nuestro gestor de paquetes favorito XD y escribimos
sudo apt install mc
Y con esto ya tenemos a nuestro gestor de archivos gráfico de la terminal de dos paneles, para ahorranos un poco en el tecle tecle...
mc instalado
También, necesitaremos un servicio FTP. Para quien no lo sepa...
¿Hay alguien que no sepa en esta época de la vida que es un FTP?, en fin, por si acaso alguien no sabe, un FTP viene de File Transfer Protocol, o Protocolo de Transferencia de Archivo en buen español, en la actualidad si bien se usa, su uso no es tan masificado como antes porque se usan otras soluciones tipo nube, pero sigue siendo muy utilizado.
Y a nosotros, o bueno, en mi caso, me servirá mucho para copiar los archivos de mi sitio Web actuales al futuro servidor.
Así que, tecle tecle XDD
sudo apt install vsftpd
Aunque, este servicio será de uso temporal. Creo que la generación de las páginas en el futuro quizás las genere desde el mismo server, no sé, ya veré eso después.
Y ya que estamos, un firewall no nos vendría nada de mal...
sudo apt install ufw
Uhm, los más puristas dirían que filtrar por iptables, blablabla, pero digamos que es más engorroso de manejar, así que lo realizaré utilizando esta herramienta que fue pensada para ello.
Bueno, ahora tocará, antes de activar el firewall, configurarlo. Esta parte es bien importante, porque si no se realiza correctamente puede que os toque volver a partir de cero todo el proceso llevado hasta ahora.
Entonces, partimos por configurar que deniegue toda conexión entrante pero que permita las salientes, para ello comenzamos con agregar las siguientes reglas:
sudo ufw default deny incoming
sudo ufw default allow outgoing
Luego, se habilitará para el servicio ssh, importante en mi caso para configurar la raspi sin tener que conectarlo a una tele con teclado.
sudo ufw allow ssh
Con nuestra ip del equipo que usemos para configurar la raspi, la agregamos también para que permita la conexión ssh desde nuestro PC hacia la raspi.
sudo ufw allow from 192.168.0.5
Y ahora, viene la prueba de fuego, si todo sale bien, el Firewall se activará y permitirá la conexión vía ssh.
sudo ufw enable
Taran! Ya estamos con la parte más compleja, entre comillas, por decirlo así jijijiji.
Quizás, ahora que lo pienso, estos pasos deberían de realizarse antes que lo de nginx, pero bueno, ya no importa.
Como apunte de cosas generales por hacer con el firewall, si se desea eliminar alguna regla, se puede realizar con
sudo ufw status numbered
La salida sería algo como:
Numbered Output:
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 192.168.0.5
[ 2] 80 ALLOW IN Anywhere
Y luego escribir la siguiente instrucción para eliminar por ejemplo la regla número 2:
sudo ufw delete 2
Posteriormente habrá que abrir más puertos para permitir la salida del servicio nginx, que permitirá que desde un navegador Web se visualicen las páginas que tengo planeado compartir.
¿Qué más?
Actualización: 05-06-2024 19:10 utc -4
Bueno, posteriormente habría que verificar si Python está actualizado o al menos en la versión 3.9 en adelante, al menos en teoría... Recuerdo que en Windows me funcionaba bien hace un par de años, imagino que en la raspi no debería de ser problemas... Pero la verdad es que ha sido un poco laborioso... Iba todo bien hasta que me percaté que al instalar unas de las librerías famosas para manejar datos, pues, daba problemas de dependencias.
He probado de todo, me he bajado la última versión de Python desde la página oficial y lo compilé... Mala idea, 3 horas aproximadamente la compilación, para otros 5 o 10 minutos usar pip para instalar pandas y que me arroje errores... Pero ya era tarde y había que irse a dormir...
Sin embargo, hoy encontré que algunos han tenido el mismo problema que yo así que, al momento de la redacción de estas líneas pues, estoy probando esto.
Según esa página Web, lo primero sería instalar mediante apt Python3-pandas de esta manera:
sudo apt-get install python3-pandas
Instalando Python3-pandas... A ver como resulta...
Luego de que terminara el proceso, probamos con una pequeña aplicación en Python que intente leer un archivo csv y lo despliegue en pantalla...
Pues....
python3 mi-test.py
Traceback (most recent call last):
File "mi-test.py", line 3, in <module>
import pandas as pd
ModuleNotFoundError: No module named 'pandas'
Creo que no sirvió de nada...
Un amigo me ha dicho que instale DietPi, pero todavía tengo esperanza de que raspbian serviría...
Los días van pasando y cada día que pasa, estoy pensando más en seriamente volver a realizar todo el proceso de reinstalación, configuración y todo lo que conlleva... Hasta lo que llevo escrito en estos momentos...
Actualización: 06-06-2024 21:53 utc -4
Bueno, anoche me resigné y borré todo y comencé con DietPi. Y bueno, primero tuve problemas al utilizar la propia aplicación de la raspi para traspasar la imagen a la microSD. Si bien la imagen permitía a la raspi iniciar, al momento de tratar de conectarse via SSH, no me dejaba, por lo que... Probé esta vez con Rufus y después de esto, si pude conectarme, y comenzó el proceso de instalación y configuración.
Elegí los paquetes que instalara que en mi caso fueron nginx, python3, vsftpd, y posteriormente instalé el resto a mano utilizando los comandos antes descrito en este mismo artículo.
Todo bien hasta el momento de conectarme vía FTP y transferir los archivos. El sitio se visualiza y quedo medianamente contento...
Luego ejecuté un programa en Python para que lea los logs y me genere un csv que posteriormente procesa y me percado que da error, porque no hay logs...
Revisando la configuración de Nginx, me percato que efectivamente están desactivados, seguramente se deba a que DietPi no quiere que haya tanta escritura en la microsd para alargar su vida...
Pero acá estamos para analizar logs, así que, ingreso al archivo de configuración de Nginx ubicado en la ruta /etc/nginx/nginx.conf con mi editor favorito VIM y agrego después de http
...
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
...
Nuevamente probamos... Esta vez el error es otro... Y relacionado nuevamente a pandas... Si bien, instalé pandas y numpy, me siguen dando problemas...
$ sudo python3 pi-lectura.py
Traceback (most recent call last):
File "/home/dietpi/pi-lectura.py", line 3, in <module>
import pandas as pd
File "/usr/local/lib/python3.11/dist-packages/pandas/__init__.py", line 19, in <module>
raise ImportError(
ImportError: Unable to import required dependencies:
numpy: Error importing numpy: you should not try to import numpy from
its source directory; please exit the numpy source tree, and relaunch
your python interpreter from there.
Es extraño... Probé en una máquina virtual y funciona bien...
dietpi@DietPi:~/lector$ sudo py pi-lectura.py
dietpi@DietPi:~/lector$
Pero en la raspi no funciona...
Entonces probé con una versión que sólo me genere un csv sin análisis por intermedio de pandas y eso funciona...
Pero me percato de algo, no vienen las localizaciones de las direcciones IP. Falta algo más por instalar: geoiplookup, así que lo instalamos, bueno, aprovecho e instalo otras cosas más que pueden faltar...
sudo apt install geoip-bin
sudo apt install geoip-database
Luego de instalar y probar el comando geoiplookup y una IP, y verificar que se encuentra funcionando, intento revisar nuevamente si el programa funciona y genera el csv. Y de repente pienso, y ¿Si mejor genero un ambiente virtual y voy instalando librerías por librerías para verificar cual da conflicto?
Vamos!
sudo apt-get install dnsutils
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
pip install wheel
A continuación, pruebo configurando un entorno virtual para aislar la aplicación de los otros archivos de Python del sistema.
sudo apt install python3-venv
Finalmente pruebo creando un entorno virtual, principalmente para ir aislando el problema relacionado al pandas y numpy.
py -m venv labenv
Luego activo el ambiente con el comando
source labenv/bin/activate
De a poco voy instalando las mismas librerías con pip que he mencionado anteriormente y creo que ya he encontrado el problema. Al menos en DietPi.
Así que instalo lo que segun yo, faltaría...
sudo apt-get install libopenblas-dev
Probé en la terminal mi aplicación y veo que funciona. ¡YEY!
Es momento de probar que automáticamente, se ejecute un script con mi programa en Python para que vaya actualizando las estadísticas.
Así que, edito el crontab
sudo crontab -e
Elijo VIM y agrego la siguiente línea para que se ejecute cada 5 minutos
5,10,15,20,25,30,35,40,45,50,55 * * * * sleep 20 ; /home/dietpi/lab/registro.sh
Funciona! Al menos en la VM... Ahora tengo que ver porqué sigue dando problemas en la raspi, si es el mismo OS...
Después de varios intentos, funcionó! SEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEH! Soy el p*to amo XDDDDD