El certificado
No necesitas esto para usar el teléfono. De serie, sin configurar nada, un jugador escanea el QR en Ajustes › Dispositivos vinculados y su teléfono real se convierte en el teléfono de su personaje: mensajes, correo, contactos, City ID, el garaje, las propiedades, el tablón de anuncios, los lugares guardados. Todo funciona por HTTP plano en el puerto que tu servidor ya tiene abierto.
Lo que añade un certificado es la parte que un navegador no le da a una página insegura:
| HTTP plano | HTTPS | |
|---|---|---|
| Mensajes, correo, garaje, todo lo demás | sí | sí |
| Notificaciones con la página cerrada | no | sí |
| El micrófono, para poder grabar notas de voz | no | sí |
| Instalarlo como app en Android, con su propio icono | no | sí |
| “No seguro” en la barra de direcciones | se muestra | no se muestra |
| El token de sesión | viaja en claro | cifrado |
Esa última fila no es estética. Con HTTP plano, alguien en la misma Wi-Fi que tu jugador puede quedarse con su sesión y leer su teléfono. Para una ciudad de roleplay puede ser un precio aceptable; como mínimo debería ser una decisión y no una sorpresa.
Cuál de estos eres tú
Sección titulada «Cuál de estos eres tú»Tienes un nombre que apuntar al servidor: deja que el teléfono consiga su propio certificado
Sección titulada «Tienes un nombre que apuntar al servidor: deja que el teléfono consiga su propio certificado»Este es el corto, y no necesita ningún otro programa en la máquina. El recurso le pide un certificado a Let’s Encrypt, responde él mismo al desafío, sirve TLS él mismo y se renueva solo mientras esté en marcha.
-- shared/server_config.lua (server-only: this file is never sent to a client)ServerConfig.Web = { Url = 'https://phone.yourserver.com/', Https = { Enabled = true, Names = { 'phone.yourserver.com' }, },}Después, una sola vez:
- Apunta ese nombre al servidor. En un VPS es un registro A. ¿No tienes dominio propio?
duckdns.orgte da uno gratis en un minuto y nunca cambia. - Deja pasar el 443 y el 80 por el firewall. El 80 solo se abre mientras se pide un certificado, y se vuelve a cerrar en cuanto llega la respuesta; el log lo dice las dos veces.
phonehttps te dice en qué estado está el certificado. phonehttps check le pregunta al servidor de pruebas de Let’s Encrypt si va a hablar con esta máquina siquiera, que es la pregunta que conviene responder primero cuando no llega nada: separa tu firewall de este recurso.
La renovación se encarga de sí misma, cuando todavía le queda un tercio de vida al certificado, y se comprueba cada seis horas.
Si el servidor está en casa, la dirección cambia
Sección titulada «Si el servidor está en casa, la dirección cambia»Un proveedor le da a una conexión doméstica una dirección nueva cuando le apetece, y en el momento en que lo hace, el nombre apunta al router de otra persona: los teléfonos vinculados no pueden llegar al servidor y el certificado no se puede renovar. Este recurso ya se da cuenta (pregunta por su propia dirección cada media hora, para el QR) y, con un nombre de DuckDNS, también puede arreglarlo:
-- shared/server_config.luaDuckDNS = { Enabled = true, Domains = { 'yourname' }, -- the part in front of .duckdns.org Token = '01d8b39f-...', -- from your duckdns.org page},Se le avisa cuando la dirección cambia, y una vez al día cuando no ha cambiado: ese latido es también lo que arregla las cosas después de un rato sin internet, cuando el cambio ocurrió mientras no se podía enviar nada. Cuando funciona, el log lo dice y no salta ninguna alarma; cuando no, se sigue enviando el aviso de siempre, y también al webhook Server.
En un VPS la dirección no cambia y nada de esto hace falta. Deja Enabled = false.
Estás detrás del proxy de conexión de Cfx.re
Sección titulada «Estás detrás del proxy de conexión de Cfx.re»No hay nada que hacer. Si sv_listingHostOverride está configurado, el QR se construye solo como https://your.domain/mic_phone/web/, porque ese proxy pasa toda la raíz a tu servidor. Es el caso más fácil y ya está resuelto.
Ya tienes un reverse proxy y prefieres seguir así
Sección titulada «Ya tienes un reverse proxy y prefieres seguir así»Una línea en shared/config/web.lua:
Url = 'https://phone.yourserver.com/mic_phone/web/',y un reverse proxy delante que termine TLS y reenvíe al puerto del juego. Con Caddy son dos líneas en un Caddyfile:
phone.yourserver.com { reverse_proxy 127.0.0.1:30120}Con nginx, reenvía / a 127.0.0.1:30120 y desactiva el buffering (proxy_buffering off;), o el event stream se quedará retenido y el teléfono dejará de enterarse de nada.
Una cosa que no funciona: activar la nube naranja en un registro DNS que apunta al puerto 30120. El proxy de Cloudflare solo acepta una lista fija de puertos de origen (80, 8080, 8880, 2052, 2082, 2086, 2095 y 443, 2053, 2083, 2087, 2096, 8443) y el 30120 no está entre ellos. Necesitas un proxy propio delante, como arriba.
Alquilas tu servidor a un host
Sección titulada «Alquilas tu servidor a un host»No puedes instalar nada en esa máquina, pero no te hace falta: la primera opción de arriba no instala nada, es este recurso. Lo que necesitas de tu host son dos puertos propios, el 443 y el 80, y un nombre que apunte al servidor. Muchos hosts te dan las dos cosas; algunos comparten esos puertos entre todos los clientes de la máquina y no te darán ninguna. Pregúntales por los puertos antes que por cualquier otra cosa; si la respuesta es no, apunta un nombre a un túnel de Cloudflare con nombre.
No puedes abrir ningún puerto: no tienes nombre, o tu proveedor te lo impide
Sección titulada «No puedes abrir ningún puerto: no tienes nombre, o tu proveedor te lo impide»Entonces, un túnel: tools/tunnel.ps1 arranca un quick tunnel de Cloudflare, escribe en la config la dirección que obtiene y te dice que reinicies el recurso. Sin abrir puertos y sin certificado.
Pero ten claro lo que es: un quick tunnel es efímero por diseño. La dirección es aleatoria y se emite una nueva cada vez que el túnel se reinicia, y como un navegador asocia una app instalada, su token guardado y su suscripción push a la dirección de la que vinieron, hay que volver a configurar todo eso cada vez. Es para hacer pruebas. Para cualquier cosa que tenga que sobrevivir a un reinicio, apunta un nombre a un túnel con nombre, que conserva su dirección; eso necesita una cuenta de Cloudflare y un dominio en ella.
Una nota sobre el event stream
Sección titulada «Una nota sobre el event stream»El teléfono mantiene abierta una conexión larga para enterarse de los mensajes en cuanto llegan, y la abre con un POST en lugar del habitual GET de EventSource. Dos razones, las dos útiles si vas a poner un proxy delante:
- Un token en una query string es un token escrito en todos los logs de proxy que haya entre el teléfono y el servidor. En el cuerpo de un POST no lo es.
- Un quick tunnel de Cloudflare retiene un event stream GET hasta que el servidor cierra la conexión, mientras que deja pasar un POST (cloudflared#1449). Muchos proxies hacen buffering de los streams GET por defecto.
El servidor también responde a un GET en las mismas rutas, para lo que solo conozca EventSource.