Cómo instalar el Servidor de Notas Estándar en Ubuntu 22.04

Standard Notes es una aplicación de notas de código abierto y completamente encriptada. Ofrece planes gratuitos y de pago y ofrece tanto el alojamiento en la nube como la opción de alojarlo en tu servidor. Puedes utilizar tu servidor para sincronizar las notas almacenadas entre diferentes dispositivos. Standard Notes ofrece aplicaciones para todos los sistemas operativos de escritorio y plataformas móviles.

En este tutorial, aprenderás a autoalojar tu servidor de Standard Notes en una máquina Ubuntu 22.04. También aprenderás a activar las funciones del plan de pago y la carga de archivos en tu instancia autoalojada.

Requisitos previos

  • Un servidor con Ubuntu 22.04 con un mínimo de 2 GB de RAM.

  • Un usuario no root con privilegios sudo.

  • El cortafuegos sin complicaciones (UFW) está activado y en funcionamiento.

  • Un nombre de dominio totalmente cualificado que apunte al servidor. Para nuestro tutorial, utilizaremos el dominio standardnotes.example.com. Necesitarás otro nombre de dominio para tu servidor de archivos. Nosotros utilizaremos el dominio snotes-files.example.com.

  • Todo está actualizado.

    $ sudo apt update && sudo apt upgrade
    

Paso 1 – Configurar el cortafuegos

El primer paso antes de instalar cualquier paquete es configurar el cortafuegos para que permita las conexiones HTTP y HTTPS.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Permitir puertos HTTP y HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Paso 2 – Instala Docker y Docker Compose

Añade la clave GPG oficial de Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Ejecuta el siguiente comando para añadir el repositorio de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza el sistema para incluir el repositorio de Docker.

$ sudo apt update

Instala Docker.

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Este tutorial utilizará el plugin Docker Compose v2 en lugar del antiguo binario heredado. Por lo tanto, el comando para ejecutarlo ha cambiado de docker-compose a docker compose y esto se refleja aquí.

Docker se ejecuta con privilegios elevados, por lo que tendrás que utilizar frecuentemente sudo para ejecutar los comandos. La mejor opción es añadir tu cuenta de usuario de Linux al grupo de usuarios docker.

$ sudo usermod -aG docker ${USER}

La variable ${USER} recoge la cuenta del sistema con la que se ha iniciado la sesión. Si no estás conectado con el usuario al que quieres dar privilegios, sustituye ${USER} por el nombre de usuario.

Para solicitar la pertenencia al nuevo grupo, sal del servidor y vuelve a entrar, o utiliza el siguiente comando. Se te pedirá la contraseña del usuario.

$ su - $(USER)

Paso 3 – Instalar Nginx

Ubuntu 22.04 viene con una versión antigua de Nginx. Para instalar la última versión, necesitas descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añadir el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instalar Nginx.

$ sudo apt install nginx

Verificar la instalación.

$ nginx -v
nginx version: nginx/1.22.0

Paso 4 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Ubuntu o coger la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Ubuntu 22.04 viene con Snapd instalado por defecto. Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que el comando Certbot se puede ejecutar creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Ejecuta el siguiente comando para generar un certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d standardnotes.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/standardnotes.example.com de tu servidor.

Tenemos que hacer lo mismo para el subdominio Archivos.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d snotes-files.example.com

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Abre el archivo /etc/letsencrypt/renewal/standardnotes.example.com.conf para editarlo.

$ sudo nano /etc/letsencrypt/renewal/standardnotes.example.com.conf

Pega el siguiente código en la parte inferior.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Repite el mismo paso para el subdominio de archivos editando el archivo /etc/letsencrypt/renewal/snotes-files.example.com.conf.

Hemos generado el certificado SSL utilizando la opción autónoma de Certbot. Este ejecuta su servidor web para crear el certificado, lo que significa que Nginx debe estar apagado durante la renovación. Los comandos pre_hook y post_hook se ejecutan antes y después de la renovación para cerrar y reiniciar automáticamente el servidor Nginx, por lo que no es necesaria la intervención manual.

Para comprobar si la renovación de SSL funciona bien, haz una ejecución en seco del proceso.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 5 – Descargar y configurar las notas estándar

Asegúrate de que estás en el directorio principal de tu sistema.

$ cd ~

Clona el repositorio de Standard Notes Standalone.

$ git clone --single-branch --branch main https://github.com/standardnotes/standalone.git

Cambia al directorio descargado.

$ cd standalone

Crea los archivos de configuración por defecto para el servidor.

$ ./server.sh setup

Esto creará los archivos de entorno por defecto que tenemos que configurar. Necesitas generar seis claves secretas diferentes. Utiliza los siguientes comandos para generarlas.

$ openssl rand -hex 32

