Configurar un servidor Hostel
El servidor gestiona la cola, los usuarios, la configuración y la puerta de enlace SSH.
Ejecuta un servidor para todo el equipo. Los agentes y las personas se conectan desde sus propios
ordenadores (hostel-install).
1. Elegir la máquina y el modo TLS
- Una máquina Linux con systemd (amd64 o arm64; 2 CPUs y 4 GB son suficientes), o
una máquina local que permanezca encendida. El repositorio solo documenta el servicio
systemd; en otro sistema operativo, ejecuta
hostel server runcon tu propio gestor de servicios. - Una dirección HTTPS a la que los clientes puedan acceder. La API y la puerta de enlace la comparten:
la puerta de enlace acepta SSH dentro de un WebSocket en
/v1/gateway.
| Modo TLS | Úsalo cuando | Verificación del cliente |
|---|---|---|
self-signed (por defecto) | Sin dominio ni proxy: dirección IP, nombre LAN, nombre VPN. El servidor sirve HTTPS con su propio certificado. | La clave fijada del código de invitación. |
off | Hay un proxy con TLS delante del servidor (Caddy, un balanceador de carga en la nube). | El certificado del proxy, de forma normal. |
2. Instalar
Como administrador en la máquina del servidor:
curl -fsSL -o install.sh https://raw.githubusercontent.com/csansoon/hostel/main/install.sh
sudo sh install.sh --dir /usr/local/bin --server /opt/hostel
/opt/hostel/helpers obtiene los binarios para todas las salas (hostel-<os>-<arquitectura>,
mise-<os>-<arquitectura>). /opt/hostel/platforms obtiene los scripts de plataforma (solo un
servidor antiguo los importa; el binario tiene las plataformas por defecto).
3. Inicializar
Ejecuta hostel server init como el usuario que ejecuta el servicio (no root). En una
terminal, pregunta por el nombre del servidor, las direcciones y tu nombre cuando las banderas
no los proporcionan. Banderas:
| Banderas | Significado |
|---|---|
--server-id | El nombre del servidor, [a-z0-9]{1,20} (por defecto: del nombre del host). Forma parte de los nombres de las salas que el servidor crea. |
--listen | La dirección de la API (por defecto 127.0.0.1:7410). |
--tls | self-signed (por defecto) o off. |
--url | Una dirección que los clientes usan. Repítela para varias. Los códigos de invitación las contienen. |
--user | Tu nombre, para el primer administrador. |
--helper-dir | Los binarios para las salas: /opt/hostel/helpers después de install.sh --server /opt/hostel (por defecto: data_dir/helpers). |
--config | El archivo a escribir (por defecto ~/.config/hostel/server.toml). |
Con autofirmado, en su propio puerto (abrir TCP 7410 en el cortafuegos):
hostel server init --server-id demo --listen 0.0.0.0:7410 \
--url https://hostel.example.com:7410 --user "Alice Example" \
--helper-dir /opt/hostel/helpers
Detrás de un proxy con TLS:
hostel server init --server-id demo --tls off --listen 127.0.0.1:8000 \
--url https://hostel.example.com --user "Alice Example" \
--helper-dir /opt/hostel/helpers
Con --tls off y una dirección https://, init también escribe
gateway_public = "wss://hostel.example.com/v1/gateway": los invitados y las máquinas
unidas llegan a la puerta de enlace SSH a través del proxy. El proxy debe reenviar
/v1/gateway (un WebSocket) al servidor.
init escribe server.toml, hostel.schema.json, el directorio de datos
(~/.local/share/hostel: la base de datos, server_ed25519, gateway_host_ed25519,
y el certificado TLS), e imprime la clave pública SSH del servidor y la primera
invitación de administrador:
Conecta tu ordenador como primer administrador. Ejecuta esto en tu ordenador:
hostel connect hostel1-...
Ejecuta ese comando en tu propio ordenador dentro de 24 horas (hostel-install).
4. Editar server.toml
server.toml solo tiene las claves que el servidor necesita antes de abrir su
base de datos: server_id, listen, gateway_listen, gateway_public, tls,
public_urls, data_dir, helper_dir, platforms_dir. init escribe
helper_dir (con --helper-dir) y, detrás de un proxy, gateway_public. Verifícalos:
grep -E 'helper_dir|gateway_public' ~/.config/hostel/server.toml
hostel admin config check
Sin helper_dir, el servidor no puede dar a las salas su ayudante, y hostel machine join no puede descargar el binario. Sin gateway_public detrás de un
proxy, cada sesión SSH invitada y cada máquina unida falla.
Un ejemplo con Caddy (Caddy pasa las actualizaciones WebSocket sin configuración adicional):
hostel.example.com {
reverse_proxy 127.0.0.1:8000
}
Con tls = "self-signed", el gateway_public por defecto es /v1/gateway en la misma
dirección; no lo configures. Verifica el archivo (imprime cada problema y los valores
efectivos):
hostel admin config check
Un cambio en server.toml necesita un reinicio del servidor.
5. El servicio systemd
/etc/systemd/system/hostel.service (reemplaza alice con el usuario que ejecutó
init):
[Unit]
Description=Servidor Hostel
After=network-online.target
Wants=network-online.target
[Service]
User=alice
ExecStart=/usr/local/bin/hostel server run
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now hostel
journalctl -u hostel -f
hostel server run --config <archivo> selecciona otro server.toml. El registro está en
JSON en stderr. Si la configuración no es válida, el servidor no arranca y el
registro indica por qué.
Para salas de tipo Namespace, las CLI devbox y nsc deben estar en el
PATH del servicio (hostel-rooms, sección "Namespace").
6. La configuración en la base de datos
Todo lo demás (proveedores, máquinas, plataformas y las opciones) es el documento de configuración en la base de datos. Un administrador lo cambia desde cualquier ordenador conectado. Un cambio válido se aplica de inmediato, sin reinicio.
hostel config # muestra el documento (los miembros ven los secretos como ***)
hostel config edit # lo cambia en $VISUAL / $EDITOR
hostel config apply archivo.toml # lo reemplaza con un archivo (o - para stdin)
hostel config history # las revisiones, con usuario y hora
hostel config settings # las opciones que no son las predeterminadas
hostel config settings set idle_timeout=20m
Opciones: idle_timeout (10m), poll_timeout (5m), limit_retry (2m),
port_process_offline (10m), intervals.scheduler (10s),
intervals.reconcile (5m), intervals.tunnel_check (30s),
intervals.presence (30s), mise.idiomatic_tools (["node", "python"]),
mise.github_token, mise.agent_device (true).
El servidor rechaza un cambio si otra revisión llegó primero (editar de nuevo) o si
no es válido (el error nombra la ruta de la clave). Máquinas y proveedores:
hostel-rooms. Plataformas: hostel-platforms. Usuarios: hostel-users.
7. Invitaciones en la máquina del servidor
Si nadie puede iniciar sesión como administrador, crea una invitación en la propia máquina del servidor (no usa la API):
hostel server invite # un administrador
hostel server invite --role member --name "Bob Example"
8. Copias de seguridad
El estado está en el directorio de datos (~/.local/share/hostel). Respalda las claves
una vez (server_ed25519, gateway_host_ed25519, tls_cert.pem, tls_key.pem).
Respalda la base de datos con SQLite, no con una copia de archivo:
sqlite3 ~/.local/share/hostel/hostel.db ".backup /var/backups/hostel.db"
- Una base de datos perdida: los usuarios deben conectarse de nuevo; las salas bajo demanda con este
server_idse destruyen en la siguiente reconciliación. - Una
server_ed25519perdida: coloca la nueva clave pública (hostel admin pubkey) en cada máquina estática. - Una clave TLS perdida (autofirmado): cada cliente debe conectarse de nuevo con un nuevo código de invitación.
9. Actualizar
curl -fsSL -o install.sh https://raw.githubusercontent.com/csansoon/hostel/main/install.sh
sudo sh install.sh --dir /usr/local/bin --server /opt/hostel
sudo systemctl restart hostel
El servidor envía el nuevo ayudante a cada sala antes de su próxima concesión.
Siguiente
- Añadir salas:
hostel-rooms. - Invitar personas:
hostel-users.