Lab

cobiserver

Un servidor de sincronización para KOReader que montas tú.

Pregunta
¿Se puede sustituir el servidor de sincronización oficial de KOReader sin tocar nada en la app?
Resultado
Sí. Habla el mismo protocolo y añade lo que a ese protocolo le falta: una página para registrarse, cambiar la contraseña o recuperarla.

Qué hace

KOReader puede sincronizar por dónde vas leyendo entre dispositivos, pero solo a través de un servidor. Por defecto es el público, sync.koreader.rocks. cobiserver lo sustituye sin más: implementa las mismas rutas a las que ya llama la app, así que en el lector lo único que cambia es la dirección del servidor en los ajustes de sincronización.

El protocolo oficial no permite cambiar la contraseña ni recuperarla. cobiserver añade una pequeña interfaz web para eso:

  • Cuentas en /account: registrarse, cambiar la contraseña, poner un correo de recuperación y ver qué documentos están sincronizados.
  • Recuperar la contraseña por correo si hay SMTP configurado. Si no lo hay, el servidor imprime un enlace de recuperación para que el administrador se lo pase al usuario.
  • Panel de administración en /admin/users para crear y borrar usuarios o forzar un cambio de contraseña sin entrar por terminal. La primera cuenta que se registra es la de administrador.
  • Línea de comandos de administración en el mismo binario: create-user, set-password, list-users, gen-reset-link y alguno más.

Probarlo

git clone https://github.com/SecureCMD/cobiserver.git
cd cobiserver
docker compose up -d --build

Con eso arranca el servidor en el puerto 8080. En KOReader, ve a Ajustes → Sincronización, pon como servidor http://<tu-servidor>:8080 y regístrate desde la app. También puedes abrir /account/register en el navegador.

Sin Docker, sudo make install en la máquina de destino instala el binario y un servicio de systemd aislado. En Debian o Ubuntu, make deb genera un paquete que apt instala y desinstala limpiamente.

Cómo está hecho

  • Un único binario estático de Go, con SQLite escrito en Go y sin CGO. La imagen de Docker ocupa unos 20 MB y no se ejecuta como root.
  • Las dependencias van dentro del repositorio, así que ningún build necesita red.
  • La app de KOReader envía MD5(contraseña). El servidor guarda ese valor pasado por bcrypt, de modo que una base de datos filtrada no es una lista de credenciales.
  • Límite de peticiones en el registro, el inicio de sesión, la autenticación y la recuperación de contraseña.
  • make dist compila versiones para Linux amd64, arm64 y armv7 y para macOS arm64, con sus sumas de verificación.

Límites conocidos

  • El servidor solo habla HTTP. Si va a estar accesible fuera de tu red, ponle delante un proxy inverso con TLS y activa COOKIE_SECURE=true.
  • Debian 12 trae Go 1.19, que es demasiado antiguo para compilarlo. Instala antes Go 1.23 o posterior.