Primero, tenemos que editar el archivo .env en la carpeta principal. Ábrelo para editarlo.

$ nano .env

Cambia los valores de las siguientes variables.

NODE_ENV=production
..
AUTH_JWT_SECRET=c0f5bcf6f0f0dcca5b9078c3095e4255a055dfd6376b376733af0e50483cc629
..
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme123
..
VALET_TOKEN_SECRET=977c978ca1d5ea22fe2fda65058905b191f724e33db6e47d0a41e034a082cb3b
..
FILES_SERVER_URL=https://snotes-files.example.com

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

A continuación, abre el archivo docker/auth.env.

$ nano  docker/auth.env

Cambia los valores de las siguientes variables.

JWT_SECRET=54deb1b0b2499e8d875b0d5266dabef9003e13c1787a959a94e339363c10e56e
LEGACY_JWT_SECRET=c36aae01803a616213f22422b6d3f998a2beb2cb53af8b95bf578a8a3d046cec
..
PSEUDO_KEY_PARAMS_KEY=ea09d3f9122b49c653524cd2285a45fee88beb94f9b76d4d25420b521b080fcd
..
ENCRYPTION_SERVER_KEY=04decf379fbe3bb48cf95dbb5997031418b308e724a25d88cb0b2ed6da725efe

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Paso 6 – Iniciar el servidor de Standard Notes

Ejecuta el siguiente comando para iniciar el servidor.

$ ./server.sh start

Este comando tardará unos minutos en completarse. Durante este tiempo, el proceso extraerá todas las imágenes Docker pertinentes y creará contenedores para todos los servicios. También rellenará la base de datos y realizará las migraciones pertinentes.

Puedes comprobar los registros del proceso con el siguiente comando.

$ ./server.sh logs

Pulsa Ctrl + C para salir de los registros. Puedes comprobar el estado de los contenedores en ejecución utilizando el siguiente comando.

$ ./server.sh status

Recibirás una salida similar.

Services State:
NAME                                  COMMAND                  SERVICE                    STATUS              PORTS
api-gateway-standalone                "./wait-for.sh auth …"   api-gateway                running             0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
auth-standalone                       "./wait-for.sh db 33…"   auth                       running
auth-worker-standalone                "./wait-for.sh db 33…"   auth-worker                running
cache-standalone                      "docker-entrypoint.s…"   cache                      running             6379/tcp
db-standalone                         "docker-entrypoint.s…"   db                         running             3306/tcp
files-standalone                      "./wait-for.sh db 33…"   files                      running             0.0.0.0:3125->3000/tcp, :::3125->3000/tcp
syncing-server-js-standalone          "./wait-for.sh db 33…"   syncing-server-js          running
syncing-server-js-worker-standalone   "./wait-for.sh db 33…"   syncing-server-js-worker   running

Puedes comprobar la salud del servidor utilizando el siguiente comando.

$ curl http://localhost:3000/healthcheck
OK

Standard Notes utiliza el puerto 3000 por defecto. Si has configurado un puerto diferente en el archivo .env, debes actualizarlo en el comando anterior.

Paso 7 – Configurar Nginx

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Crea y abre el archivo /etc/nginx/conf.d/standardnotes.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/standardnotes.conf

Pega en él el siguiente código. Sustituye standardnotes.example.com por el nombre de tu dominio. Hemos fijado el valor de client_max_body_size en 50MB. Puedes cambiarlo según tus necesidades.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name standardnotes.example.com;

    client_max_body_size 50M;

    access_log  /var/log/nginx/standardnotes.access.log;
    error_log   /var/log/nginx/standardnotes.error.log;

    ssl_certificate      /etc/letsencrypt/live/standardnotes.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/standardnotes.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/standardnotes.example.com/chain.pem;
    
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_cache off;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  standardnotes.example.com;
    return 301   https://$host$request_uri;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

El archivo anterior es para la aplicación principal de Standard Notes. A continuación, tenemos que configurar otro archivo para el subdominio Archivos.

$ sudo nano /etc/nginx/conf.d/files-standardnotes.conf

Pega en él el siguiente código. Sustituye snotes-files.example.com por el nombre de tu dominio. Hemos establecido el valor de la variable client_max_body_size en 50MB. Puedes cambiarlo según tus necesidades.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name snotes-files.example.com;

    client_max_body_size 50M;

    access_log  /var/log/nginx/files-standardnotes.access.log;
    error_log   /var/log/nginx/files-standardnotes.error.log;

    ssl_certificate      /etc/letsencrypt/live/snotes-files.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/snotes-files.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/snotes-files.example.com/chain.pem;
    
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://127.0.0.1:3125;
        proxy_cache off;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  snotes-files.example.com;
    return 301   https://$host$request_uri;
}

Comprueba la configuración de Nginx.

