sábado, 3 de febrero de 2024

Conducido por la corriente

 https://www.twitch.tv/mrkhaosk19

https://clips.twitch.tv/ArtsySmokyGoldfishPartyTime-vB9h2nIbmeodTtWS





domingo, 21 de enero de 2024

jueves, 9 de febrero de 2023

Docker:Persistencia de datos

Primera parte: bind-mount

  1. Crea tres contenedores
    1. Dos de ellos se basan en una imagen que muestra hola mundo
      1. Ya está construida, la etiqueto como "hellow:1.0".
        1. docker tag imageid hellow:1.0
    1. La otra muestra "¿AWS mejor que Azure?"
      • Maquina azur, sustituyendo la línea correspondiente en el dockerfile y construyendo
        • docker  build -t hmazur:1.0 .


Successfully built f4fee070b7ef
Successfully tagged hmazur:1.0

      • docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hmazur              1.0                 f4fee070b7ef        5 minutes ago       173MB
hellow              1.0                 55c08152bc11        12 hours ago        173MB

      • Lanzo los contenedores, el bind mount estará en el segundo y tercer docker llamado "ws02" y "wsazur", en /c/Users/Public/docker/bindpersist en el host y se enlaza con /app en el contenedor
        1. docker create --name ws01 hellow:1.0
        2. docker create --name ws02 –v /c/Users/Public/docker/bindpersist/:/app hellow:1.0
        3. docker create --name wsazur –v /c/Users/Public/docker/bindpersist/:/app hmazur:1.0
        4. docker container ls –a muestra:

