Última actualización: 2021-03-12 18:21:12 UTC

¿Por qué una guía sobre trabajo en remoto?

Las circunstancias que nos tocó vivir a principios del año 2020 condicionaron nuestra forma de vivir. Fueron muchos los sectores que tuvieron que cesar su actividad, mientras que otros tuvieron que adaptarse a otros modos de trabajo. Es el caso del sector TIC que, a partir de ese momento, comenzó a generalizarse el teletrabajo cuando hasta ese momento era una práctica muy poco habitual por parte de las empresas. El objetivo de esta guía es compartir la experiencia propia y recopilar herramientas para que los desarrolladores puedan seguir trabajando en remoto haciendo uso de herramientas basadas en software libre o código abierto.

Los contenidos están disponibles en GitLab y su autor no se hace responsable del uso que terceros puedan hacer con las tecnologías tratadas en este documento. Las distintas marcas recogidas en el documento pertenecen a sus respectivos propietarios. Las herramientas expuestas pueden no disponer de los requisitos que la legislación exija en cada país. Comentarios o sugerencias pueden enviarse por mensaje directo en twitter a la cuenta @remotedevguide. Disponible en formato PDF y en formato EPUB .

Este trabajo está licenciado bajo una licencia Creative Commons Attribution-ShareAlike 4.0 International License.

license cc

Introducción

El objetivo de esta guía es proporcionar distintas soluciones a los desafíos del teletrabajo. Se tenderá a la utilización de soluciones basadas en software libre o código abierto.

Infraestructura como servicio

Durante el teletrabajo necesitaremos distintos servicios que tengan que estar alojados directamente en internet para poder trabajar con cliente u otros compañeros. Para las distintas necesidades existen alternativas gratuítas que se pueden utilizar (Skype, Google Docs, Dropbox, Zoom, …​), pero NO es objetivo de esta guía promocionar servicios que hacen negocio con los datos de los usuarios.

«Cuando un producto es gratis, el producto eres tú.»

Para poder implementar los distintos servicios nos vamos apoyar en nubes públicas, empezaremos empleando un droplet de Digital Ocean.

¿Por qué escoger Digital Ocean? Simplemente porque es una opción que permite, con sólo invertir 5 dólares, disponer de un servidor. Otras nubes ofrecen servicios gratis durante un tiempo, por ejemplo AWS o Azure. Si tu objetivo es trabajar con muchos servicios, y tu organización se plantea pasar a la nube, échale un ojo a todas las alternativas. No es el objetivo de esta guía.

Grandes empresas pueden disponer de Centro de Proceso de Datos propios, armarios con servidores para proporcionar servicios sobre redes privadas virtuales y permitir a sus trabajadores continuar con el negocio sin necesidad de requerir nuevos servicios. Éste no es el caso de la mayoría de empresas que no disponen de recursos propios ni planes de contingencia.

Digital Ocean

Las nubes públicas suelen proporcionar una interfaz web para controlar todas las instancias o servicios que vas creando. Desde la interfaz, a golpe de click de ratón puedes crear un servidor y tener acceso en cuestión de pocos minutos.

Adicionalmente a esta interfaz web las nubes públicas suelen incluír un interfaz para programación vía servicios REST. Emplearemos este modelo de trabajo que nos permite aunar el mundo de los developers y de los sysadmin, otros términos relacionados con este mundo son: infraestructura como código o devops. Al disponer de unos servicios REST también es habitual que se proporcionen utilidades de línea de comandos para permitir realizar scripting sobre la infraestructura.

Digital Ocean desde línea de comandos con doctl

doctl

En la documentación de Digital Ocean están recogidas distintas bibliotecas (libraries) para poder trabajar contra el API desde los principales lenguajes de programación. La interfaz de línea de comandos para trabajar con Digital Ocean, doctl, se puede instalar con Homebrew, también disponible para linux como LinuxBrew y en Windows con WSL (Windows Subsystem for Linux).

En el apartado de utilidades se detalla como instalar HomeBrew.

# Instalación de doctl con homebrew
brew install doctl

También están disponibles los binarios para windows, macos o linux en el repositorio de github y una imagen de Docker con la herramienta incluída.

# Instalación de la imagen con doctl incluída
docker pull digitalocean/doctl:latest

Para trabajar con el comando doctl necesitaremos en un primer paso autenticarnos contra los servidores de Digital Ocean. Para ello es necesario el uso de un token

# Token de Digital Ocean
# consultar: https://cloud.digitalocean.com/account/api/token
DO_API_TOKEN=xxx

# Información de la cuenta
doctl account get -t $DO_API_TOKEN

# Autenticar
doctl auth init -t $DO_API_TOKEN

# Petición directa al API REST usando curl y jq para listar imágenes
curl -X GET --silent "https://api.digitalocean.com/v2/images?per_page=999" -H "Authorization: Bearer $DO_API_TOKEN" | jq '.images[] | select(.regions[] | contains("ams2")) | select(.slug != null) | select(.slug | contains("ubuntu"))'

# Crear droplet
doctl compute droplet create jitsi --size s-1vcpu-1gb --image ubuntu-18-04-x64 --region ams3 (1)

# Listar los droplet disponibles
doctl compute droplet list

En el comando doctl compute droplet create se proporciona el tamaño de la máquina (--size), la imagen a utilizar (--image), y la región (--region) que indica en que CPD se alojará la máquina.

Para listar las regiones disponibles tenemos el siguiente comando:

# Listar regiones
doctl compute region list