$ sudo nginx -t

Reinicia el servidor Nginx para habilitar los archivos de configuración.

$ sudo systemctl restart nginx

Paso 8 – Utilizar notas estándar

Si abres la URL https://standardnotes.example.com en tu navegador, deberías ver la siguiente salida.

Página de inicio de la URL de Notas Estándar

Esto significa que tu servidor está en funcionamiento. Para utilizar Standard Notes, tendrás que usar las aplicaciones oficiales. Para nuestro tutorial, utilizaremos su aplicación web, pero el método será el mismo para las aplicaciones de escritorio y móvil.

Abre la URL https://app.standardnotes.com para acceder a la aplicación web. Haz clic en el enlace Crear cuenta gratuita en la parte inferior izquierda de la página e introduce tu dirección de correo electrónico y tu contraseña. Haz clic en el botón Funciones avanzadas y desmarca la opción Servidor de sincronización personalizado e introduce la URL https://standardnotes.example.com en la casilla.

Notas estándar Crear cuenta

Una vez iniciada la sesión, puedes empezar a crear notas y a utilizar la aplicación.

Paso 9 – Habilitar las funciones de pago

Hasta ahora, hemos habilitado la funcionalidad básica de la aplicación Notas Estándar. La aplicación ofrece algunas funciones avanzadas como múltiples formatos de notas, almacenamiento encriptado en la nube, un historial de revisiones más largo y mucho más.

Para la aplicación alojada en la nube, puedes pagar directamente para habilitar las funciones avanzadas. Pero para la aplicación autoalojada, no puedes pagar por las funciones avanzadas ya que la aplicación de pago no funciona. Sin embargo, puedes donarlas. Pero para habilitar las funciones de pago en una aplicación autoalojada, tienes que ejecutar el siguiente comando desde el directorio de Notas Estándar.

$ cd ~/standardnotes
$ bash ./server.sh create-subscription [email protected]

Recarga la aplicación web y las funciones de pago deberían estar activadas para tu cuenta.

Paso 10 – Configurar el servidor para la subida de archivos

La subida de archivos es una función de pago de Standard Notes. Hemos activado la URL de la API personalizada para la subida de archivos. Pero todavía no funcionan. Para que funcionen, tenemos que dar los permisos adecuados al directorio de subidas. Las subidas se almacenan en el directorio ~/standardnotes/data/uploads. Ejecuta los siguientes comandos para cambiar los permisos.

$ chmod -R 775 data
$ mkdir -p data/uploads
$ sudo chmod -R 755 data/uploads
$ sudo chown -R 1001.1001 data/uploads

Ahora, Standard Notes establece el cero como límite de subida para cada usuario. Esto significa que ningún usuario puede subir archivos a menos que se le asigne una cuota manualmente. Por lo tanto, el último paso para hacer que la subida de archivos funcione es habilitar la cuota de archivos para la cuenta de usuario de pago. Podemos hacerlo realizando una consulta SQL dentro del contenedor de la base de datos.

Accede al shell de MySQL dentro del contenedor de la base de datos.

$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:

Una vez dentro del shell de MySQL, vamos a comprobar la lista de bases de datos.

mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| standard_notes_db  |
+--------------------+
2 rows in set (0.00 sec)

Cambia a la base de datos Standard Notes.

mysql > use standard_notes_db;

Ejecuta el siguiente comando SQL para añadir una cuota de archivo de 10 GB al usuario de pago activado anteriormente.

mysql> INSERT INTO subscription_settings(uuid, name, value, created_at, updated_at, user_subscription_uuid) VALUES (UUID(), "FILE_UPLOAD_BYTES_LIMIT", 10737418240, FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), (SELECT us.uuid FROM user_subscriptions us INNER JOIN users u ON us.user_uuid=u.uuid WHERE u.email="[email protected]"));

Aquí 10737418240 se refiere al total de bytes que se traduce en 10GB. Puedes modificar este número a lo que necesites.

Sal del shell de MySQL y del contenedor de la base de datos.

mysql > exit

Paso 11 – Probar la carga de archivos

Accede a la aplicación web de Standard Notes y haz clic en el icono de archivos adjuntos de la fila superior.

Icono de adjuntar notas estándar

Haz clic en el botón Subir archivos y selecciona el archivo que quieres subir. El archivo se subirá con éxito y podrás verlo en la lista haciendo clic de nuevo en el icono.

Notas estándar Archivo adjunto

Haz clic en los tres puntos que aparecen junto al nombre del archivo para que aparezcan opciones adicionales relacionadas con el archivo.

Opciones del archivo de notas estándar

Haz clic en el enlace Adjuntar a la nota para añadir la imagen a la nota. El resto de las opciones se explican por sí mismas.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración del servidor Standard Notes en una máquina Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...