11 KiB
Acerca de
cryptgeon es un servicio seguro y de código abierto para compartir notas o archivos inspirado en PrivNote. Incluye un servidor, una página web y una interfaz de línea de comandos (CLI, por sus siglas en inglés).
🌍 Si quieres traducir este proyecto no dudes en ponerte en contacto conmigo.
Demo
Web
Prueba la demo y experimenta por ti mismo cryptgeon.org
CLI
npx cryptgeon send text "Esto es una nota secreta"
Puedes revisar la documentación sobre el CLI en este readme.
Características
- enviar texto o archivos
- el servidor no puede desencriptar el contenido debido a que la encriptación se hace del lado del cliente
- restricción de vistas o de tiempo
- en memoria, sin persistencia
- compatibilidad obligatoria con el modo oscuro
¿Cómo funciona?
Se genera una id (256bit) y una llave 256(bit) para cada nota. La
id
se usa para guardar y recuperar la nota. Después la nota es encriptada con XChaCha20-Poly1305 del lado del cliente y por último se envía al servidor. La información es almacenada en memoria y nunca persiste en el disco. El servidor nunca ve la llave de encriptación por lo que no puede desencriptar el contenido de las notas aunque lo intentara.
Capturas de pantalla
Variables de entorno
| Variable | Default | Descripción |
|---|---|---|
CACHE |
redis://cache/ |
URL de caché (valkey o redis) a la que conectarse. Según el formato |
SIZE_LIMIT |
1 KiB |
Tamaño máximo del cuerpo. Valores aceptados según byte-unit. 512 MiB es el máximo permitido. Los payloads son bytes crudos (msgpack + cifrado), por lo que el frontend muestra el límite completo. |
MAX_VIEWS |
100 |
Número máximo de vistas. |
MAX_EXPIRATION |
360 |
Tiempo máximo de expiración en minutos. |
ALLOW_ADVANCED |
true |
Permitir configuración personalizada. Si se establece en false todas las notas serán de una sola vista. |
ALLOW_FILES |
true |
Permitir subir archivos. Si es false, los usuarios solo podrán crear notas de texto. |
ID_LENGTH |
32 |
Establece el tamaño en bytes de la id de la nota. Por defecto es de 32 bytes. Útil para reducir el tamaño del link. No afecta el nivel de encriptación. |
CACHE_PREFIX |
"" |
Prefijo opcional para las claves de caché. Útil al compartir una instancia con otras apps vía namespaces ACL. |
EXTRA_SIZE_LIMIT |
512 |
Tamaño máximo en bytes del payload extra opaco (p. ej. parámetros de derivación de clave) guardado en los metadatos de la nota. |
VERBOSITY |
warn |
Nivel de verbosidad del backend. Posibles valores: error, warn, info, debug, trace |
THEME_IMAGE |
"" |
Imagen personalizada para reemplazar el logo. Debe ser accesible públicamente. |
THEME_TEXT |
"" |
Texto personalizado para reemplazar la descripción bajo el logo. |
THEME_PAGE_TITLE |
"" |
Texto personalizado para el título. |
THEME_FAVICON |
"" |
Url personalizada para el favicon. Debe ser accesible públicamente. |
THEME_NEW_NOTE_NOTICE |
true |
Mostrar el mensaje sobre cómo se almacenan las notas en memoria (pueden ser expulsadas) al crear una nueva nota. |
THEME_HOME_LINK |
true |
Mostrar el enlace /home en el pie de página. El valor predeterminado es true. |
IMPRINT_URL |
"" |
URL personalizada para un imprint alojado en otro sitio. Debe ser accesible públicamente. Tiene prioridad sobre IMPRINT_HTML. |
IMPRINT_HTML |
"" |
Alternativa a IMPRINT_URL para especificar el HTML a mostrar en /imprint. Usa solo IMPRINT_HTML o IMPRINT_URL, no ambos. |
Despliegue
ℹ️ Se requiere
httpsde lo contrario el navegador no soportará las funciones de encriptación.
ℹ️ Hay un endpoint para verificar el estado, lo encontramos en
/healthz. Regresa un código 200 o 503.
Docker
Docker es la manera más fácil. Aquí encontramos la imagen oficial.
# docker-compose.yml
services:
cache:
image: valkey/valkey:7-alpine
# This is required to stay in RAM only.
command: valkey-server --save "" --appendonly no
# Set a size limit. See link below on how to customise.
# https://valkey.io/docs/latest/operate/rs/databases/memory-performance/eviction-policy/
# --maxmemory 1g --maxmemory-policy allkeys-lrulpine
# This prevents the creation of an anonymous volume.
tmpfs:
- /data
app:
image: cupcakearmy/cryptgeon:v3
depends_on:
- cache
environment:
# Size limit for a single note.
SIZE_LIMIT: 4 MiB
ports:
- 80:8000
# Optional health checks
# healthcheck:
# test: ["CMD", "curl", "--fail", "http://127.0.0.1:8000/healthz"]
# interval: 1m
# timeout: 3s
# retries: 2
# start_period: 5s
NGINX Proxy
Ver la carpeta de ejemplo/nginx. Hay un ejemplo con un proxy simple y otro con https. Es necesario que especifiques el nombre del servidor y los certificados.
Traefik 2
Ver la carpeta de ejemplo/traefik.
Scratch
Ver la carpeta de ejemplo/scratch. Ahí encontrarás una guía de cómo configurar el servidor e instalar cryptgeon desde cero.
Synology
Hay una guía (en inglés) que puedes seguir.
Guías en Youtube
- En inglés, por Webnestify
- En inglés, por DB Tech Previous Video
- En alemán, por ApfelCast
Contribuir
Ver CONTRIBUTING.md.
Seguridad
Por favor dirígete a la sección de seguridad aquí.
Uso de LLMs
A partir de la V3, utilicé LLMs de forma intensiva para implementar mis propias ideas. Esto significa que la dirección y las decisiones de arquitectura son humanas. Gran parte de la implementación que deriva de eso está automatizada con un LLM.
Atribuciones
- Datos del Test:
- Texto para los tests Nietzsche Ipsum
- AES Paper
- Unsplash Imágenes
- Animación de carga por Nikhil Krishnan
- Iconos hechos por freepik de www.flaticon.com

