Operar el servidor
Administración y ajustes
Panel de administración, entrega de códigos de registro (SMS y correo electrónico), valores de configuración del servidor, copias de seguridad y seguridad: una referencia para operadores.
El servidor incluye un panel de administración que se abre en el navegador. Desde él se consulta el estado del servidor, se decide cómo se entregan los códigos de registro e inicio de sesión y se gestionan los usuarios y los bots. Este documento es una referencia que reúne en un solo lugar el panel de administración y los valores de configuración del servidor. Si primero tienes que instalarlo, consulta Instalar el servidor.
Por ahora, la interfaz del panel de administración solo está en coreano. En este documento, las pestañas, los botones y los ajustes aparecen traducidos y, junto a ellos, el texto en coreano tal como se ve en pantalla; por ejemplo: Ajustes (설정).
Abrir el panel de administración
El panel de administración está en /admin/ del puerto HTTP de administración (8080 en la configuración de producción) y solo se abre desde el propio servidor (127.0.0.1). El operador entra mediante un túnel SSH.
# En tu ordenador (déjalo abierto)
ssh -N -L 8080:127.0.0.1:8080 <usuario>@<servidor>
# Navegador: http://localhost:8080/admin/
# Token (en el servidor)
sudo cat /srv/pabal/pabal_server/data/admin-token
Introduce el token y pulsa Abrir (열기). El navegador recuerda el token, y se borra con Borrar token (토큰 지우기), arriba a la derecha. Si quieres fijar tú el token, define TELEGRAM_ADMIN_TOKEN (al menos 16 caracteres); en ese caso no se escribe el archivo.
Qué muestra cada pestaña
| Pestaña | Contenido | Actualización |
|---|---|---|
| Resumen (대시보드) | Personas, sesiones y conexiones activas en este momento; número de personas, bots, grupos, mensajes y fotos; tiempo en marcha, puertos y base de datos; JVM; comprobaciones de estado. Si los números de prueba están activados, aparece una franja de aviso | 5 segundos |
| Códigos de registro (가입 코드) | Códigos pendientes (número, método de entrega, estado del envío, código, tiempo restante, intentos fallidos) e historial reciente. Copiar y cancelar códigos | 3 segundos |
| Usuarios (사용자) | Todas las cuentas: número de teléfono, correo de inicio de sesión (editable), si están conectadas, número de dispositivos con sesión iniciada y número de mensajes. Cerrar sesión en todos los dispositivos (모든 기기 로그아웃), Bloquear número (번호 차단) | 10 segundos |
| Bots (봇) | Los bots creados con BotFather: quién los creó, menú de comandos, modo de conexión (MTProto · sondeo HTTP · dirección del webhook y motivo del fallo), número de actualizaciones pendientes | 10 segundos |
| Ajustes (설정) | Reglas de registro e inicio de sesión, SMS, correo electrónico (SMTP), bloqueo de números de teléfono | Se guardan manualmente |
| Almacenamiento (저장소) | Directorio de datos y dirección de la base de datos (con la contraseña oculta), número y tamaño de las fotos, número de flujos (streams) almacenados por tipo | 10 segundos |
Las acciones peligrosas (cerrar sesiones, bloquear, cancelar códigos) solo se ejecutan si se pulsan dos veces.
Códigos de registro e inicio de sesión
Cuando alguien introduce su número de teléfono en la aplicación, el servidor genera un código y lo envía por el método elegido en la pestaña Ajustes (설정).
| Método de entrega | Adónde va el código | Pantallas de la aplicación |
|---|---|---|
| Panel de administración (관리 화면) | A la pestaña Códigos de registro (가입 코드). El operador lo copia y lo comunica personalmente | Número → «Te hemos enviado el código» → código (y nombre, si es un número nuevo) |
| SMS | Mensaje de texto a través de Twilio, Solapi o un webhook | Igual que con el panel de administración |
| Correo electrónico (이메일) | Correo a través de SMTP | Número → introducir el correo → «Te hemos enviado el código por correo» → código |
- Con el método de correo electrónico, en un registro nuevo se puede usar cualquier dirección, y esa dirección pasa a ser el correo de inicio de sesión de la cuenta. Las cuentas existentes solo lo reciben en su correo de inicio de sesión registrado: así se impide que alguien entre poniendo su propia dirección con el número de otra persona. A las cuentas existentes sin correo de inicio de sesión se les envía en su lugar por SMS (si está configurado) o por el panel de administración. En la pestaña Usuarios (사용자) puedes asignarles un correo de inicio de sesión.
- El envío se hace en segundo plano, así que la aplicación pasa enseguida a la pantalla del código. El resultado del envío (éxito o fallo, y el motivo) aparece en la pestaña Códigos de registro.
- El registro (introducir el nombre) solo es posible después de acertar el código. Los códigos incorrectos se admiten solo hasta el número de intentos permitido; a partir de ahí se rechaza incluso el código correcto.
Ajustes — registro e inicio de sesión
| Opción | Significado | Por defecto |
|---|---|---|
| Permitir registros nuevos (새 가입 허용) | Si se desactiva, solo inician sesión las cuentas que ya existen. Los números nuevos se rechazan como «número no válido» | Activado |
| Método de entrega del código (코드 전달 방식) | Panel de administración (관리 화면) / SMS / correo electrónico (이메일) | Panel de administración |
| Mostrar el código en el panel de administración (관리 화면에 코드 표시) | Muestra el código en la pestaña Códigos de registro también con los métodos de SMS y correo (por si falla el envío) | Activado |
| Números de prueba (+99966…) (테스트 번호) | Según el servidor (서버 설정대로) / Activar (켜기) / Desactivar (끄기). En producción, desactivar | Según el servidor |
| Dígitos del código · validez (코드 자릿수 · 코드 유효 시간) | 5–6 dígitos · 1–60 minutos | 5 dígitos · 5 minutos |
| Intervalo entre peticiones · máximo diario (재요청 간격 · 번호당 하루 최대 요청) | Segundos hasta que el mismo número puede volver a recibir un código (0–3600) · número máximo de veces en 24 horas (1–1000) | 60 segundos · 10 veces |
| Intentos fallidos permitidos (틀린 입력 허용 횟수) | Si se superan, ese código se bloquea (1–20) | 5 veces |
Ajustes — SMS
| Proveedor | Qué introducir | Notas |
|---|---|---|
| Webhook (웹훅) | Dirección de destino (https://…), cabecera Authorization (opcional) | El servidor envía POST {"phone":"+8210…","code":"12345","text":"…"}. Una respuesta 2xx es un éxito. Para conectar con tu propio servidor de SMS o con otro servicio |
| Twilio | Account SID, Auth Token, número remitente (발신 번호) o Messaging Service SID | Todo el mundo, números extranjeros incluidos |
| Solapi (antes CoolSMS) | API Key, API Secret, número remitente | SMS dentro de Corea. El número remitente debe estar registrado previamente en Solapi. Los números +82 se envían con el formato 010… |
En el texto del mensaje (문구) puedes incluir {code} (el código) y {minutes} (el tiempo de validez). Valor por defecto: [파발] 인증 코드: {code} («[Pabal] Código de verificación: {code}»). Después de guardar, compruébalo con Envío de prueba (테스트 발송).
Ajustes — correo electrónico (SMTP)
| Servicio | Servidor · puerto · seguridad | Usuario · contraseña |
|---|---|---|
| Gmail | smtp.gmail.com · 587 · STARTTLS | Dirección de Gmail · contraseña de aplicación (Cuenta de Google → Seguridad → Verificación en dos pasos → Contraseñas de aplicaciones) |
| Naver | smtp.naver.com · 587 · STARTTLS | ID · contraseña (activa el uso de POP3/SMTP en la configuración del correo) |
| Relay de correo interno de la empresa | Dirección del relay · 25 · ninguna | Vacíos |
La dirección remitente (보내는 주소) debe ser una desde la que la cuenta SMTP pueda enviar. En el asunto (제목) y en el cuerpo (본문) también se usan {code} y {minutes}.
Gestión de usuarios
- Cerrar sesión en todos los dispositivos (모든 기기 로그아웃): corta todos los inicios de sesión (claves de autorización) de esa cuenta. Se usa con usuarios que han perdido un dispositivo.
- Bloquear número (번호 차단): ese número no puede recibir códigos, y la cuenta de ese número cierra sesión al instante en todos los dispositivos. Equivale a la lista de bloqueo de números de teléfono (전화번호 차단) de la pestaña Ajustes (설정).
- Correo de inicio de sesión (로그인 이메일): lo necesitan las cuentas existentes para iniciar sesión por correo con el método de correo electrónico.
- @BotFather es un bot interno del servidor, así que no se le puede cerrar la sesión.
Gestión de bots
En la pestaña Bots (봇) se ve el modo de conexión de cada bot: si está conectado por MTProto, si ha llamado a getUpdates por HTTP en el último minuto, cuál es la dirección de su webhook y si está fallando ahora (con el motivo). Si las actualizaciones pendientes no dejan de aumentar, el programa del bot se ha detenido o el webhook está fallando. Eliminar un bot o emitir un token nuevo lo hace quien creó el bot, desde @BotFather.
Variables de entorno
El servidor lee el archivo de configuración (server-config.json) y después lo sobrescribe con las variables de entorno. El archivo compose de producción ya fija los valores de abajo, así que normalmente basta con modificar .env.
| Variable | Significado | Valor en el compose de producción |
|---|---|---|
TELEGRAM_PORT | Puerto MTProto | MTPROTO_PORT (8443) |
TELEGRAM_HOST | Dirección en la que escucha MTProto | 0.0.0.0 |
TELEGRAM_PUBLIC_HOST | Dirección del servidor que se comunica a la aplicación (help.getConfig) | PUBLIC_IP |
TELEGRAM_WEB_PORT | Puerto del sitio web, la documentación, la Bot API y el panel de administración | 8080 |
TELEGRAM_WEB_HOST | Dirección en la que escucha ese puerto. Por defecto, 127.0.0.1 | 0.0.0.0 (dentro del contenedor; en el host solo se publica en 127.0.0.1) |
TELEGRAM_PUBLIC_URL | Dirección del sitio web. Enlaces (me_url_prefix), enlaces de invitación, ejemplos de la documentación e imágenes de vista previa | https://DOMAIN/ |
TELEGRAM_DATA_DIR | Ubicación de las fotos, admin-token y operations.json | /app/data |
TELEGRAM_RSA_KEY | Ruta de la clave privada RSA del servidor (si no existe, se crea la primera vez; la clave pública es .pub) | /app/keys/private.pem |
TELEGRAM_DC_ID | Número de DC de este servidor | (1, el valor por defecto de la imagen) |
TELEGRAM_DB_TYPE | memory · h2 · postgresql | postgresql |
TELEGRAM_DB_URL, TELEGRAM_DB_USERNAME, TELEGRAM_DB_PASSWORD | Conexión JDBC | jdbc:postgresql://pabal-postgres:5432/pabal, pabal, POSTGRES_PASSWORD |
TELEGRAM_DB_MAX_POOL_SIZE | Número de conexiones a la base de datos | 20 |
TELEGRAM_ADMIN_TOKEN | Token del panel de administración (si se deja vacío, se crea en data/admin-token) | ADMIN_TOKEN |
TELEGRAM_TEST_NUMBERS | Números de prueba +99966…. Solo para desarrollo | false |
TELEGRAM_WEBHOOK_ALLOW_LOCAL | Permite que los webhooks de los bots usen http:// y direcciones internas. Solo para desarrollo | (sin definir = false) |
JAVA_OPTS | Opciones de la JVM (memoria) | El valor de .env |
Archivos de datos
| Archivo | Contenido | Permisos |
|---|---|---|
keys/private.pem | Clave privada RSA del servidor. No debe salir nunca del servidor | 600 |
keys/private.pem.pub | Clave pública. Se usa al compilar la aplicación y en /docs/server-key.pem | — |
data/admin-token | Token del panel de administración | 600 |
data/operations.json | Los valores de la pestaña Ajustes (설정): reglas de registro, secretos de SMS y SMTP, números bloqueados | 600 |
data/media/ | Originales de las fotos | — |
Tabla events de PostgreSQL | Cuentas, conversaciones, mensajes, inicios de sesión, bots y ajustes de webhooks: el registro de todos los cambios | — |
Notas de seguridad
- No abras el puerto de administración directamente a internet. En la configuración de producción, Caddy bloquea con un 404 las rutas de administración como
/admin,/healtho/metrics. - Todas las peticiones de datos de administración requieren
Authorization: Bearer <token>, y las páginas de otros sitios no pueden leerlos. - Los secretos de SMS y SMTP solo están en
operations.json; la pantalla y la API solo indican «guardado» (저장됨). Si guardas con un campo de secreto vacío, se mantiene el valor anterior. - Los tokens y los secretos no se escriben en los logs, y los números de teléfono aparecen enmascarados. Las direcciones de la Bot API (que incluyen el token) tampoco se registran.
- Las claves de autorización están en la base de datos, así que quien tenga acceso a la base de datos puede descifrar el tráfico de los usuarios. Protege la base de datos y las copias de seguridad tanto como la clave RSA.
Limitaciones
- Los códigos pendientes y el historial reciente están en memoria, así que se pierden al reiniciar el servidor (basta con volver a pedirlos desde la aplicación).
- El envío real a través de cada proveedor de SMS hay que comprobarlo con la cuenta de cada proveedor. El servidor construye las peticiones según la documentación de cada proveedor.
- Lo que todavía no existe: eliminar cuentas, eliminar bots a la fuerza, leer mensajes, ver logs, gráficos.