Slug    Name               Available
nyc1    New York 1         true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true (1)
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true
1 Queda a elección de cada uno escoger la región que crea más conveniente. En el ejemplo anterior se seleccionó Amsterdam 3.
Tabla 1. Algunos precios de máquinas más sencillas en Digital Ocean (orientativo)
Clase Slug vCPUs RAM Disco Transferencia Coste mensual

Standard

s-1vcpu-1gb

1

1 GB

25 GB

1 TB

$5

Standard

s-1vcpu-2gb

1

2 GB

50 GB

2 TB

$10

Standard

s-1vcpu-3gb

1

3 GB

60 GB

3 TB

$15

Trabajando con droplets

Se recoge una tabla con una serie de subcomandos para realizar con los droplets, a toda esta serie es necesario anteponerle el comando doctl compute.

Tabla 2. Comandos asociados a doctl compute
Comando Descripción

droplet list

Listar los droplets disponibles. En la lista aparecerá el identificador de cada droplet (droplet_id).

droplet actions droplet_id

Lista las acciones que se fueron realizando con doctl sobre los droplets.

droplet-action reboot droplet_id

Reiniciar un droplet en concreto.

droplet-action shutdown droplet_id

Apagar un droplet.

droplet-action rename droplet_id --droplet-name new_name

Renombrar un droplet.

droplet-action power-off droplet_id

Power off un Droplet. El droplet tiene que estar en estado power on. El mejor método para llevar a cabo esto es desde línea de comandos para evitar la pérdida de datos.

droplet-action power-on droplet_id

Power on un Droplet.

Con doctl también podremos conectarnos un droplet sin la necesidad de conocer cual es su IP o dominio, únicamente referenciando el identificador del droplet.

doctl compute ssh droplet_id

Hardening del servidor

Una vez tengamos nuestro droplet en funcionamiento es ALTAMENTE recomendable realizar algunos ajustes de seguridad.

Entre las recomendaciones de seguridad recogemos:

  • Minimizar la superficie de exposición. Hacer uso de iptables, ufw, nftables, …​ u otro cortafuegos para exponer a internet únicamente los puertos que sean necesarios para el servicio que deseemos.

  • Configurar SSH para no permitir login con usuario root. Crear un nuevo usuario y generar un par de claves en local con ssh-keygen y copiar la clave pública al servidor con ssh-copy-id (Mejor emplear claves ssh que contraseñas). Configurar el servidor SSH para no permitir el acceso por el usuario root.

  • Configurar fail2ban para mitigar los ataques por fuerza bruta.

  • Configurar el puerto de SSH en un número diferente, o configurar port knocking (traducido como Golpeo de puertos).

La instalación por defecto de fail2ban ya viene con una jail (jaula) para el servicio SSH:

# Instalación de fail2ban
apt install fail2ban
Para una guía detallada sobre fortificación de servidores GNU/Linux está publicado el libro Hardening de servidores GNU/Linux de la editorial 0xWord.

Contenedores

Docker

Docker

Docker es una herramienta que permite automatizar el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos. Aunque inicialmente puede parecer una virtualización de una máquina en realidad su uso está más orientado a la virtualización de aplicaciones.

Instalación de Docker

La instalación que se sigue a continuación se realiza sobre el droplet de Digital Ocean que creamos anteriormente, y sobre un sistema operativo Ubuntu 18.04. En caso de otras distribuciones será necesario consultar el apartado de la documentación de Docker Get Docker.

# Actualizar APT
sudo apt update

# Requisitos para que APT use paquetes mediante HTTPS
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Añadir la clave GPG del repositorio de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Añadir el repositorio de Docker a APT
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

# Actualizar APT nuevamente
sudo apt update

# Instalar desde repositorio de Docker y no desde el de Ubuntu
apt-cache policy docker-ce

# Instalar Docker
sudo apt install docker-ce

# Comprobar el estado del servicio
sudo systemctl status docker

Comandos básicos

Para trabajar con docker lo más recomendable es utilizar la línea de comandos. Existen herramientas gráficas que facilitan el trabajo con docker. como por ejemplo Portainer.

Ejemplos de comandos para trabajar con el cliente de docker:

# Descargar una imagen de docker, por ejemplo: asciidoctor/docker-asciidoctor:latest
# (imagen de asciidoctor con la que se construye esta guía)
docker pull asciidoctor/docker-asciidoctor:latest

# Lanzar un contenedor con terminal interactivo
docker run --name asciidoc -it -v `pwd`:/documents/ --rm asciidoctor/docker-asciidoctor

# Listar las imágenes del equipo
docker images

# Listar todos los contenedores (en funcionamiento y parados)
docker ps -a

Dada la gran popularidad de Docker, junto con el crecimiento del trabajo en la nube, existen multitud de herramientas para trabajar conjuntamente con Docker:

  • Lando, es un entorno de desarrollo basado en Docker, que automatiza las tareas para el trabajo en entornos LAMP con Drupal, Backdrop, Joomla, Laravel, wordpress, …​ Integrando servicios adicionales como: mailhog, solr, tomcat, phpmyadmin, varnish, …​

  • Dry, es un gestor de Docker por línea de comandos interactiva más visual y usable que la herramienta de Docker cli.

  • Docker con Vagrant, un proveedor de Docker para Vagrant.

Podman

Podman

Podman, o Pod Manager, es un motor de contenedores, que no precisa de un proceso demonio, que permite la gestión, desarrollo y ejecución de contenedores OCI sobre sistemas GNU/Linux. Los contenedores pueden ejecutarse como root o en modo usuario. Podman se presenta como una alternativa a Docker, y tanto es así que puede crearse un alias y emplear las mismas opciones del cliente docker: alias docker=podman

Escritorios remotos

