Ecosistema de serveis per a un Laboratori de Investigació

Aquest projecte busca mostrar el potencial de les eines lliures auto-allotjables de generar un ecosistema per a cubrir les necessitats d’un laboratori de investigació.

L’objectiu no és crear una guia exhaustiva de com instal·lar tot el programari ni com fer-ho de la forma més eficient, si no documentar el procés que jo he seguit per a aquesta prova de concepte, enfocant-me en opcions senzilles i quasi sempre buscant la compartimentalització amb docker.

Aquestes són les necessitats cobertes per eines lliures:

En aquest vídeo faig una petita visita a aquest ecosistema:

Instal·lació

A continuació, us mostro el meu procés.

El primer és instal·lar docker i docker-compose:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

També necessitarem nginx i certbot (per instal·lar certificats de Let’s Encrypt).

sudo apt install nginx certbot python3-certbot-nginx

Per a una configuració típica de nginx, he fet servir el següent fitxer de configuració com a plantilla. L’he creat a la carpeta /etc/nginx/sites-available/ amb el nom que vulgui i que descrigui el servei:

server {
	listen 80;
	listen [::]:80;

	server_name servei.example.org;
	
	location / {
		proxy_pass http://localhost:3838; #Aquí s'ha d'anar canviant el port per el que faci servir el servei en concret. 
	}
}

Cal activar el fitxer creant un enllaç simbòlic a la carpeta de “permesos”:

sudo ln -s /etc/nginx/sites-available/<fitxer> /etc/nginx/sites-enabled/

I només ens caldria instal·lar un certificat amb la següent ordre:

sudo certbot --nginx

Aquestes operacions les haurem de realitzar per a cada servei, tot i que alguns tenen fitxers de configuració lleugerament modificats (els aniré posant a l’article).

Ara ja ho tenim tot llest per a començar a instal·lar serveis!

Etherpad

Comencem amb l’eina de pads col·laboratius Etherpad, en aquest cas l’instal·lem amb docker directament:

sudo docker pull etherpad/etherpad
sudo docker run --detach --publish 1976:9001 etherpad/etherpad

Gitea

A partir d’aquí, la resta ho instal·larem amb scripts de docker-compose, que utilitzen un fitxer de configuració per a fer la instal·lació de docker. Per instal·lar el servei Gitea:

mkdir gitea
cd gitea
vim docker-compose.yml #Jo faig servir l'editor de text vim, però serviria qualsevol editor per terminal

I hi posem el següent text:

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.13.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"

Una vegada creat el fitxer, aixequem el servei amb:

sudo docker-compose up -d

HedgeDoc

Repetim una operació semblant amb HedgeDoc, en aquest cas utilitzem l’eina git per a importar el repositori, que ja inclourà un fitxer de configuració docker-compose:

git clone https://github.com/hedgedoc/container.git hedgedoc-container
cd hedgedoc-container
sudo docker-compose up -d

Abans d’arrencar el servei, cal comprovar que els ports no els estigui fent servir un altre servei, cas en què s’haurà de canviar el primer dels ports aparellats (ex. 3000:3000).

Nextcloud

El següent servei és la suit de productivitat Nextcloud. Creem en una carpeta (mkdir nextcloud) el següent fitxer docker-compose.yml:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=111222333444
      - MYSQL_PASSWORD=111222333444
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    dns:
      - 192.168.0.1
      - 1.1.1.1
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=111222333444
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

Cal canviar les contrasenyes!!

I com sempre, aixecar el servei amb sudo docker-compose up -d.

eLabFTW

Per a la llibreta de laboratori digital, element clau per al nostre projecte, seguim els passos de la seva documentació:

# get the program (a bash script)
curl -sL https://get.elabftw.net -o elabctl && chmod +x elabctl
# add it to a directory in your $PATH
sudo mv elabctl /usr/local/bin/

Creem un fitxer de configuració d’nginx a /etc/nginx/sites-available/ amb el següent contingut:

server {
    server_name demo.elabftw.net;

    listen 80;
    listen [::]:80;
		
    location / {
        proxy_pass       http://localhost:3148; # canviar port si es vol un altre!!
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # add this if nginx is terminating TLS
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

L’activem i creem un certificat de Let’s Encrypt tal com hem explicat més amunt.

Executem la següent ordre:

sudo elabctl install

I ens assegurem que el fitxer de configuració /etc/elabftw.yml tingui el mateix port que hem posat al fitxer de configuració nginx.

Iniciem el servei i executem el contenidor:

sudo elabctl start
sudo docker exec -it elabftw bin/install start

Jitsi-Meet

Per al Jitsi-Meet vaig fer la instal·lació manual següint exactament les instruccions que tenen a la seva documentació, així que no la copiaré aquí. Cal dir que també tenen una imatge de docker que seria interessant explorar.

Grav

Finalment cal instal·lar el Grav, que ens permetrà tenir una pàgina de grup i un portal per a les diferents eines.

Jo vaig triar un esquelet, és a dir una instal·lació de grav amb un tema concret ja molt completa. Vaig descarregar-lo, descomprimir-lo i moure’l a la carpeta /var/www/html/grav/.

Tot seguit vaig crear el següent fitxer de configuració nginx per a apuntar cap a aquella carpeta:

#nginx conf para grav
server {

server_name example.org;
	root /var/www/html/grav/;
    	index index.html index.php;

		listen 80;
    listen [::]:80;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;

	}
    ## Begin - PHP
    location ~ \.php$ {
        # Choose either a socket or TCP/IP address
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        # fastcgi_pass unix:/var/run/php5-fpm.sock; #legacy
        # fastcgi_pass 127.0.0.1:9000;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
    ## End - PHP
}

Finalment, m’asseguro que els permisos al grav són els que toquen, 644 per a fitxers i 755 per carpetes:

cd /var/www/html/grav/
sudo find . -type f -exec chmod 644 {} ";"
sudo find . -type d -exec chmod 755 {} ";"

Per a accedir al panell d’administració cal instal·lar-lo com a plugin si no hi és:

#Dins de la carpeta grav
sudo bin/gpm install admin

I ja hi podem accedir a través de “example.org/admin” al navegador.

Ja tenim el nostre paquet de serveis totalment operatius!

3 'M'agrada'

Uau! Aquí hi ha molt contengut bo. Gràcies Marcel.

2 'M'agrada'