docker@HelloWorld:/c/Users/Public/docker/bindpersist$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
ab44326fb14f        hmazur:1.0          "/bin/sh -c 'nginx -â¦"   8 seconds ago       Created                                       wsazur
8ecc88f7e9fb        hellow:1.0          "/bin/sh -c 'nginx -â¦"   2 minutes ago       Created                                       ws02
8798d1456e67        hellow:1.0          "/bin/sh -c 'nginx -â¦"   5 minutes ago       Created                                       ws01

  1. Una vez lanzados creo documentos en host y docker y compruebo la correspondencia
    1. docker exec -it wsazur bash -c "ls -lart /app":
    2. Algunas pruebas ("d<ocker exec -it ws02 bash -c "mkdir /app/carpeta1", "<ocker exec -it wsazur bash -c "touch /app/hundido"" y su reflejo en el sistema de archivos
  1. Borro los contenedores y compruebo que los datos persisten, "docker stop wsazur && docker rm wsazur", "docker rm ws02 –f", docker rm ws01 –f", vuelvo a crear ele docker wsazur y compruebo:

Segunda parte: volumes

  1. Crea dos volúmenes (persistencia01 y persistencia02)

docker@HelloWorld:~$ docker volume create persistencia01
persistencia01
docker@HelloWorld:~$ docker volume create persistencia02
persistencia02
docker@HelloWorld:~$ docker volume ls
DRIVER              VOLUME NAME
local               persistencia01
local               persistencia02
docker@HelloWorld:~$ docker volume inspect persistencia01
[
     {
         "CreatedAt": "2023-02-09T11:03:20Z",
         "Driver": "local",
         "Labels": {},
         "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/persistencia01/_data",
         "Name": "persistencia01",
         "Options": {},
         "Scope": "local"
     }
]

  1. Crea y lanza 2 contenedores, cada uno de una imagen diferente vinculado a cada volumen.

docker create --name wsazur -v persistencia01:/app hmazur:1.0
283e9e5a76801f385e41df3aad8dc4eae4a0e24b27d1a7b6b47418110587b44d

docker create --name ws01 –v  persistencia02:/app hellow:1> 38617c65c20dd2511467b058db7d129d6775d3c8c5351661edbe013691c7bc29

    1.  
      1. Inspección

docker@HelloWorld:~$ docker inspect wsazur | grep -A 3 -B 3 volum
         },
         "Mounts": [
             {
                 "Type": "volume",
                 "Name": "persistencia01",
                 "Source": "/mnt/sda1/var/lib/docker/volumes/persistencia01/_data",
                 "Destination": "/app",
                 "Driver": "local",
                 "Mode": "z",
docker@HelloWorld:~$ docker inspect ws01 | grep -A 3 -B 3 volum
         },
         "Mounts": [
             {
                 "Type": "volume",
                 "Name": "persistencia02",
                 "Source": "/mnt/sda1/var/lib/docker/volumes/persistencia02/_data",
                 "Destination": "/app",
                 "Driver": "local",
                 "Mode": "z",

 

    1. Comprobación de vínculos
      1. Comprobación de vínculos
        1. sudo touch /mnt/sda1/var/lib/docker/volumes/persistencia01/_data/holamundo.txt
        2. sudo touch /mnt/sda1/var/lib/docker/volumes/persistencia02/_data/holamundo1.txt

docker start wsazur && docker start ws01

docker@HelloWorld:~$ docker exec -it wsazur bash -c "ls -lart /app"
total 8
-rw-r--r-- 1 root root    0 Feb  9 11:13 holamundo.txt
drwxr-xr-x 2 root root 4096 Feb  9 11:13 .
drwxr-xr-x 1 root root 4096 Feb  9 11:14 ..
docker@HelloWorld:~$ docker exec -it ws01 bash -c "ls -lart /app"
total 8
-rw-r--r-- 1 root root    0 Feb  9 11:13 holamundo1.txt
drwxr-xr-x 2 root root 4096 Feb  9 11:13 .
drwxr-xr-x 1 root root 4096 Feb  9 11:14 ..

Los volúmenes son más fáciles de migrar y hacer copias de seguridad, de compartir entre contenedores y/o desde la nube. Se colocan en una zona de linux con mayor seguridad y protección que los "bind". También están fuera del ciclo de vida del contenedor.

 

 

jueves, 14 de noviembre de 2019

Servidor Debian 5.0 mipsel

Estamos en 2019 y aquí estoy montando un frankenservidor en una máquina de hace 30 años con 32Mb de RAM y procesador de 300mhz. Siguiendo los pasos del tutorial de puesta en marcha del host (http://kernelloader.sourceforge.net/linux.html)

Estoy en un entorno chroot a través del qemu-mipsel-static usando un ubuntu 17 en una pequeña “caja” Dual-core con 1Gb de RAM y preparando el disco IDE que voy a pasar a la máquina destino. Partiendo de un debootstrap que ocupa unos 500 mbs sobre una partición de 8 gb:

  • Que paquetes hay instalados
    • dpkg-query –f ‘${Package}\n’ –W
      • 118 desde bash, nano, sysV, vim… hassta apt con nettools /wget y un gcc-4.2/3! o
    • Selecciono lwm como gestor de ventanas (26 mbs) y aquí vienen las libX11 (kterm, ncurses-term,…)
    • ufw: falla la instalación. Instalo el python 2.5 disponible y probaré a buscar un paquete ufw compatible… Esta era la información que necesitaba (y esta complementa la configuración). Aunque me he encontrdo con otra sorpresa, el lnux no lleva cargado ningún módulo adicional, al pareccer hay que configurarlo por modules.conf o así para cargarlo en el arranque… ¿Qué más sorpresas me esperan?

viernes, 6 de julio de 2018

(Re)Configurando Servidor de blogging con Servidor Nodejs Ghost en placa ARM(rPi)

Previos:

  • Pretendo “reconstruir” el hosting personal que monté hace un tiempo. Por los motivos inesperados (fallo de disco, etc.) perdí la configuración inicial antes de poder hacer su correspondiente copia de seguridad, pero el hosting sobre la rPi funciona correctamente.
  • El sevidor Ghost que puse en producción de momento debería ser la misma versión que funcionó en su momento, así que me veo forzado a repetir el proceso tal y como lo hice en su momento. Mas adelante me preocuparé de la actualización entre la versión de Ghost, la versión del nodejs y la del npm tal y como está detallado en los requisitos del servidor GhostConfused smile
  • Los requisitos del servidor Ghost fuerza el uso de versiones específicas de nodejs, cosa que resulta incompatible con el sistema de empaquetado de debian, por lo que si hay instalada alguna versión de NodeJs es preferible borrarla en primer lugar.

Requisitos:

  • Dispositivo de almacenamiento con el sistema instalado de la raspberryPi, en mi caso, una SDHC de 4gb con un sistema basado en Debian.
  • Ordenador secundario para configurar el chroot, en mi caso otro debian.

Proceso:

  1. 99) En el ordenador ejecutar
    1. apt-get install qemu-user-static
  2. 98) Conectar el dispositivo que contiene el sistema de la rPi y montarlo, p.ej en /mnt
    1. cd /mnt
    2. mount –t proc proc /mnt/proc/
    3. mount –t sysfs sys /mnt/sys/
    4. mount –-bind /dev /mnt/dev/
    5. mount –bind /dev/pts /mnt/dev/pts/
    6. cp /usr/bin/qemu-arm-static /mnt/usr/bin
    7. nano /mnt/etc/ld.so.preload
      1. Comentar con # cada línea de carga de módulos
    8. chroot /mnt /bin/bash
    9. En este momento ya deberiamos estar “dentro” del sistema arm
  3. 97) ANTES QUE NADA RECUERDO EL PROCESO INVERSO

    1. 99) exit
    2. 98) nano /mnt/etc/ld.so.preload y restaurar la carga de módulos
    3. 97) rm /mnt/usr/bin/qemu-arm-static
    4. 96) cd /
    5. 95) umount -–recursive /mnt
    6. Y ya puedes devolver el dispositivo a la rPi para su uso habitual Smile
  4. 97)  Posiblemente de algún github descargué este script (siento mucho no disponer de la información que recopilé en su momento (script.sh) que permite instalar una versión específica de todo el sistema V8. El script descarga el código fuente de la  versión especificada, la compila y la instala. El proceso puede ser largo según la máquina.

    • #!/usr/bin/env bash
      if [ $# -lt 1 ]; then
           echo "Usage: $0 version"
           exit 1
      fi
      version=$1
      orig_dir=$(pwd)
      work_dir=/tmp
      patch_dir=$work_dir/node-v$version/deps/v8/
      patch_file=$work_dir/node-v$version/deps/v8/SConstruct.patch
      cd $work_dir
      wget -O - http://nodejs.org/dist/v$version/node-v$version.tar.gz|tar xz
      if [ $? -ne 0 ]; then
           echo "Something wrong fetching/decompressing node-v$version.tar.gz"
           exit 0
      fi
      echo "--- SConstruct    2013-09-30 16:52:48.000000000 -0400   
      +++ ../../../node-v$version-custom/deps/v8/SConstruct    2013-09-30 16:52:48.000000000 -0400
      @@ -80,7 +80,7 @@
          },
          'gcc': {
            'all': {
      -      'CCFLAGS':      ['\$DIALECTFLAGS', '\$WARNINGFLAGS'],
      +      'CCFLAGS':      ['\$DIALECTFLAGS', '\$WARNINGFLAGS', '-march=armv6'],
              'CXXFLAGS':     ['-fno-rtti', '-fno-exceptions'],
            },
            'visibility:hidden': {
      @@ -159,12 +159,12 @@
              },
              'armeabi:softfp' : {
                'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
      -        'vfp3:on': {
      -          'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
      -        },
      -        'simulator:none': {
      -          'CCFLAGS':     ['-mfloat-abi=softfp'],
      -        }
      +#        'vfp3:on': {
      +#          'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
      +#        },
      +#        'simulator:none': {
      +#          'CCFLAGS':     ['-mfloat-abi=softfp'],
      +#        }
              },
              'armeabi:hard' : {
                'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
      " > $patch_file
      cd $patch_dir
      patch -p0 < SConstruct.patch
      cd ../..
      ./configure && make && sudo make install
      cd $orig_dir
      #!/usr/bin/env bash
      if [ $# -lt 1 ]; then
          echo "Usage: $0 version"
           exit 1
      fi
      version=$1
      orig_dir=$(pwd)
      work_dir=/tmp
      patch_dir=$work_dir/node-v$version/deps/v8/
      patch_file=$work_dir/node-v$version/deps/v8/SConstruct.patch
      cd $work_dir
      wget -O - http://nodejs.org/dist/v$version/node-v$version.tar.gz|tar xz
      if [ $? -ne 0 ]; then
           echo "Something wrong fetching/decompressing node-v$version.tar.gz"
           exit 0
      fi
      echo "--- SConstruct    2013-09-30 16:52:48.000000000 -0400   
      +++ ../../../node-v$version-custom/deps/v8/SConstruct    2013-09-30 16:52:48.000000000 -0400
      @@ -80,7 +80,7 @@
          },
          'gcc': {
            'all': {
      -      'CCFLAGS':      ['\$DIALECTFLAGS', '\$WARNINGFLAGS'],
      +      'CCFLAGS':      ['\$DIALECTFLAGS', '\$WARNINGFLAGS', '-march=armv6'],
              'CXXFLAGS':     ['-fno-rtti', '-fno-exceptions'],
            },
            'visibility:hidden': {
      @@ -159,12 +159,12 @@
              },
              'armeabi:softfp' : {
                'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
      -        'vfp3:on': {
      -          'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
      -        },
      -        'simulator:none': {
      -          'CCFLAGS':     ['-mfloat-abi=softfp'],
      -        }
      +#        'vfp3:on': {
      +#          'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
      +#        },
      +#        'simulator:none': {
      +#          'CCFLAGS':     ['-mfloat-abi=softfp'],
      +#        }
              },
              'armeabi:hard' : {
                'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
      " > $patch_file
      cd $patch_dir
      patch -p0 < SConstruct.patch
      cd ../..
      ./configure && make && sudo make install
      cd $orig_dir

  5. 97.99) – INTERRUPCIÓN --- Configurar “screen” para el proceso de compilación

    1. > apt-get install screen

      1. screen y los comandos
        1. “screen (-r)”
        2. Ctrl-a ?
        3. Ctrl-a c
        4. Ctrl-a n ó Ctrl-a p
        5. Ctrl-a d
        6. Ctrl-a H (para el logging)
  6. 96) Después de “chmod +x script.sh” para permitir su ejecución, lo ejecuto:

      1. Opcionalmente hacerlo en un screen

    1. > ./script.sh 0.10.29

      1. salir del screen

    2. De esta manera,  descarga las fuentes y las compila en un directorio temporal /tmp/node-vX.YY.ZZ (PUEDE QUE TARDE ENTRE 15 MINUTOS O MAS SEGÚN EL ORDENADOR)

    3. ME HE DADO CUENTA QUE AL FINALIZAR LA COMPILACIÓN YA QUEDA INSTALADO EN EL SISTEMA, SIN POSIBILIDAD DE REINSTALACIÓN, CONSIDERO IMPORTANTE GENERAR UN PAQUETE DEBIAN DESDE LAS FUENTES EN ESTE MOMENTO

      1. 96.99)MUEVO TODO EL DIRECTORIO COMPILADO A LA CARPETA ROOT POR SI ES NECESARIO REPETIR EL PROCESO, mv /tmp/node-vX.YY.ZZ /root

      2. 96.98) “>apt-get install checkinstall”

      3. 96.97) cd /root/node-vX.YY.ZZ

        1. abrir un “screen” para este proceso

      4. 96.96) checkinstall, me he documentado muy poco sobre esto pero me ha generado un paquete DEB

        1. Como descripción indico “NodeJs for ghost blog”<ENTER> dos veces

        2. De la lista seleccionada, aprieto [3] y cambio el número de versión de “vX.YY.ZZ” a “X.YY.ZZ” sin letra,

        3. <ENTER> para realizar el proceso de compilación y empaquetado… Vuelvo a esperar algún tiempo mayor de diez minutos… (Según la instalación de linux, vigilar el espacio disponible en /var

          1. Debería indicar “Done. The new package has been installed…”

          2. Cerrar el “screen” y hacer un backup de tu .deb…

      1. Estas pruebas me han confirmado la instalación/desinstalación del paquete en otro sistema

        • dpkg –i node_X.YY.ZZ-1_ARQUITECTURA.deb
        • apt-get remove node ó bien dpkg –r node

      2. p)

  7. 96) ESTE SERÍA UN BUEN MOMENTO PARA HACER UN BACKUP POR RSYNC DE TODO EL SISTEMA..

  8. 95) PROBANDO, a partir de la versión descargada de www.ghost.org (ghost-latest.zip)

    1. > node –-version ( =v0.10.29)

    2. > npm –-version ( =1.4.14)

    3. unzip ghost-latest.zip –d prueba.com

    4. cd prueba.com

    5. cp config.example.js config.js

    6. npm install –production (para hacer la instalación en modo de producción)

      1. El proceso puede ser largo y con un poco de suerte debería de poder compilar sus dependencias automáticamente. (Recuerdo tener problemas de compilación del módulo sqlite3 al utilizar una versión diferente del node/npm). En mi caso, al disponer de poco espacio en la partición raiz también he tenido que hacer limpieza de agún kernel antiguo dejando unos 200 Megas libres para confirmar la instalación

    7. npm start

      1. Finalmente he podido comprobar que el servidor iniciaba y, en la primera ejecución, creaba las tablas necesarias… Smile

  9. 94) Configuración del registro por dirección de email Sad smile

    1. El primer acceso ya me pide una dirección de email, y prefiero crear alguna configuación personalizada interna antes que usar los servicios externos...

  10. 93

Lamento la falta de organización, es hora de backups y reorganizaciones antes de continuar este proceso.

Sad smile Intento continuarlo