Una de las herramientas imprescindibles en el teletrabajo son las herramientas que nos permiten controlar un equipo a distancia. Dentro de este grupo encontramos el protocolo RDP y su cliente de escritorio remoto de windows. Como alternativas se tratarán otras alternativas para los distintos sistemas, tanto soluciones de servidor como clientes para el equipo que se conecta en remoto.

NoMachine

NoMachine

NoMachine está disponible para Windows, MacOS, GNU/Linux, iOS, Android y equipos ARM (Raspberry Pi, BeagleBone o Radxa Rock). Aunque inicialmente fue un producto centrado en GNU/Linux y los sistemas XWindows, ahora funciona en múltiples entornos.

NoMachine es free para uso personal y permite su instalación para realizar múltiples tareas de uso doméstico, acceso a equipos de familiares, …​ NoMachine NO es 100% software libre y deberías consultar su apartado de preguntas frecuentes en función del uso de la herramienta.

¿Por qué se habla de NoMachine en esta guía?

NoMachine ofrece productos de servidor NX comerciales y software cliente gratuito para Windows, Linux, Mac OS X y Solaris. Proporciona el núcleo la tecnología NX y bibliotecas de software bajo la Licencia Pública General de GNU (GPL), que hace posible que otras a desarrollar sus propios servidores NX. FreeNX es una implementación GPL de un servidor NX, construido en la cima de las bibliotecas del núcleo de NX.

NoMachine puede usarse esporádicamente en tu equipo del trabajo, y también para uso privado, si se trata de una administración esporádica. Literalmente se recoge en su apartado de preguntas frecuentes: Sporadic remote administration of a computer at work.

Su buen rendimiento en redes lentas hacen de NoMchine una alternativa en determinadas ocasiones.

nomachine conf01
Figura 1. Configuración de la calidad y resolución

Remmina

Remmina

Remmina es un cliente multiprotocolo que permite la conexión a escritorios remotos. Su licencia es GPLv2. Entre los protocolos soportados incluye RDP, VNC, SPICE, NX, XDMCP, SSH y EXEC. Está escrito en GTK, pero ya está en marcha un desarrollo en QT. Está disponible para las principales distribuciones de GNU/Linux a través de sus gestores de software, y en Snap y Flatpak.

Su instalación se divide en el paquete con la interfaz de cliente (remmina) y los paquetes con los plugins con cada uno de los protocolos soportados (remmina-plugin-spice, remmina-plugin-vnc, remmina-plugin-exec, remmina-plugin-rdp, remmina-plugin-nx,…​). El código fuente está disponible en Github y Gitlab.

Es una de las alternativas cliente más utilizada para conectarse a escritorios remotos windows, junto con rdesktop.

remmina conf
Figura 2. Pantallazo de las opciones de configuración de Remmina

En Ubuntu cuenta con un PPA propio para instalar las últimas versiones disponibles:

sudo apt-add-repository ppa:remmina-ppa-team/remmina-next
sudo apt update
sudo apt install remmina remmina-plugin-rdp remmina-plugin-secret

Almacenamiento de ficheros en la nube

Rclone

RClone

Rclone es una utilidad de línea de comandos que permite sincronizar ficheros y directorios desde los principales sistemas de almacenamiento en la nube: Dropbox, Google Drive, OneDrive, NextCloud, Webdav, FTP, Amazon S3, DigitalOcean Spaces, …​

Las herramientas personales más utilizadas como Dropbox, Google Drive o OneDrive, cuentan con clientes de escritorio que permiten sincronizar los ficheros de trabajo en un directorio que se configure. En el caso de escritorios GNU/Linux no siempre existen clientes para todas estas herramientas pero con Rclone disponemos de una herramienta que se puede configurar con múltiples cuentas y trabajar con distintas soluciones. Rclone sería la navaja suiza para trabajar con las distintas soluciones que trabajan con ficheros en la nube.

Rclone GUI

Rclone GUI es una de las opciones que viene con rclone para proporcionar una interfaz gráfica, vía web, para rclone. Implementada con reactjs y bajo licencia MIT. Desde la interfaz tendremos disponibles los distintos remotes que tenemos configurados con rclone.

Las funcionalidades aún están en fase experimental.
rclone gui
Figura 3. Rclone browser en funcionamiento

Para lanzar la interfaz gráfica executamos la siguiente instrucción desde línea de comandos.

rclone rcd --rc-web-gui --rc-user=username --rc-pass=xxx --rc-web-gui-update

RcloneBrowser

Otra alternativa para disponer de una interfaz gráfica para rclone es RcloneBrowser. Está disponible en formato AppImage, exe y dmg para los sistemas operativos macOS, GNU/Linux, BSD y Windows, en el apartado de releases de Github.

rclone browser 02
Figura 4. Remote configurado en rclone browser
rclone browser 01
Figura 5. Navegando por los ficheros de un remote

Puede automatizarse su descarga con los siguientes comandos:

wget -c https://github.com/kapitainsky/RcloneBrowser/releases/download/1.8.0/rclone-browser-1.8.0-a0b66c6-linux-i386.AppImage
chmod +x rclone-browser-1.8.0-a0b66c6-linux-x86_64.AppImage

IDE y editores de código

La herramienta principal de un desarrollador es el editor y cuantas más funcionalidades tenga llegamos a hablar de un Entorno de Desarrolo Integrado (IDE). La elección del editor es una cuestión muy subjetiva, en mi opinión, que debe ir ligada a una relación comodidad / productividad. Cada uno elige el editor con el que se encuentre más cómodo. No es menos cierto que en ciertas empresas se obligue a la utilización de determinadas herramientas por cuestiones de pago de licencias, homogeneizar los puestos de trabajo y otras razones de tipo organizativo.

