Gestión de notas
En la actualidad, la mayoría de nosotros emplea aplicaciones como Google Keep, Apple Notes o Evernote para organizar ideas, tareas y recordatorios. Sin embargo, estas apps no siempre garantizan la privacidad de nuestros datos.
Nuestras notas digitales incluyen mucho más que listas de la compra: contienen pensamientos personales, ideas creativas y proyectos sensibles. Si estas notas caen manos ajenas, podrían usarse para generar perfiles de usuario con fines publicitarios, o incluso filtrarse tras brechas de seguridad. En definitiva, una fuga de datos significaría perder el control sobre nuestra propia información.
Las recientes filtraciones masivas de datos y el uso de textos de usuarios para entrenar inteligencias artificiales han demostrado que la información privada debe tratarse con extremo cuidado.
Importancia de la privacidad
Proteger la privacidad en nuestras notas digitales no es un lujo, sino una necesidad. Cuando usamos aplicaciones que no protegen adecuadamente nuestros datos, corremos riesgos reales como:
-
Perfiles publicitarios: nuestros hábitos y preferencias pueden ser recopilados para vendernos productos o servicios
-
Filtraciones de datos: información personal o profesional sensible podría hacerse pública por fallos de seguridad o ciberataques
-
Pérdida de control: una vez que nuestros datos residan en plataformas externas, perdemos la capacidad de decidir quién accede a ellos
Proteger nuestras notas nos permite mantener nuestra información personal segura, decidir qué compartimos y cuándo, y garantizar que nuestras ideas sigan siendo exclusivamente nuestras. Las recientes filtraciones masivas de datos y el uso de textos de usuarios para entrenar inteligencias artificiales han demostrado que la información privada debe tratarse con extremo cuidado.
Notas de Apple
Por ejemplo, al usar la app Notas con iCloud activado, nuestras notas se sincronizan en los servidores de Apple. Apple cifra estos datos en tránsito y en reposo, pero en la configuración estándar las claves de cifrado se almacenan en los centros de datos de Apple. Esto significa que Apple podría descifrar las notas para ayudarnos en operaciones como restaurar copias de seguridad. Solo ciertas categoría (contraseñas del llavero, datos de salud, etcétera) están siempre protegidas con cifrado de extremo a extremo.
En cambio, las notas que bloqueamos manualmente con contraseña, Touch ID o Face ID sí se protegen con cifrado de extremo a extremo. Apple describe que las «notas seguras» usan una clave derivada de nuestra contraseña local y se cifra con AES-GCM. De ese modo, sólo nosotros podemos leerlas, ni siquiera Apple tiene la clave de descifrado.
Las notas sin bloqueo siguen cifradas en iCloud, pero Apple guarda las claves necesarias para descifrarla en sus servidores. Así, la empresa puede a ayudarnos a recuperarlas si olvidamos nuestra contraseña, pero esto implica que Apple mantiene acceso potencial al contenido de esas notas.
Desde finales de 2022 [Apple]https://www.apple.com/es/) introdujo la opción de Protección avanzada de datos (iOS 16.2, iPadOS 16.2 o macOS 13.1 o superiores), que extiende el cifrar de extremo a extremo a muchas más categorías de datos, incluidas todas las notas.
Si activamos esta función, Apple deja de guardar las claves de cifrado de iCloud para la mayoría de la información. En ese caso, nuestros datos (como copias de seguridad, fotos, notas, etcétera) sólo se podrán descifrar en dispositivos autorizados, y ni siquiera Apple tendría acceso a ellos. En resumen, con Protección avanzada de datos activada nuestras notas en iCloud pasan a ser 100% privadas en el sentido estricto.
Servicios que respetan nuestra privacidad
Afortunadamente existen alternativas diseñadas pensando en la privacidad por defecto, que ofrecen cifrado de extremo a extremo y evitan recopilar datos innecesarios. Dos ejemplos destacables son Standard Notes y Notesnook. Ambas cuentan con versiones gratuitas bastante funcionales y planes de pago opcionales que amplían sus capacidades. Su principal ventaja es que están pensados para garantizar la privacidad desde el inicio, con arquitecturas de cifrado de conocimiento cero («zero-knowledge») que aseguran que sólo el usuario pueda leer sus propias notas.
Standard Notes
Standard Notes es una app minimalista centrada en la seguridad y simplicidad. Todos los datos del usuario se cifran de extremo a extremo, por lo que solo nosotros tenemos las claves para descifrar el contenido. Esta aplicación es múltiplataforma: es compatible con iOS, Android, MacOS, Windows, GNU/Linux y ofrece también una interfaz web. Aunque la versión básica gratuita incluye todo lo esencial paras tomar notas seguras (notas ilimitadas, etiquetas de búsqueda local, sincronización cifrada entre dispositivos), las características avanzadas (por ejemplo, extensiones, temas personalizados o la opción de autoalojamiento) requieren una suscripción. Sin embargo, incluso sin pagar podemos usar Standard Notes con total confianza en que nuestros datos permanecen encriptados y bajo nuestro control.
Notesnook
Notesnook es otra aplicación enfocada en la privacidad. Ofrece cifrado en extremo a extremo antes de que los datos salgan de nuestro dispositivo, evitando que nadie (ni siquiera la propia compañía) acceda a nuestras notas. Su interfaz es limpia y moderna, y ofrece funciones útiles como etiquetas, carpetas y bloqueo de la app con PIN. Notesnook es multiplataforma, tiene clientes paraiOS, Android, MacOS, Windows, GNU/Linux y también acceso web. En su modelo freemium, la mayoría de funciones esenciales (sincronización básica, notas ilimitadas, etcétera) son gratuitas, mientras que el plan premium añade opciones avanzadas como copias de seguridad automáticas cifradas en la nube y otras herramientas de productividad. Lo relevante es que, tanto en Standard Notes como en Notesnook, nuestro proveedor no puede leer nuestras notas, ya que la arquitectura de cifrado «zero-knowledge» les impide acceder a nuestros contenidos.
Opciones de autoalojamiento
Para quienes preferimos tener un control absoluto de nuestros datos, existe la opción de autoalojar el servicio en nuestra infraestructura (por ejemplo, en un servidor NAS, Proxmox u otro servidor local). Entre las soluciones populares destacan Standard Notes y Joplin en modo servidor. Standard Notes ofrece la posibilidad de autoalojamiento si pagamos su plan más completo, pero la otra alternativa, Joplin, es completamente gratuita.
Joplin
Joplin es una aplicación de código abierto para notas y tareas. Es completamente gratis y ofrece muchas funcionalidades avanzadas. Permite tomar notas en formato Markdown, organizar contenido con etiquetas y libretas, insertar imágenes y archivos, y exportar o respaldar notas fácilmente. Dispone además de un sistema de plugins muy activo y temas de apariencia personalizables, por lo que podemos ampliar sus capacidades prácticamente sin límite. Joplin incluye sincronización automática entre dispositivos: podemos sincronizar con servicios populares (Joplin Cloud) propio, Dropbox, Onedrive), y también con servicios privados mediante WebDAV (por ejemplo, Nextcloud) o incluso Amazon S3. Gracias a esto, nuestras notas pueden compartirse entre móviles, ordenadores o tablets de forma fluida.
Desde hace algunos años Joplin incorpora cifrado de extremo a extremo opcional: si lo activamos en la configuración, nuestras notas quedan protegidas de tal forma que solo nosotros, con nuestra contraseña, podemos descifrarlas.
Joplin ofrece una imagen Docker oficial para desplegar su servidor de sincronización en cualquier máquina. Hay versiones para arquitecturas x86_64 y ARM64, lo que facilita su instalación en un servidor doméstico, una máquina virtual o un NAS compatible. A continuación detallamos los pasos básicos para poner en marcha nuestro propio servidor Joplin en Rocky Linux 10.
Instalación de Docker
Primero, añadimos el repositorio de Docker al gestor de paquetes DNF ejecutando:
[root@joplin ~]# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Tras ejecutarlo, obtendremos una salida similar a:
Agregando repositorio de: https://download.docker.com/linux/centos/docker-ce.repo
A continuación, instalamos los paquetes de Docker ejecutando:
[root@joplin ~]# dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Tras pulsar Intro, se descargarán e instalarán los paquetes correspondientes:
Docker CE Stable - x86_64 87 kB/s | 12 kB 00:00
Dependencias resueltas.
=================================================================================================================================================================================================
Paquete Arquitectura Versión Repositorio Tam.
=================================================================================================================================================================================================
Instalando:
containerd.io x86_64 1.7.27-3.1.el10 docker-ce-stable 44 M
docker-buildx-plugin x86_64 0.26.1-1.el10 docker-ce-stable 16 M
docker-ce x86_64 3:28.3.3-1.el10 docker-ce-stable 21 M
docker-ce-cli x86_64 1:28.3.3-1.el10 docker-ce-stable 8.6 M
docker-compose-plugin x86_64 2.39.1-1.el10 docker-ce-stable 15 M
Instalando dependencias:
container-selinux noarch 4:2.235.0-2.el10_0 appstream 55 k
fuse-common x86_64 3.16.2-5.el10 baseos 8.7 k
fuse-overlayfs x86_64 1.14-2.el10 appstream 66 k
fuse3 x86_64 3.16.2-5.el10 baseos 58 k
libslirp x86_64 4.7.0-10.el10 appstream 74 k
slirp4netns x86_64 1.3.2-1.el10 appstream 46 k
tar x86_64 2:1.35-7.el10 baseos 865 k
Instalando dependencias débiles:
docker-ce-rootless-extras x86_64 28.3.3-1.el10 docker-ce-stable 3.4 M
Resumen de la transacción
=================================================================================================================================================================================================
Instalar 13 Paquetes
Tamaño total de la descarga: 110 M
Tamaño instalado: 438 M
Descargando paquetes:
(1/13): docker-buildx-plugin-0.26.1-1.el10.x86_64.rpm 13 MB/s | 16 MB 00:01
(2/13): docker-ce-28.3.3-1.el10.x86_64.rpm 10 MB/s | 21 MB 00:01
(3/13): docker-ce-cli-28.3.3-1.el10.x86_64.rpm 8.7 MB/s | 8.6 MB 00:00
(4/13): docker-ce-rootless-extras-28.3.3-1.el10.x86_64.rpm 11 MB/s | 3.4 MB 00:00
(5/13): containerd.io-1.7.27-3.1.el10.x86_64.rpm 16 MB/s | 44 MB 00:02
(6/13): fuse-common-3.16.2-5.el10.x86_64.rpm 15 kB/s | 8.7 kB 00:00
(7/13): fuse3-3.16.2-5.el10.x86_64.rpm 1.7 MB/s | 58 kB 00:00
(8/13): container-selinux-2.235.0-2.el10_0.noarch.rpm 604 kB/s | 55 kB 00:00
(9/13): tar-1.35-7.el10.x86_64.rpm 7.6 MB/s | 865 kB 00:00
(10/13): docker-compose-plugin-2.39.1-1.el10.x86_64.rpm 19 MB/s | 15 MB 00:00
(11/13): fuse-overlayfs-1.14-2.el10.x86_64.rpm 528 kB/s | 66 kB 00:00
(12/13): libslirp-4.7.0-10.el10.x86_64.rpm 611 kB/s | 74 kB 00:00
(13/13): slirp4netns-1.3.2-1.el10.x86_64.rpm 1.4 MB/s | 46 kB 00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 32 MB/s | 110 MB 00:03
Docker CE Stable - x86_64 93 kB/s | 1.6 kB 00:00
Importando llave GPG 0x621E9F35:
ID usuario: "Docker Release (CE rpm) <docker@docker.com>"
Huella : 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
Desde : https://download.docker.com/linux/centos/gpg
La llave ha sido importada exitosamente
Rocky Linux 10 - BaseOS 436 kB/s | 1.6 kB 00:00
Importando llave GPG 0x6FEDFC85:
ID usuario: "Release Engineering (Rocky Linux 10) <releng@rockylinux.org>"
Huella : FC22 6859 C086 0BF0 DDB9 5B08 5B10 6C73 6FED FC85
Desde : /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10
La llave ha sido importada exitosamente
Ejecutando verificación de operación
Verificación de operación exitosa.
Ejecutando prueba de operaciones
Prueba de operación exitosa.
Ejecutando operación
Preparando : 1/1
Ejecutando scriptlet: container-selinux-4:2.235.0-2.el10_0.noarch 1/13
Instalando : container-selinux-4:2.235.0-2.el10_0.noarch 1/13
Ejecutando scriptlet: container-selinux-4:2.235.0-2.el10_0.noarch 1/13
Instalando : docker-buildx-plugin-0.26.1-1.el10.x86_64 2/13
Ejecutando scriptlet: docker-buildx-plugin-0.26.1-1.el10.x86_64 2/13
Instalando : docker-compose-plugin-2.39.1-1.el10.x86_64 3/13
Ejecutando scriptlet: docker-compose-plugin-2.39.1-1.el10.x86_64 3/13
Instalando : docker-ce-cli-1:28.3.3-1.el10.x86_64 4/13
Ejecutando scriptlet: docker-ce-cli-1:28.3.3-1.el10.x86_64 4/13
Instalando : containerd.io-1.7.27-3.1.el10.x86_64 5/13
Ejecutando scriptlet: containerd.io-1.7.27-3.1.el10.x86_64 5/13
Instalando : libslirp-4.7.0-10.el10.x86_64 6/13
Instalando : slirp4netns-1.3.2-1.el10.x86_64 7/13
Instalando : tar-2:1.35-7.el10.x86_64 8/13
Instalando : fuse-common-3.16.2-5.el10.x86_64 9/13
Instalando : fuse3-3.16.2-5.el10.x86_64 10/13
Instalando : fuse-overlayfs-1.14-2.el10.x86_64 11/13
Ejecutando scriptlet: fuse-overlayfs-1.14-2.el10.x86_64 11/13
Instalando : docker-ce-rootless-extras-28.3.3-1.el10.x86_64 12/13
Ejecutando scriptlet: docker-ce-rootless-extras-28.3.3-1.el10.x86_64 12/13
Instalando : docker-ce-3:28.3.3-1.el10.x86_64 13/13
Ejecutando scriptlet: docker-ce-3:28.3.3-1.el10.x86_64 13/13
Ejecutando scriptlet: container-selinux-4:2.235.0-2.el10_0.noarch 13/13
Ejecutando scriptlet: docker-ce-3:28.3.3-1.el10.x86_64 13/13
Instalado:
container-selinux-4:2.235.0-2.el10_0.noarch containerd.io-1.7.27-3.1.el10.x86_64 docker-buildx-plugin-0.26.1-1.el10.x86_64 docker-ce-3:28.3.3-1.el10.x86_64
docker-ce-cli-1:28.3.3-1.el10.x86_64 docker-ce-rootless-extras-28.3.3-1.el10.x86_64 docker-compose-plugin-2.39.1-1.el10.x86_64 fuse-common-3.16.2-5.el10.x86_64
fuse-overlayfs-1.14-2.el10.x86_64 fuse3-3.16.2-5.el10.x86_64 libslirp-4.7.0-10.el10.x86_64 slirp4netns-1.3.2-1.el10.x86_64
tar-2:1.35-7.el10.x86_64
¡Listo!
Los paquetes principales que se instalan son los siguientes:
- docker-ce: Este paquete proporciona la tecnología subyacente para construir y ejecutar contenedores Docker (
dockerd) - docker-ce-cli: Proporciona la herramienta de línea de comandos (CLI) de Docker (
docker) - containerd.io: Proporciona el runtime de contenedores (
runc) - docker-buildx-plugin: Plugin Docker Buildx para la CLI de Docker
- docker-compose-plugin: Un plugin que proporciona el subcomando
docker compose
Después de la instalación, habilitamos e iniciamos el servicio de Docker ejecutando:
[root@joplin ~]# systemctl --now enable docker
En la salida podemos observar como se habilita el servicio:
Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' → '/usr/lib/systemd/system/docker.service'.
Y verificamos que está activo con:
[root@joplin ~]# systemctl status docker
Debería mostrarse que el servicio docker.serviceestá activo (running):
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: active (running) since Mon XXXX-XX-XX XX:XX:XX CEST; 7s ago
Invocation: af227358358a4e85a006c4811515a949
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 5662 (dockerd)
Tasks: 9
Memory: 23.6M (peak: 25.3M)
CPU: 78ms
CGroup: /system.slice/docker.service
└─5662 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Creating a containerd client" address=/run/containerd/containerd.sock timeout=1m0s
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Loading containers: start."
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Firewalld: created docker-forwarding policy"
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Loading containers: done."
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Docker daemon" commit=bea959c containerd-snapshotter=false storage-driver=overlay2 version=28.3>
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Initializing buildkit"
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Completed buildkit initialization"
XXX XX XX:XX:XX joplin dockerd[5662]: time="XXXX-XX-XXTXX:XX:XX.XXXXXXXXX+02:00" level=info msg="Daemon has completed initialization"
Opcionalmente, podemos permitir a ciertos usuarios que manejen Docker sin escalar:
[root@joplin ~]# usermod -a -G docker bitpedia
En cualquier caso, podemos consultar la guía oficial de Rocky Linux.
Configuración del contenedor
Accedemos al directorio /opt y creamos un directorio llamado joplin ejecutando los siguientes comandos:
[root@joplin ~]# mkdir /opt/joplin
[root@joplin ~]# cd /opt/joplin
En este directorio preparamos la estructura de directorios que se usará por los contenedores:
[root@joplin joplin]# mkdir postgres
En esta carpeta creamos un fichero llamado docker-compose.yaml ejecutando:
[root@joplin ~]# vi docker-compose.yml
Y lo guardamos con el siguiente contenido:
services:
db:
image: postgres:17.6
volumes:
- ./postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=joplin
joplin-server:
image: joplin/server:3.4.1
depends_on:
- db
ports:
- "22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
- APP_BASE_URL=http://192.168.1.100:22300
- DB_CLIENT=pg
- POSTGRES_DATABASE=joplin
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
Este archivo define dos servicios: db (PostgreSQL) y joplin-server. Para la gestión de la variables POSTGRES_USER y POSTGRES_PASSWORD creamos un fichero llamado .env ejecutando:
[root@joplin ~]# vi .env
Con el contenido, por ejemplo:
POSTGRES_USER=usuario
POSTGRES_PASSWORD=C0ntr4s3ny4
Con esto hemos preparado los contenedores de PostgreSQL (servicio db) y Joplin Server (joplin-server), configurando puertos, volúmenes y credenciales según las buenas prácticas de Docker.
Para levantar los contenedores ejecutamos:
[root@joplin ~]# docker compose up -d
En la salida veremos cómo se descargan las imágenes (joplin/server:3.4.1 y postgres:17.6) y se inician los contenedores:
[+] Running 25/25
✔ joplin-server Pulled 101.7s
✔ db Pulled 26.0s
[+] Running 3/3
✔ Network joplin_default Created 0.3s
✔ Container joplin-db-1 Started 1.0s
✔ Container joplin-joplin-server-1 Started
Podemos comprobar el estado de los contenedores ejecutando:
[root@joplin joplin]# docker ps -a
Debería mostrarse algo como:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6d0ec58d8a9 joplin/server:3.4.1 "tini -- yarn start-…" 21 seconds ago Up 21 seconds 0.0.0.0:22300->22300/tcp, [::]:22300->22300/tcp joplin-joplin-server-1
173296bd8f77 postgres:17.6 "docker-entrypoint.s…" 22 seconds ago Up 21 seconds 0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp joplin-db-1
En este punto ya podemos acceder a Joplin desde un navegador web apuntando a http://192.168.1.100:22300 (la dirección definida en APP_BASE_URL). El usuario por defecto es admin@localhost y la contraseña es admin. Por razones de seguridad recomendamos cambiar la contraseña tras el primero inicio de sesión (en el apartado de Perfil del administrador).
Exposición a Internet
Si deseamos exponer nuestra instancia a Internet , es recomendable configurar un proxy inverso (por ejemplo, con Nginx y un certificado TLS (SSL) para cifrar la conexión. Una opción sencilla es usar Nginx Proxy Manager, que facilita la creación de proxies con HTTPS mediante Let's Encrypt. En tal caso, al ejecutar Joplin y el proxy en la misma máquina, podemos ajustar APP_BASE_URL a https://sub.dominio.tld durante la instalación, y luego configurar Nginx para dirigir el tráfico público al contenedor de Joplin de forma segura.
Conclusión
La privacidad de nuestras notas es un aspecto fundamental que a menudo pasamos por alto. Elegir aplicaciones que respeten nuestros datos nos permite mantener el control sobre nuestra información personal y profesional.
Por suerte, hoy existen diversas alternativas: algunas ofrecen servicios privados accesibles desde múltiples plataformas, mientras que otras permiten el autoalojamiento, brindando un control aún mayor sobre la seguridad y la sincronización de nuestros contenidos.
La elección dependerá de nuestras necesidades: simplicidad y comodidad frente a máxima autonomía y personalización. En cualquier caso, invertir un poco de tiempo en seleccionar la herramienta adecuada garantiza que nuestras ideas y recuerdos permanezcan exclusivamente en nuestras manos.