Para el trabajo en remoto es posible trabajar con las mismas herramientas empleando un Escritorio Remoto y conectándose al equipo del trabajo. Se recopilan a continuación una serie de editores con funcionalidades adaptadas para el trabajo en remoto.

Atom

atom

Atom es un editor multiplataforma (disponible para Macos, Windows y GNU/Linux) bajo licencia MIT desarrollado por Github. Tiene en común con Visual Studio Code que ambos están desarrollados con Electron, un framework de código abierto para desarrollar aplicaciones de escritorio multiplataforma con javascript, html y css.

Al estar desarrollado por Github cuenta con funcionalidades incorporadas para trabajar con git y github.

Paquetes para teletrabajo

Dentro de los múltiples paquetes se indican a continuación los que pueden ser de utilidad en el teletrabajo. Para gestionar la instalación de paquetes con Atom puede hacerse desde el propio editor o empleando el comando desde consola apm (Atom Package Manager).

atom apm
Figura 6. Pantallazo de la ejecución de apm
Extensión Descripción

Teletype

Paquete que permite a los desarrolladores compartir sus espacios de trabajo con los miembros del equipo y trabajar colaborativamente en tiempo real.

Instalación: apm install teletype

Visual Studio Code

vscode

Visual Studio Code es un editor de código de Microsoft bajo licencia MIT. Está disponible para Windows, macOS y GNU/Linux. Está desarrollado en Electron y viene con soporte incluido para JavaScript, TypeScript y Node.js. La posibilidad de ampliar sus funcionalidades mediante extensiones hacen que no esté limitado al ecosistema Javascript y tenga soporte para otros lenguajes (C++, C#, Java, Python, PHP, Go).

Esta guía se desarrolla con Visual Studio Code y extensiones para AsciiDoctor (AsciiDoc, Paste Image, GitLens, …​).

En el apartado de descargas de la página de Visual Studio Code se encuentran paquetes para los sistemas Windows, Macos y GNU/Linux. Dentro de los distintos sistemas de paquetería de las distribuciones GNU/Linux tenemos paquetes DEB (Debian y Ubuntu) y RPM (Red Hat, Fedora y Open Suse). También está disponible para su instalación vía Snap.

En el apartado de utilidades se detalla como instalar Snap.

Instalación vía Snap
snap install code

Instalación de extensiones

La instalación de extensiones en Visual Studio Code se puede realizar desde el icono de extensiones de la barra lateral de actividad de VS Code (Activity Bar), o pulsando las teclas Ctrl+Shift+X. Al desplegar el panel dispondremos de un cuadro de búsqueda de las extensiones deseadas. También se pueden buscar las extensiones desde Visual Studio Code MarketPlace.

vscode activitybar
Figura 7. Icono de las extensiones en VS Code

En el MarketPlace de extensiones indican otra forma alternativa de instalar las extensiones. Por ejemplo, para instalar la extensión para utilizar ngrok: Ctrl+P, pegamos el siguiente comando ext install joaompinto.asciidoctor-vscode y pulsamos enter.

Extensiones para teletrabajo

En este apartado recopilaremos las principales extensiones para Visual Studio Code que facilitarán el trabajo en remoto.

Extensión Descripción

Remote Development

Conjunto de extensiones que permiten el trabajo en una máquina remota vía SSH, el trabajo dentro de un contenedor Docker o hacer uso de Windows Subsystem Linux para trabajar contra una máquina windows. Este pack se compone de las extensiones: Remote - SSH, Remote - Containers y Remote - WSL.

Instalación: Ctrl+P ext install ms-vscode-remote.vscode-remote-extensionpack

LiveShare

Conjunto de extensiones que permite compartir tu espacio de trabajo con otros compañeros. Entre sus funcionalidades destacan la posibilidad de compartir instancias del terminal, llamadas de voz, realizar comentarios en el código, …​ Ideal para metodologías que hacen uso del trabajo en parejas (aunque se encuentren en remoto). Para más información consultar la página de Visual Studio Live Share.

Instalación: Ctrl+P ext install MS-vsliveshare.vsliveshare-pack

GitLens

Extensión que añade más funcionalidades para trabajar código en repositorios Git. Más información en la página de GitLens.

Instalación: Ctrl+P ext install eamodio.gitlens

ActivityWatch

Extensión que se integra con ActivityWatch para realizar el seguimiento del trabajo en el editor.

Instalación: Ctrl+P ext install activitywatch.aw-watcher-vscode

En entornos windows es posible instalar un servidor SSH. Consultar la documentación de Microsoft para más información.

Sistemas de Control de Versiones

El control de versiones en los proyectos software es fundamental. Seguramente ya estés usando un sistema de control de versiones, ya sea subversion, git u otros. Si el sistema a emplear en la organización viene determinado por la propia empresa poco podemos hacer.

A continuación hablaremos de soluciones basadas en Git, un software de control de versiones distribuído y que nos permite trabajar con distintas configuraciones de nuestro entorno. Podremos trabajar en nuestro equipo con Git y enviar los cambios a un sistema de control de versiones centralizado como subversion.

Visual Studio Code viene con integración con git. Sus funcionalidades que pueden ser ampliadas usando extensiones como GitLens.

RabbitVCS, cliente gráfico para Subversion y Git

rabbitvcs logo
sudo add-apt-repository ppa:rabbitvcs/ppa
sudo apt update

# for the Nautilus
sudo apt install rabbitvcs-nautilus3

# for the Thunar extensions
sudo apt install rabbitvcs-thunar

# for the GEdit extension
sudo apt install rabbitvcs-gedit

# for the command line launchers
sudo apt install rabbitvcs-cli

Gitea

Gitea

Gitea, Git with a cup of tea, es una solución de alojamiento de código escrita en lenguaje Go y bajo licencia MIT. Gitea es un fork de links:https://gogs.io/[Googs]. En otras palabras, un software para disponer de un Github propio.

Gitea proporciona una serie de características adicionales a las de un simple repositorio git. Si lo único que se necesita es versionar los ficheros de un proyecto podemos limitarnos a configurar git en un servidor. Por el contrario, si estamos buscando una solución de alojamiento git del estilo de Github, Gitlab o Bitbucket, y queremos tener todo alojado en nuestros servidores, Gitea nos proporciona ese servicio. Uno de los eslogan de la página de inicio de Gitea es: "Gitea has low minimal requirements and can run on an inexpensive Raspberry Pi.", lo que da una medida de los pocos requisitos hardware necesarios para lanzar el servicio.

Las soluciones de alojamiento git: github, gitlab y bitbucket, también permiten repositorios privados. Si tu organización no impone ninguna limitación sobre donde alojar el código, y la legislación tampoco establece ninguna restricción pueden ser servicios muy útiles. Recuerda: «Cuando un producto es gratis, el producto eres tú.».

En la propia documentación del proyecto se recogen distintas métodos de instalación. A continuación nos centramos en la instalación con Docker. Los requisitos para la instalación de Gitea con docker son tener docker instalado y configurado y la herramienta de línea de comandos Docker Compose.

La instalación más simple requiere crear un directorio con nombre gitea que será donde se guarden nuestros datos. En el directorio que contiene la carpeta gitea se crea el fichero docker-compose.yml, cuyo contenido se detalla a continuación, y que se puede descargar desde el repositorio de esta guía.

Otras configuraciones avanzadas pueden requerir el uso de base de datos MySQL, PostgreSQL, …​ que se detallan en la documentación oficial.
Fichero docker-compose.yml para lanzar Gitea
version: "2"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    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"

Para lanzar el contenedor con Gitea ejecutamos la siguiente sentencia:

# Para lanzar el contenedor con gitea
docker-compose up

Una vez lanzado el contenedor estará disponible el puerto 222 para acceso por SSH y poder trabajar con git. En localhost:3000 tendremos la interfaz web, un diseño muy similar al que utiliza Github.

gitea web
Figura 8. Pantallazo de un proyecto en Gitea

Otras soluciones

Java en remoto

Este apartado trata de recopilar información relacionada con el desarrollo en Java y la necesidad de conectividad con los servicios de la organización en remoto. Si la conectividad se realiza a través de una VPN es posible que el entorno de trabajo funcione sin ningún cambio, de igual modo al trabajo que se realizaba en el puesto de la organización. Posibles problemas serán derivados de rutas y conectividad.

Configurar ProxySocks

Maven es una de las herramientas de gestión de dependencias y construcción de código Java más utilizadas. Las organizaciones suelen contar con accesos restringidos a determinados recursos que requieren que determinadas aplicaciones se conecten a través de un proxy.

En el caso de trabajar con la herramienta maven pueden aparecer problemas de conectividad al intentar conectarnos a repositorios remotos para descargar las dependencias requeridas. Para ello podemos indicar a Maven que use un proxy para conectarse.

# Solución 1: crear variable de contorno
export MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1337"

# Executar con parámetros
mvn -U clean install -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1337

Esta misma configuración puede emplearse a la hora de lanzar aplicaciones java empaquetadas como un artefacto JAR. A continuación se muestra un ejemplo de uso:

java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -jar my-application.war

Bases de datos

Clientes de base de datos

Existen infinidad de clientes para trabajar con base de datos. El objetivo de este apartado es documentar las herramientas para trabajar con base de datos en entornos de teletrabalo.

DBCli

Bajo el paraguas de DBCli se recogen varios clientes de base de datos de línea de comandos, entre ellos:

mssql-cli

Para instalar mssql-cli se puede emplear PIP.

En el apartado de utilidades se detalla como instalar PIP.

python -m pip install mssql-cli

Beekeeper

Beekeeper Studio es una herramienta desarrollada en Electron para consultar y gestionar bases de datos, como MySQL, Postgres, SQLite o SQL Server.

wget --quiet -O - https://bintray.com/user/downloadSubjectPublicKey?username=bintray \
  | sudo apt-key add -
echo "deb https://dl.bintray.com/beekeeper-studio/releases disco main" \
  | sudo tee /etc/apt/sources.list.d/beekeeper-studio.list
sudo apt install beekeeper-studio

DBeaver

DBeaver

DBeaver Community es un cliente de base de datos universal, bajo licencia Apache Software License (ASL). Es una herramienta tanto para desarrolladores como administradores de base de datos. Cuenta con una versión Enterprise con funcionalidades adicionales.

DBeaver tiene un apartado de configuración avanzada en las conexiones que permite conectarse a través de túneles SSH.

dbeaver conf
Figura 9. Pantallazo de la configuración de la conexión a través de SSH

Otros clientes de base de datos

Sistemas de Videoconferencia y Mensajería

Para poder coordinar el trabajo o relacionarse con un cliente siempre podemos echar mano del correo electrónico. Pero cuando necesitamos profundizar en determinados cuestiones, sin perder excesivo tiempo, es necesario hablar cara a cara. Para estas situaciones tenemos disponibles muchas tecnologías como Skype, Microsoft Teams, Zoom, …​ Estas soluciones, con múltiples funcionalidades adicionales, siempre están bajo una sombra de sospecha de utilización de los datos de los usuarios como contraprestación.

Si deseamos disponer de una solución en la que nosotros tengamos el control podemos instalar nuestro propio sistema de videoconferencia.

Jitsi Meet

Jitsi

Jitsi Meet es un software de videoconferencia de código abierto, bajo licencia Apache License 2.0, que hace uso de WebRTC para establecer la comunicación en tiempo real. El cliente de Jitsi Meet funciona directamente en el navegador, sin la necesidad de instalar software adicional, aunque también cuenta con aplicaciones nativas para iOS, Android o Electron.

Instalación jitsi meet

La instalación del servidor de Jitsi en sabores Debian de GNU/Linux es sencilla. Basándonos en el tipo de servidor que preparamos en el capítulo sobre Digital Ocean la instalación sobre un servidor Ubuntu Server sería la siguiente:

sudo wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | apt-key add -
sudo sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
sudo apt-get -y update
sudo apt-get -y install jitsi-meet

En el paso de la instalación del paquete jitsi-meet con apt se nos preguntará por un nombre de dominio FQDN. Para el correcto funcionamiento de Jitsi es necesario un nombre de dominio FQDN y trabajar sobre HTTPS. El instalador da la opción de generar un certificado autofirmado o emplear uno que ya tengamos. Si deseamos hacer uso de Let’s Encrypt seleccionamos la opción de certificado autofirmado y posteriormente podremos ejecutar un script que automatiza el proceso de petición a Let’s Encrypt.

Si no deseamos exponer a internet el servidor podremos hacer uso del sistema de videoconferencia dentro de la VPN corporativa. Para la resolución de nombres puede hacerse uso de un DNS interno o incluír en todos los equipos la entrada en el fichero /etc/hosts.

En el caso de trabajar en el servidor con un certificado autofirmado las aplicaciones móviles no funcionarán debido a las restricciones que tienen de no aceptar estos certificados.

Para completar la instalación de Jitsi Meet podemos ejecutar el script para generar el certificado asociado al nombre de dominio que proporcionamos en el proceso de instalación.

sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

Uso de Jitsi Meet

Para crear una videoconferencia basta con ir al dominio de nuestro servidor y nos aparecerá un campo para establecer el nombre de la sala. Nos permite establecer una contraseña a acceder a la sala y proporciona un enlace para compartir con el acceso a la misma.

jitsi 01
Figura 10. Pantallazo de Jitsi Meet en funcionamiento

La versatibilidad del Jitsi está en la posibilidad de entablar una videoconferencia con el único requisito de disponer de un navegador web que soporte WebRTC. También están disponibles aplicaciones de escritorio como Jitsi Meet Electron, que en la práctica no deja de ser un navegador chrome embebido en una aplicación con el uso de Electron

jitsi 02
Figura 11. Aplicación de electron para Jitsi Meet

Securizando Jitsi Meet

Para securizar Jitsi y requerir autenticación a los asistentes es preciso realizar unas configuraciones adicionales.

Instalar jigasi, una aplicación que permite la autenticación en Jitsi-meet.

sudo apt-get install jigasi -y

Durante la instalación se requerirá una cuenta SIP y una contraseña asociada a la cuenta. Editar el fichero de configuración de prosody en /etc/prosody/conf.avail/DOMINIO.cfg.lua. Localizar en el virtual host asociado al hostname y cambiar las opciones de autenticación a "internal_plain".

VirtualHost "DOMINIO"
authentication = "internal_plain"

En la configuración de jicofo se necesita especificar una configuración adicional. Añadir el dominio con el siguiente comando:

cat "org.jitsi.jicofo.auth.URL=XMPP:DOMINIO" >> /etc/jitsi/jicofo/sip-communicator.properties

Crear un usuario usando prosodyctl. Este comando crea usuarios con permiso para iniciar sesión en Jitsi-meet.

sudo prosodyctl register USERNAME DOMINIO PASSWORD

Para finalizar reiniciar los servicios asociados y al entrar de nuevo por el navegador se requieren credenciales.

jitsi credenciales
Figura 12. Solicitud de credenciales en Jitsi Meet

Together, servicio de Jitsi en Brave

Brave es un navegador que se centra en la privacidad de las personas e integraron el servicio de Jitsi en su navegador.

Para instalar el navegador Brave en distribuciones derivadas de Debian seguir los siguientes pasos:

# Instalar repositorio
curl -s https://brave-browser-apt-release.s3.brave.com/brave-core.asc | sudo apt-key --keyring /etc/apt/trusted.gpg.d/brave-browser-release.gpg add -

echo "deb [arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main" | sudo tee /etc/apt/sources.list.d/brave-browser-release.list

sudo apt update

sudo apt install brave-browser
jitsi brave
Figura 13. Navegador Brave y su servicio Together

En la comunidad de Brave está disponible una sección sobre Together.

Otras alternativas

Utilidades

Productividad en el escritorio

Se recogen a continuación una serie de herramientas y técnicas para ser más productivo en un ambiente de teletrabajo.

Técnica Pomodoro

La procastinación puede ser un problema en un entorno de teletrabajo. Por ello podemos ayudarnos de la técnica pomodoro que permite administrar el tiempo más eficientemente.

Pomodoro

La Técnica Pomodoro es un método para mejorar la administración del tiempo dedicado a una actividad. Fue desarrollado por Francesco Cirillo a finales de la década de 1980. Para ello se usa un temporizador para dividir el tiempo en intervalos indivisibles, llamados pomodoros, de 25 minutos de actividad, seguidos de 5 minutos de descanso, con pausas más largas cada cuatro pomodoros.

La mecánica básica puede resumirse en los siguientes pasos:

  • Decidir la tarea o actividad a realizar

  • Poner el temporizador

  • Trabajar en la tarea de manera intensiva hasta que el temporizador suene

  • Hacer una marca para anotar qué pomodoro se ha completado

  • Tomar una pausa breve

  • Cada cuatro pomodoros, tomar una pausa más larga

El nombre de pomodoro, del italiano "Tomate", viene de la forma de tomate del clásico reloj de cocina que usó el creador de la técnica, el italiano Francesco Cirillo, cuando era un estudiante universitario.

En lugar de emplear un reloj de cocina existen múltiples aplicaciones que "implementan" la técnica de pomodoro y vienen con gestión de tareas y temporizadores para los pomodoros y descansos.

Super Productivy

Superproductivity

Super Productivity, es una herramienta open source diseñada para programadores y diseñadores, disponible para GNU/Linux, MacOS y windows, bajo licencia MIT. Permite organizar los datos (notas, ficheros adjuntos, marcadores, …​) en proyectos y tiene integración con las _issues de Jira (Attlasian).

El software puede descargarse desde el apartado de releases en Github. Cuenta con paquetes .deb (Debian/Ubuntu), .dmg (MacOS), .exe (windows), versión para Snap y empaquetado como AppImage (en su versión 5.0.15 del 29/04/2020 tiene un tamaño de 76.9 MB). La aplicación también está disponible en su versión Web App almacenando la información en el navegador utilizando los APIs de web storage de HTML5.

Instalación vía Snap
sudo snap install superproductivity
superproductivity conf
Figura 14. Pantallazo de SuperProductivity en funcionamiento
Pomotroid

Pomotroid

Pomotroid es un software disponible para GNU/Linux, Macos y Windows, bajo licencia MIT, que permite disponer de un temporizador con la cuenta atrás siguiendo la técnica Pomodoro. Tiene una interfaz simple, configurable y muy visual con el temporizador para los pomodoros.

pomotroid screens
Figura 15. Pantallazos de pomotroid

Pomotroid está disponible en el apartado de releases de Github, y también con Homebrew, Snap, …​

snap install pomotroid
pomo.sh, un pomodoro en Bash

Soluciones como Super Productivity o Pomotroid son muy simples, a la par visuales. Como handicap de estas aplicaciones indicar que, para la funcionalidad que proporcionan, su tamaño es desproporcionado. El hecho de estar desarrolladas en Electron les implica el lastre de un peso excesivo. Por contra Electron simplifica su desarrollo multiplataforma.

pomo.sh es un simple temporizador escrito en un script en bash (8KB) con dependencias mínimas. Fue diseñado para un uso fácil desde línea de comandos, lo que implica disponer de un entorno con bash. En el caso de windows puedes utilizar el script con WSL, o en versiones anteriores a windows 10 puede usarse Cygwin.

Uso de pomo.sh
# Clonar repositorio para descargar el script
git clone https://github.com/jsspencer/pomo.git && cd pomo

# Empezar un pomodoro
pomo.sh start

# Ver tiempo restante
pomo.sh clock

# Lanzar una notificación del sistema
pomo.sh notify &

# Otros parámetros para el script
# pomo.sh [-h] [ stop | pause | restart | usage ]

ActivityWatch

ActivityWatch

ActivityWatch es una aplicación que hace un seguimiento automático del trabajo que se realiza en tus dispositivos. Sin necesidad de indicar cuál es el trabajo que se está realizando ActivityWatch monitorizará las aplicaciones que tengamos abiertas y controlará si estamos, o no, tecleando o trabajando con el ratón.

ActivityWatch cuenta con extensiones para los principales IDE y editores (VS Code, Jetbrains o Atom). Con estas extensiones ActivityWatch puede monitorizar en cuales ficheros estamos trabajando para tener un informe detallado.

A nivel de navegadores web también están disponibles extensiones que monitorizan las pestañas con las que estamos trabajando. ActivityWatch permite categorizar estas pestañas para tener unos informes más personalizados. Por ejemplo: podremos indicar que las pestañas de gmail, outlook u otros clientes de correo estén categorizadas como "Correo".

activitywatch timeline
Figura 16. Detalle de la línea de tiempo de ActivityWatch

En otros casos, que no sean editores o navegadores, ActivityWatch realiza un seguimiento de las aplicaciones con las que estemos trabajando. Cuando una aplicación esté en primer plano registrará el título de la ventana.

La aplicación también proporciona un API para integrar con otras aplicaciones que deseemos.

Esta herramienta es muy intrusiva. Como contrapartida los datos solamente quedan registrados en nuestro equipo.

Barrier, Open Source KVM

Barrier

Barrier es un KVM open source con licencia GPL versión 2. Es un fork de Synergy. Bajo el eslogan Barrier elimina las "barreras" entre tus máquina, la herramienta permite el trabajo con varios equipos desde el teclado y ratón de uno de ellos. La herramienta está disponible para gnu/linux, windows y macos.

Barrier permite configurar un equipo como servidor en el cual le indicaremos la disposición de los otros equipos. La disposición de los equipos será la que tenga en cuenta el ratón a la hora de circular entre los distintos equipos. En los equipos cliente será necesario instalar también Barrier e indicar cual será el servidor. Cuenta con la opción de detectar automáticamente el servidor pero es necesario instalar software adicional.

barrier conf
Figura 17. Configuración de la disposición de pantallas en Barrier

El software está desde el apartado de releases en su repositorio de GitHub.

KDE Connect y GSConnect

Cada vez es más habitual realizar determinadas tareas del trabajo desde el dispositivo móvil propio, o de la empresa, y necesitamos alguna forma de compartir ficheros con el equipo de escritorio o el portátil.

KDEConnect

KDE Connect permite a los dispositivos móviles compartir contenidos como las notificaciones o ficheros y otras características como envío de SMS o control remoto. Y GSConnect es una implementación de KDE Connect para escritorios GNOME Shell con integración con Nautilus, Chrome y Firefox.

A continuación hablaremos de KDE Connect por ser el primero en aparecer. Entre las funcionalidades que proporciona KDE Connect destacar:

  • Integración con el navegador, controlando el contenido de youtube o netflix desde el teléfono, o en otro sentido enviar pestañas del navegador al teléfono.

  • Compartir el portapapeles, copiando un texto en el escritorio estará disponible en el portapapeles del teléfono, y viceversa.

  • Ver el estado de la batería desde el escritorio.

  • Recibir las notificaciones del teléfono en el escritorio, y viceversa.

  • Controlar con el teléfono el software multimedia del escritorio.

  • Explorador remoto de ficheros del teléfono, en el escritorio aparecerá un nuevo dispositivo sobre el que navegar por los ficheros.

  • Integración con el teléfono, con las llamadas entrantes aparecerá una notificación informando de quién nos llama.

  • Ejecución remota de comandos sobre el equipo de escritorio desde el teléfono.

  • Usar el télefono como un touchpad para controlar de forma remota el ordenador.

Otras funcionalidades pueden ser desarrolladas para KDE Connect por estar diseñado siguiendo una arquitectura de plugins.

Los sistemas móviles soportados son Android, Plasma Mobile, SailfishOS, entre otros. La aplicación para dispositivos Android está en Google Play y en FDroid.

kdeconnect conf
Figura 18. Pantallazo de la configuración de escritorio y las funciones en dispositivos móviles

En las versiones de KDE viene incluído KDE Connect y en el panel de notificaciones aparecerá el icono desde el cual se puede configurar los dispositivos a los que se tendrá acceso. KDE Connect también se puede instalar en otros escritorios, por ejemplo, en Linux Mint con Mate, dando soporte a escritorios basados en GTK. Pero si buscamos una mejor integración con GNOME está disponible GSConnect.

CopyQ

Snap

CopyQ es un gestor avanzado del portapapeles. Al trabajar con código o comandos es habitual copiar y pegar, y resulta útil disponer de un histórico de los snippets copiados para poder reutilizar.

Entre sus características:

  • Soporte para GNU/Linux, Windows y MacOS

  • Almacena texto, HTML, imágenes o cualquier otro formato

  • Navegación rápida y filtro de elementos del portapapeles

  • Añadir notas o etiquetas a los ítems guardados

  • Comandos personalizables

  • API avanzada para línea de comandos y scripting

copyq open
Figura 19. Pantallazo de CopyQ

Gestores de paquetes software

Los gestores de paquetes nos van a facilitar la instalación y gestión de software. Permitidme hacer una distinción entre gestores de paquetes del sistema operativo, como pueden ser APT (Debian/Ubuntu) o DNF (Fedora), de gestores de distribución de aplicaciones con las dependencias incluídas como Snap o Flatpak, y los gestores de paquetes de bibliotecas que están orientadas al desarrollo y pueden incluír utilidades que hacen uso de las bibliotecas, como pip (Python), gem (ruby), npm (nodejs), …​

HomeBrew

Homebrew

El gestor de paquetes Homebrew disponible en entorno MacOS también puede ser utilizado en GNU/Linux y Windows Subsystem for Linux (WSL). A diferencia de los gestores de paquetes del sistema operativo el software es instalado en el directorio home, que no requiere el uso de sudo.

Las características principales de LinuxBrew:

  • Poder instalar software en el directorio home del usuario sin la necesidad de requerir sudo.

  • Instalar software que no está disponible en el sistema.

  • Instalar versiones más actualizadas cuando el sistema no permite dichas versiones.

  • Emplear el mismo gestor de paquetes, tanto para macOS, Linux o Windows.

Pasos de instalación:

sudo apt-get install build-essential curl file git
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Este proceso de instalación crea un usuario linuxbrew y una estructura de directorios debajo del directorio oculto .linuxbrew. En esta estructura es donde se almacenan los distintos binarios y demás ficheros necesarios de las aplicaciones que se instalen con LinuxBrew.

/home/linuxbrew/.linuxbrew/
                ├── bin
                ├── Caskroom
                ├── Cellar
                ├── etc
                ├── Frameworks
                ├── Homebrew
                ├── include
                ├── lib
                ├── opt
                ├── sbin
                ├── share
                └── var

Una vez instalado podremos gestionar los paquetes desde línea de comandos:

# Buscar el paquete Monit
brew search monit

# Instalar Monit
brew install monit

Snap

Snap

Snap es un sistema de empaquetado para aplicaciones que fue introducido por Ubuntu en su versión 16.04 y que busca ser el estándar para distribuir aplicaciones. Snap busca evitar los problemas de las dependencias de librerías que aparecen entre las distintas versiones de los sistemas GNU/Linux, incluyendo las dependencias en el propio paquete. No es una solución exclusiva de Canonical/Ubuntu sino que está disponible en más de 40 distribuciones como Fedora o Arch Linux.

Para instalar Snap en distribuciones basadas en Ubuntu/Debian:

sudo apt-get install snapd

Los distintos paquetes que se pueden instalar están disponibles en su store y podemos buscarlos directamente desde línea de comandos.

# Buscar un paquete snap, por ejemplo ngrok
snap search ngrok

# Instalar el paquete
snap install ngrok

PIP

PIP es el gestor de paquetes de Python y suele estar instalado en los sistemas que usan Python 2 ( versiones >=2.7.9) o Python 3 (versiones >=3.4).