Guía del usuario
Un recorrido práctico por Town OS — desde grabar una memoria USB hasta reportar errores. Ya seas usuario primerizo o desarrollador armando paquetes, esta guía cubre todo lo que necesitas para empezar.
Inicio rápido
Pon Town OS a andar en una computadora que tengas de sobra, en cuestión de minutos. Solo necesitas una memoria USB-C (de 4 GB o más) y una máquina con Linux para grabarla.
1. Graba la memoria USB
Corre el script de instalación en cualquier máquina con Linux que tenga instalados
podman, curl, bzip2, dd,
lsblk y tar — Podman es obligatorio, porque
el script lo usa para descargar la imagen del instalador (y tiene que funcionar de
verdad, no basta con tenerlo instalado). El script descarga la imagen más reciente de
Town OS y la graba directo en la memoria USB.
curl -sSLO https://town-os.github.io/install.sh && bash install.sh El script busca los dispositivos USB conectados, te muestra una lista con nombres y tamaños, y te pide que elijas uno. Cuando confirmas, descomprime la imagen sobre la marcha y la escribe en el dispositivo de una sola pasada. Todo el proceso toma unos minutos, según tu conexión a internet.
Raspberry Pi (4 / 400 / CM4, 5 / CM5): pasa RPI=1 para
grabar la imagen de arranque nativo para Raspberry Pi en una tarjeta SD, una memoria
USB o un NVMe, en lugar de la imagen estándar para PC:
curl -sSLO https://town-os.github.io/install.sh && RPI=1 bash install.sh
La imagen de Pi siempre es Arm de 64 bits y arranca sin UEFI, así que funciona incluso
si corres el instalador desde una máquina x86_64. Una Raspberry Pi arranca directamente
desde la tarjeta o el disco que le pongas, sin menú de arranque; para arrancar por NVMe
en una Pi 5, asegúrate de que el orden de arranque del EEPROM incluya NVMe (se ajusta
con rpi-eeprom-config).
Town OS formatea y usa todos los dispositivos de almacenamiento locales que detecte (NVMe, SATA, SAS, tarjetas SD). Arrancar Town OS en una máquina destruye de forma permanente todos los datos existentes en cada disco interno.
Arranca Town OS solo en una máquina dedicada, sin datos que quieras conservar, o usa
las instrucciones de máquinas virtuales para probarlo con
seguridad primero — incluyendo
make qemu-usb, que arranca dentro de QEMU (en
modo de solo lectura) la memoria que acabas de grabar, sin tocar ningún disco real.
2. Arranca desde la memoria USB
Conecta la memoria USB a la computadora de destino y arranca desde ella. Quizá tengas que presionar una tecla durante el encendido para llegar al menú de arranque — las teclas más comunes son F12, F2, Esc o Supr, según tu hardware.
3. Primer arranque: usa sledgehammer
Si la máquina de destino ya se usó antes para otra cosa, elige la opción de arranque sledgehammer en el menú de arranque la primera vez. Sledgehammer borra todos los dispositivos de almacenamiento detectados y asegura que Town OS empiece con la pizarra completamente limpia. Así evitas problemas causados por tablas de particiones, sistemas de archivos o metadatos de RAID que dejó el sistema operativo anterior.
Cuando sledgehammer termina, la máquina se reinicia sola y Town OS hace la configuración de almacenamiento desde cero. Todos los detalles están en La opción de arranque sledgehammer.
4. Qué pasa al arrancar
Town OS se carga por completo en RAM desde la memoria USB y después lanza ttyforce, un instalador interactivo de texto que te guía por la configuración directamente en la consola de la máquina.
- Configuración de red — ttyforce detecta las interfaces disponibles. Si hay una conexión por cable con enlace, avanza solo. Si no, te muestra la selección de redes WiFi con la intensidad de la señal, el tipo de seguridad y la captura de contraseñas WPA2/WPA3.
- Aprovisionamiento de discos — ttyforce agrupa los discos detectados por tipo y tamaño, y luego elige automáticamente el nivel de RAID adecuado: disco único con 1 disco, RAID1 (espejo) con 2, o RAID5 (con paridad distribuida) con 3 o más. Todo el almacenamiento usa btrfs.
- Importar llaves SSH — puedes escribir nombres de usuario de GitHub para importar llaves SSH públicas y tener acceso remoto seguro.
Terminado el aprovisionamiento, el sistema se reinicia y ttyforce pasa a modo getty — una pantalla de estado en vivo que muestra la salud de los servicios, las métricas del sistema y la salida del journal en la consola. Desde ahí puedes iniciar sesión, reconfigurar la red o lanzar un borrado con sledgehammer.
5. Crea tu cuenta y empieza a usarlo
Desde cualquier dispositivo en la misma red, abre un navegador y ve a
http://town-os.local. Si eso no funciona, busca en la lista de clientes
DHCP de tu router un dispositivo llamado «town-os» y usa su dirección IP directamente.
Se te pedirá crear una cuenta de administrador. Una vez dentro, puedes instalar
paquetes, administrar el almacenamiento y configurar servicios desde el panel.
6. Apunta el DNS de tu router a Town OS
Town OS trae rolodex, un servidor DNS que resuelve los nombres de host de los paquetes y reenvía todo lo demás al exterior. Para que todos los dispositivos de tu red lo usen automáticamente, dale a la máquina con Town OS una IP fija (o una reserva DHCP) y pon esa dirección como servidor DNS primario en tu router. En Configurar el DNS en tu router están las instrucciones por marca y los pasos de verificación.
Construir la imagen USB desde el código
La imagen USB de Town OS se construye desde el repositorio install. El proceso produce una imagen arrancable con un sistema de archivos raíz squashfs y un esquema de particiones GPT.
Requisitos previos
Necesitas un anfitrión con Linux y una memoria USB (de 4 GB o más). La construcción usa
herramientas de Arch Linux (pacstrap, mkinitcpio,
arch-chroot), pero no hace falta que corras Arch — en
cualquier otra distribución, make image ejecuta la construcción dentro de
un contenedor de Arch de la misma arquitectura. Instala las dependencias del anfitrión
con el objetivo que corresponda a tu distribución:
make deps— Arch (y derivadas) o Fedora/RHELmake deps-debian— Debian o Ubuntu
Esos objetivos traen todo lo que necesitan la construcción y las herramientas de
máquinas virtuales — make, podman,
arch-install-scripts, squashfs-tools, parted,
e2fsprogs, dosfstools, qemu y
libvirt.
Clonar y construir
git clone https://gitea.com/town-os/install.git
cd install
make image
Correr make o make image construye la imagen USB completa. El
proceso descarga el sistema base, instala los componentes de Town OS, comprime todo en
un sistema de archivos squashfs y arma la imagen de disco final con una tabla de
particiones GPT.
Particionado y squashfs
La imagen resultante usa un esquema GPT con:
- Una partición de arranque BIOS (1 MiB) para el arranque BIOS clásico
- Una partición de sistema EFI (64 MiB, FAT32) para el arranque UEFI
- Una partición de datos (ext4) que contiene el sistema de archivos raíz squashfs y GRUB
Al arrancar, Town OS monta el squashfs como capa inferior de solo lectura, con una capa tmpfs encima. Eso significa que el sistema operativo corre por completo en RAM — la memoria USB solo se lee al arrancar. Todos los cambios en tiempo de ejecución ocurren en memoria y se descartan al reiniciar, dejándote la pizarra limpia cada vez.
Grabar la imagen
Lo más sencillo es make flash, que construye la imagen si está
desactualizada y la graba en un dispositivo USB. Si prefieres hacerlo a mano, ten en
cuenta que la construcción produce un archivo con la fecha y el sufijo de arquitectura
(por ejemplo town-os-2026-07-25-x86_64.img) — grábalo con dd:
# Encuentra tu dispositivo USB (por ejemplo /dev/sdb)
lsblk
# Graba la imagen (cambia el nombre del archivo y /dev/sdX por tu dispositivo)
sudo dd if=town-os-YYYY-MM-DD-x86_64.img of=/dev/sdX bs=4M status=progress conv=fsync
Verifica dos veces el dispositivo de destino — dd sobrescribe lo que sea
que le apuntes, sin pedir confirmación.
La opción de arranque sledgehammer
La memoria USB de Town OS incluye una opción de arranque llamada sledgehammer que borra todos los dispositivos de almacenamiento detectados y regresa el sistema a un estado limpio. Es útil cuando quieres empezar de cero — por ejemplo, después de hacer pruebas, antes de instalar en hardware nuevo, o cuando el almacenamiento se corrompió.
Qué hace
Cuando eliges la opción sledgehammer al arrancar, Town OS va a:
- Detectar todos los dispositivos de almacenamiento locales (NVMe, SATA/SAS, tarjetas SD) — con la misma detección que usa el arranque normal
- Borrar las tablas de particiones y los sistemas de archivos de cada dispositivo detectado
- Reiniciar el sistema, que después hace la configuración de almacenamiento desde cero, como si fuera el primer arranque
Sledgehammer destruye todos los datos de todos los dispositivos de almacenamiento detectados. La memoria USB en sí no se toca — solo los discos internos. Asegúrate de tener respaldos de lo que necesites antes de usar esta opción.
Cómo se usa
- Conecta la memoria USB de Town OS en la máquina de destino y arranca desde ella
- En el menú de arranque, elige la entrada sledgehammer en lugar de la opción predeterminada
- El sistema borra todo el almacenamiento detectado y se reinicia solo
- En el siguiente arranque, Town OS configura el almacenamiento desde cero usando tu configuración de
town-os.yaml
Cuándo usarla
- Restablecer de fábrica — devuelve el sistema a un estado limpio, como recién instalado
- Cambio de backend de almacenamiento — pasar de btrfs a ZFS (o al revés) exige limpiar antes el almacenamiento existente
- Almacenamiento corrupto — si el sistema de archivos está dañado más allá de reparación, sledgehammer te da un punto de partida limpio
- Reinstalación — reaprovechar el hardware con otra configuración de Town OS
Configurar el DNS en tu router
Town OS incluye rolodex, un servidor DNS que administra las zonas autoritativas de tus paquetes y reenvía las consultas al exterior. Para usarlo como servidor DNS de tu red, tienes que decirle a tu router que reparta la dirección IP de la máquina con Town OS como servidor DNS. Así, cada dispositivo de tu red usa rolodex automáticamente — sin configurar nada equipo por equipo.
Encuentra la dirección IP de Town OS
Vas a necesitar la dirección IP local de tu máquina con Town OS. Puedes encontrarla así:
- Entra al panel en
http://town-os.localdespués de la configuración inicial y toma la IP interna que aparece ahí — esa es la dirección que debes usar como servidor DNS - Corre
make vm-ipsi estás usando una máquina virtual - Busca en la lista de clientes DHCP de tu router un dispositivo llamado «town-os»
Para que el DNS funcione de forma confiable, tu máquina con Town OS debería tener una dirección IP fija o una reserva DHCP en el router. Si la IP cambia, el DNS se rompe para toda tu red.
Asigna una IP fija o una reserva DHCP
Casi todos los routers permiten reservar una dirección IP para un dispositivo concreto según su dirección MAC. Normalmente está en Configuración LAN, DHCP o Reserva de direcciones. Busca la máquina con Town OS en la lista de clientes y reserva la IP que tiene ahora.
Si tu router no admite reservas DHCP, puedes configurar una IP fija en la propia máquina
con Town OS agregándola a town-os.yaml.
Cambia el servidor DNS en tu router
Los pasos exactos varían según la marca del router, pero el proceso general es el mismo:
- Entra a la interfaz de administración de tu router (normalmente
192.168.1.1o192.168.0.1) - Busca la sección Configuración DHCP, Configuración LAN o Configuración DNS
- Cambia el servidor DNS primario por la dirección IP de tu máquina con Town OS
- Si quieres, pon un servidor DNS secundario como respaldo (por ejemplo
1.1.1.1u8.8.8.8) — se usará cuando Town OS no esté disponible - Guarda y aplica la configuración
Después de guardar, los dispositivos de tu red tomarán el nuevo servidor DNS la próxima vez que renueven su concesión DHCP. Puedes forzarlo desconectándote y volviéndote a conectar a la red, o reiniciando el dispositivo.
Interfaces de routers comunes
| Marca del router | Dónde está la configuración de DNS |
|---|---|
| ASUS | LAN → Servidor DHCP → Servidor DNS |
| TP-Link | DHCP → Configuración DHCP → DNS primario |
| Netgear | Internet → Dirección del servidor de nombres de dominio (DNS) |
| Linksys | Conectividad → Red local → Servidor DHCP → DNS estático |
| UniFi | Configuración → Redes → (tu red) → DHCP Name Server |
| pfSense / OPNsense | Services → DHCP Server → DNS Servers |
| OpenWrt | Red → Interfaces → LAN → Servidor DHCP → Avanzado → DHCP-Options: 6,<ip-de-town-os> |
Desactiva el DNS del navegador
La mayoría de los navegadores traen su propio resolvedor de DNS y se saltan tu router por completo. El DNS sobre HTTPS (DoH) de Firefox y las funciones equivalentes de «DNS seguro» en Chrome y Edge mandan las consultas directo a un proveedor público como Cloudflare o NextDNS, así que Town OS nunca ve la consulta y los nombres de tus paquetes regresan como «servidor no encontrado», aunque el resto de la red los resuelva sin problema. Desactívalo en cada dispositivo que deba llegar a tus servicios por nombre:
- Firefox — Configuración → Privacidad y seguridad → DNS sobre HTTPS, elige Desactivado. (La protección predeterminada también puede activar DoH en silencio, así que elige «Desactivado» en lugar de dejar el valor por omisión.)
- Chrome — Configuración → Privacidad y seguridad → Seguridad, desactiva Usar DNS seguro.
- Edge — Configuración → Privacidad, búsqueda y servicios → Seguridad, desactiva Usar DNS seguro para especificar cómo buscar la dirección de red de los sitios web.
- Brave, Vivaldi, Opera — la misma opción que en Chrome, bajo Privacidad y seguridad → Seguridad.
- Safari — no trae DoH propio; usa el resolvedor del sistema. Verifica que no haya un perfil de DNS instalado en Configuración del sistema → General → VPN, DNS y administración de dispositivos.
Lo mismo aplica a cualquier DNS cifrado que hayas configurado a nivel de sistema — el
DNS privado de Android, los perfiles DNS de iOS/macOS, o una
configuración local de systemd-resolved/dnscrypt. Cualquiera de
ellos anula el servidor DNS que reparte tu router. Si quieres DNS cifrado hacia el
exterior, déjaselo a Town OS: rolodex puede usar DoH/DoT hacia arriba mientras sigue
respondiendo tus nombres locales (ve
Elegir un modo de resolución más abajo).
Verifica que funcione
Cuando tu dispositivo tome la nueva configuración de DNS, verifica que rolodex esté atendiendo tus consultas:
# Revisa qué servidor DNS está usando tu máquina
nslookup example.com
# O consulta directo a Town OS
dig @<ip-de-town-os> example.com
# Consulta un dominio de paquete (si ya tienes paquetes instalados).
# Los nombres siguen el patrón <nombre>.<repo>.<tld> — .home es el TLD de la red predeterminada
dig @<ip-de-town-os> gitea.default.home
Si example.com se resuelve correctamente, rolodex está funcionando y
atendiendo el DNS de tu red.
Elegir un modo de resolución
Los nombres que no pertenecen a ninguna de tus redes se resuelven según el modo de resolución, que configuras en Ajustes → Resolución DNS dentro del panel. Hay tres modos:
- Automático (recomendado) — el predeterminado. Primero intenta resolver de forma iterativa desde los servidores raíz, y si falla va cayendo a DoH/DoT, a un reenviador local y por último a un resolvedor público, quedándose con el nivel que funcionó la última vez. Así conserva la privacidad de la recursión donde la red lo permite y se degrada con elegancia en redes que filtran el DNS saliente.
- Solo recursivo — resuelve todo de forma iterativa desde los servidores raíz, sin alternativas. Garantiza que ninguna consulta se le entregue a un resolvedor de terceros, pero todos los nombres externos fallan en redes que bloquean o secuestran el puerto 53 saliente (hoteles, portales cautivos, algunos ISP).
- Reenvío — siempre manda las consultas que no coinciden a resolvedores externos (Google Public DNS por omisión). Es el comportamiento clásico de reenvío.
Ten en cuenta que este ajuste trata de cómo la computadora llega a internet. El DNS cifrado en la otra dirección — el que usan tus propios dispositivos para llegar a la computadora — se ve a continuación.
DNS cifrado desde tus dispositivos
Town OS sirve DNS cifrado a tus propios dispositivos, no solo para sí mismo. Hay tres extremos disponibles, y todos responden por los mismos nombres que el DNS simple del puerto 53:
- DNS sobre HTTPS (DoH) —
https://dns.<tld>/dns-query. Este pasa por el ingress en el puerto HTTPS estándar, y por eso es el que tiene más probabilidades de funcionar en una red restrictiva. - DNS sobre TLS (DoT) —
dns.<tld>en el puerto 853. - DNS sobre QUIC (DoQ) —
dns.<tld>en el puerto 853 sobre UDP.
Los tres presentan un certificado emitido por la autoridad certificadora de tu propia computadora, con el mismo nombre y las mismas direcciones que usa el resto del sistema. Si ya instalaste la CA raíz en el dispositivo (ve Confiar en la autoridad certificadora), se validan sin nada más que configurar.
Un dispositivo que nunca ha confiado en tu CA también puede verificar estos
extremos. Town OS publica registros DANE que fijan el certificado en la zona de la
que es autoritativo, bajo _853._tcp.dns.<tld> y
_853._udp.dns.<tld> — uno por cada transporte, porque un cliente que
entiende DANE y no encuentra registro para el transporte que eligió falla cerrado. Como el
dispositivo puede llegar al resolvedor, puede bajar la fijación, y así puede comprobar lo
que le entregan sin instalar nada antes.
Los clientes compatibles con DDR encuentran todo esto solos. Town OS
publica un registro de designación en _dns.resolver.arpa (RFC 9462) que nombra
la URL de DoH y los puertos de DoT y DoQ, en ese orden de preferencia — DoH primero, porque
el puerto 443 sobrevive al filtrado que bloquea el 853. Un dispositivo con DDR apuntado a tu
computadora para DNS común descubre el extremo cifrado y se pasa a él por su cuenta.
Estas tres escuchas se abren desde la configuración de la imagen de instalación al arrancar, así que, a diferencia de casi todos los ajustes de DNS, no se activan desde el panel. El certificado que hay detrás se renueva en segundo plano mientras la computadora simplemente está encendida — sin reiniciar — y la nueva fijación DANE se publica antes de retirar la anterior, de modo que no hay ningún momento en que un cliente que valida rechazaría la conexión.
Bloquear dominios maliciosos
rolodex puede filtrar cada consulta contra listas de bloqueo públicas, dándote bloqueo de amenazas para toda la red sin necesidad de un Pi-hole aparte. Esto se administra en DNS → Listas de bloqueo. Hay dos clases de proveedor, y actúan sobre cosas distintas:
- DNSBL (lista de bloqueo de dominios) — coincide con el nombre que se está consultando. Este es el lado que afecta la navegación normal.
- RBL (Realtime Blackhole List) — coincide con una dirección IP, y solo en las consultas de DNS inverso.
Ambos vienen desactivados y con la lista de proveedores vacía, y ambos se consultan sobre la marcha: Town OS nunca descarga, analiza ni guarda en caché por adelantado una lista de bloqueo. No se revisa nada hasta que enciendes una categoría y agregas al menos una zona.
Cómo funciona una consulta DNSBL
El nombre que se está resolviendo se antepone a la zona del proveedor y se
consulta como una petición DNS normal. Resolver badsite.example con
dbl.spamhaus.org activado dispara una consulta a
badsite.example.dbl.spamhaus.org.
- Una respuesta significa que está listado — los proveedores contestan con un registro de dirección (normalmente
127.0.0.x) para un nombre listado. rolodex entonces devuelveNXDOMAINal dispositivo que preguntó. - NXDOMAIN significa limpio — la resolución sigue con normalidad. Un proveedor que da error o se agota por tiempo se trata como no listado, así que una lista de bloqueo inalcanzable nunca deja tu red sin conexión.
- Las listas de bloqueo le ganan al mundo exterior, nunca a tus propios registros — la revisión ocurre después de los registros locales y de paquetes (así que
gitea.default.homesiempre resuelve) pero antes de la caché externa y del reenviador, de modo que un nombre listado se rechaza aunque ya hubiera una respuesta reenviada en caché. - La coincidencia es por nombre, no por sufijo — que
doubleclick.netesté listado no bloqueastats.g.doubleclick.net, a menos que el proveedor también liste ese nombre. Tumbar un dominio entero por un solo host listado es una decisión tuya, no de la lista. - Los resultados se guardan en caché un rato — un listado durante el TTL del proveedor, un resultado limpio durante cinco minutos.
Proveedores DNSBL
Estos son los que puedes agregar con un clic desde el panel. Todos siguen operando, son gratuitos y responden a un resolvedor que recursa por su cuenta sin ningún registro previo — que es justo lo que es un equipo con Town OS. También puedes escribir cualquier otra zona.
| Proveedor | Zona | A qué apunta |
|---|---|---|
| Spamhaus DBL | dbl.spamhaus.org | La lista de dominios más usada. Dominios vistos en spam, más dominios de phishing, de alojamiento de malware y de mando y control de botnets. La cobertura más amplia de las cinco. |
| SURBL | multi.surbl.org | Una lista combinada de dominios que aparecen en el cuerpo de mensajes no solicitados — sitios de phishing, malware, sitios comprometidos y redirectores y acortadores de URL abusados. |
| URIBL | black.uribl.com | URIs encontrados en el cuerpo de mensajes de spam. La zona black es la conservadora: dominios que aparecen activamente en spam, con poca tolerancia a los falsos positivos. |
| NordSpam DBL | dbl.nordspam.com | Dominios vistos en spam, con fuentes independientes de las listas anteriores — útil sobre todo como segunda opinión, no como lista principal. |
| Spam Eating Monkey | uribl.spameatingmonkey.net | Dominios extraídos de URIs de spam, incluyendo dominios recién registrados y desechables de vida corta. |
Cómo funciona una consulta RBL
La dirección IP se invierte y se antepone a la zona del proveedor.
Revisar 192.168.1.100 contra zen.spamhaus.org dispara una
consulta a 100.1.168.192.zen.spamhaus.org. Las direcciones IPv6 se expanden a
nibbles y se invierten igual. Una respuesta significa listado, NXDOMAIN
significa limpio, y los resultados se guardan en caché exactamente igual que los de DNSBL.
El detalle: las zonas RBL solo se consultan para las IPs que aparecen en consultas
de DNS inverso (in-addr.arpa e ip6.arpa), y la
navegación normal apenas genera de esas. Estas listas existen para que un servidor de
correo rechace a un remitente que se conecta, y ahí es donde se ganan su lugar. En el
router de una casa son prácticamente inútiles — el lado DNSBL de arriba es el que de
verdad afecta la navegación. Actívalas si corres un servicio de correo detrás de Town OS;
si no, las listas de dominios son las que merecen tu atención.
Proveedores RBL
| Proveedor | Zona | A qué apunta |
|---|---|---|
| Spamhaus ZEN | zen.spamhaus.org | Cuatro listas de Spamhaus en una sola consulta: SBL (fuentes de spam verificadas), CSS (operaciones de spam tipo snowshoe), XBL (máquinas comprometidas e infectadas, proxies abiertos) y PBL (rangos dinámicos y de usuario final que nunca deberían mandar correo directamente). |
| SpamCop | bl.spamcop.net | IPs reportadas por la red de denuncias de usuarios de SpamCop. Los registros caducan solos cuando dejan de llegar reportes, así que reacciona rápido y olvida rápido. |
| PSBL | psbl.surriel.com | La Passive Spam Block List: IPs atrapadas tocando direcciones trampa, con caducidad automática. Deliberadamente conservadora y de poco volumen. |
Listas que a propósito no se ofrecen
Tres zonas conocidas quedan fuera de la lista de un clic a propósito, porque cada una falla en silencio — verías un proveedor configurado y darías por hecho que estás protegido. Aun así puedes agregarlas a mano si sabes lo que haces.
- SORBS (
dnsbl.sorbs.net) — dada de baja el 5 de junio de 2024 y con sus zonas vaciadas. Responde, solo que nunca lista nada: una operación nula permanente que parece protección. - Barracuda (
b.barracudacentral.org) — gratis, pero exige registrar antes la IP que consulta. Un equipo sin registrar puede funcionar un rato y luego quedar cortado sin aviso. - UCEPROTECT niveles 2 y 3 — listan bloques de red y ASN completos, así que un solo vecino problemático en tu ISP bloquea al ISP entero.
Entradas locales y listas de permitidos
- Entradas locales (DNS → Listas de bloqueo) — bloquea a mano un dominio o una IP concreta, con un motivo anotado al lado. Una entrada de dominio devuelve
NXDOMAINen las consultas directas y surte efecto de inmediato. Se revisa antes que cualquier proveedor externo, y es la forma de bloquear un host específico sin suscribirte a una lista entera. - Listas de permitidos (DNS → Listas de permitidos) — tu salida de emergencia ante un falso positivo. Un nombre permitido se salta toda la revisión por nombre: no se compara ni con los proveedores DNSBL ni con tus entradas locales, y no se emite ninguna consulta al proveedor por él. A diferencia del bloqueo, permitir sí funciona por sufijo — exentar
vendor.exampletambién exentacdn.vendor.example. Las entradas son solo nombres, nunca IPs, así que el camino de RBL por IP inversa queda intacto.
Qué esperar
Estas listas están hechas para el correo, no para la publicidad. Son excelentes con dominios de phishing, malware y carga útil de spam, y mediocres con anuncios y rastreadores — ese trabajo es territorio de las listas descargables tipo hosts, que Town OS deliberadamente no consume. No se descarga nada de forma programada, no se analiza nada y no se guarda nada en caché a tus espaldas. Si quieres que un dominio de anuncios o rastreo concreto desaparezca, agrégalo como entrada local.
Publicar servicios en el DNS
De forma predeterminada, cada servicio de un paquete instalado se publica en el DNS bajo
el TLD de su red, para que puedas llegar a él por nombre. En
DNS → Servicios puedes activar o desactivar la publicación de cada
servicio — un servicio sin publicar sigue corriendo, pero deja de resolverse por nombre.
El nombre completo de cada servicio sigue el patrón
<nombre>.<repo>.<tld> (en la red predeterminada, ese TLD es
.home).
Confiar en la autoridad certificadora
Town OS emite certificados TLS para tus servicios internos a través de la autoridad certificadora integrada en rolodex. Para que tu navegador muestre el candado en vez de una advertencia, cada dispositivo necesita confiar una vez en la CA raíz de Rolodex. Hay tres maneras de obtenerla — usa la que le acomode al dispositivo.
Opción 1: desde el DNS (funciona donde funcione el DNS)
Rolodex publica la cadena de la CA en el propio DNS, así que cualquier
dispositivo capaz de resolver tu zona puede obtenerla — sin necesidad de entrar al
portal de inscripción. La raíz y el intermedio de cada zona se sirven como registros
CERT (RFC 4398) en _ca.<zona>, con un respaldo
fragmentado en TXT en _rolodex-ca.<zona>:
# Consulta los registros publicados de la CA
dig @<ip-de-town-os> CERT _ca.example.home
# Extrae la CA raíz a un archivo PEM (la raíz es la autofirmada)
dig @<ip-de-town-os> +short CERT _ca.example.home
La manera más fácil de aprovechar estos registros en un navegador es la
extensión de navegador de Rolodex (está en el repositorio de rolodex,
en extension/, y se carga sin empaquetar desde
chrome://extensions o about:debugging en Firefox). Abre la
sección CA via DNS del menú emergente, escribe tu URL de DoH
(https://<ip-de-town-os>/dns-query) y tu zona, y la extensión obtiene
la cadena por DNS-over-HTTPS, prefiere los registros CERT con respaldo automático a TXT,
la verifica contra los registros DANE TLSA publicados si le das un nombre de host, y te
ofrece la raíz, el intermedio y la cadena completa como descargas PEM.
Opción 2: desde el portal de inscripción
Estando en la red de confianza, entra al portal de inscripción
(https://<ip-de-town-os>:8500 por omisión) y haz clic en
Download root CA (PEM). La misma extensión y la consola local
rolodex-ca-ui también pueden hacerlo.
Opción 3: desde la línea de comandos
# Con la CLI de administración (imprime el PEM de la raíz + el intermedio)
rolodex-dns-cli ensure-zone-ca --zone example.home
# O descarga directamente desde el portal
curl -k https://<ip-de-town-os>:8500/api/ca -o rolodex-root-ca.pem Instala la CA raíz en tu dispositivo
Una vez que tengas rolodex-root-ca.pem, agrégalo al almacén de confianza:
| Plataforma | Cómo |
|---|---|
| Firefox | Configuración → Privacidad y seguridad → Certificados → Ver certificados → Autoridades → Importar (marca “Confiar en esta CA para identificar sitios web”) |
| Chrome / Edge (escritorio) | Usan el almacén de confianza del sistema — instálala según las filas del sistema operativo de abajo y reinicia el navegador |
| macOS | Haz doble clic en el PEM para agregarlo a Acceso a Llaveros y ponlo en “Confiar siempre” bajo SSL |
| Linux (Fedora/RHEL) | sudo cp rolodex-root-ca.pem /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust |
| Linux (Debian/Ubuntu) | sudo cp rolodex-root-ca.pem /usr/local/share/ca-certificates/rolodex.crt && sudo update-ca-certificates |
| Windows | Doble clic → Instalar certificado → Equipo local → “Entidades de certificación raíz de confianza” |
| Android | Configuración → Seguridad → Cifrado y credenciales → Instalar un certificado → Certificado de CA |
| iOS | Abre el PEM (por AirDrop o correo), instala el perfil y actívalo en Configuración → General → Información → Ajustes de confianza de certificados |
Los servidores con certificados emitidos por el endpoint ACME de Rolodex presentan una
cadena de hoja + intermedio que valida contra esta raíz. Los clientes que
entienden DANE pueden además verificar el intermedio contra los registros
TLSA que rolodex publica solo al momento de emitir.
Redes y acceso remoto
Town OS agrupa tus servicios en redes. Todo equipo empieza con una red
integrada llamada home — es solo de red local, resuelve nombres bajo
.home y no tiene túnel. Para llegar a tus servicios de forma segura desde
fuera de casa, crea redes adicionales: cada una es una superposición
WireGuard emparejada con su propio TLD de DNS, y se administra en
Panel → Redes (solo administradores).
La red predeterminada
- Siempre está y no se puede quitar. La red
homese crea sola y es donde caen los paquetes a menos que elijas otra. - Solo local. No tiene transporte WireGuard — los nombres
.homese resuelven en tu red local y a propósito nunca se exponen a los pares remotos. - Usa el TLD
.home, que viene del ajustedns_tld.
Crear una red para acceso remoto
Haz clic en Crear red y dale un nombre (por ejemplo oficina)
y, si quieres, un TLD (por omisión toma el nombre de la red). Entonces Town OS:
- Genera una interfaz WireGuard con una subred de superposición determinista sacada del rango
10.64.0.0/10, con el propio equipo en la dirección.1. - Reclama el TLD de la red (los TLD son únicos por equipo — crear una red con un TLD que ya tiene otra se rechaza).
- Corre un resolvedor DNS por red sobre la superposición, para que los dispositivos conectados puedan resolver los nombres de esa red.
El interruptor de acceso remoto de cada fila levanta o baja la interfaz WireGuard. Apagarlo corta el acceso remoto pero deja los contenedores corriendo y accesibles en la red local.
Dar de alta un dispositivo
Abre el diálogo de Pares de una red, escribe el nombre del dispositivo y haz clic en Agregar par. Town OS te devuelve una configuración de WireGuard lista para importar — pégala en la app de WireGuard de tu celular o tu laptop.
Copia la configuración de inmediato. Contiene una llave privada recién generada que nunca se guarda — no puedes recuperarla después, y tendrás que dar de alta el dispositivo otra vez si la pierdes.
La configuración generada apunta el DNS del dispositivo a la dirección de superposición del equipo, así que los nombres de tu red se resuelven solos en cuanto el túnel está arriba. Deja apagado el interruptor Corre rolodex DNS para los dispositivos normales; enciéndelo solo para un par que a su vez corra un servidor DNS rolodex al que quieras reenviar.
Cuentas solo de WireGuard
Para dejar que alguien dé de alta sus propios dispositivos sin darle rienda suelta al panel, crea una cuenta solo de WireGuard (una casilla en la pantalla de Crear usuario). Una cuenta así:
- Está limitada a una o más redes concretas — solo puede dar de alta pares en esas, y nunca en la red
home. - Es restrictiva por diseño: puede autenticarse, dar de alta y renovar sus propios pares, y obtener la CA, pero nada más del plano de control.
- Da de alta pares que caducan. Cada alta trae un tiempo de vida (2 horas por omisión, ajustable en Ajustes → Tiempo de vida de pares WireGuard) y hay que renovarla para seguir conectado; los dispositivos abandonados caducan solos. Los pares que agrega un administrador son permanentes.
Vigilar y desconectar pares
El panel de Pares conectados en la página de Redes lista todos los pares dados de alta en todas las redes, con su estado de saludo en vivo, su IP de superposición, los datos transferidos y su caducidad. Para cortarle el paso a un dispositivo por la fuerza, usa Desconectar — eso quita el par, tira su túnel de inmediato y revoca su llave, así que el dispositivo no puede volver a conectarse hasta darlo de alta otra vez.
Instalar paquetes en una red
El diálogo de instalación (y el de Páginas) incluye un selector de
Red. La red que elijas determina el nombre DNS del servicio y su
certificado TLS — un paquete instalado en
oficina se resuelve bajo .oficina y su certificado se emite para
ese nombre. Los servicios en una red distinta de la predeterminada tienen doble domicilio:
se resuelven a la dirección de superposición para los pares por túnel y a la dirección de
red local para los clientes locales. Reinstalar un paquete en otra red mueve su DNS y sus
certificados al TLD de esa red.
Por ejemplo, instalar Jitsi en una red con el TLD fart lo publica en
jitsi.default.fart. Ya corriendo, el servicio aparece en tu
Panel como un enlace en el que puedes hacer clic con esa dirección, listo
para abrirse desde cualquier dispositivo de la red.
Town OS en Android
El cliente de Android de Town OS conecta tu celular a una de tus redes por WireGuard y configura el DNS para que tus servicios se resuelvan por nombre — desde donde sea. Es un cliente completo de WireGuard que da de alta el celular como par por ti; no hay ningún archivo de configuración que copiar a mano.
Instalar la app
La app se distribuye como APK desde la página de versiones del proyecto — no está en Play Store ni en F-Droid.
- Descarga el APK de depuración (
town-os-client-<versión>-debug.apk). El-unsigned.apkde esa misma versión no se puede instalar tal cual — el proyecto no distribuye llave de firma, así que el de depuración es el que debes bajar. - Requiere Android 8.0 (Oreo) o más nuevo.
- ¿Prefieres compilarla tú? Clona el repositorio y corre
make deps && make debug && make installcon el celular conectado por USB y la depuración USB activada.make helplista todos los objetivos.
Hay dos maneras de instalarla: directo desde el celular, o por USB desde una computadora. La primera no necesita más que el celular.
Instalar directo desde el celular
Sin computadora, sin cable y sin modo de desarrollador — las opciones de
desarrollador y la depuración por USB solo importan para la vía de adb de más
abajo. Lo único que pide Android es permiso para instalar una app que no viene de una
tienda.
- Descarga el APK en el navegador del celular. Abre la página de versiones y toca el archivo
town-os-client-<versión>-debug.apk. El navegador advierte que este tipo de archivo puede dañar tu dispositivo — esa advertencia sale con cualquier APK; elige Descargar de todos modos. - Ábrelo desde la notificación de descarga, desde la lista de Descargas del navegador, o desde la app Archivos.
- Autoriza la fuente. La primera vez, Android dirá que la app que lo está abriendo no tiene permiso para instalar apps desconocidas y te ofrecerá un botón de Configuración — tócalo, activa Permitir desde esta fuente para esa app (tu navegador o tu administrador de archivos) y regresa. Ese mismo interruptor vive en Configuración → Apps → Acceso especial → Instalar apps desconocidas.
- Toca Instalar. Puede que Play Protect ofrezca analizar la app, o que avise que viene de un desarrollador no reconocido — algo esperable en una app instalada por fuera de la tienda. Elige Instalar de todos modos.
- Abre Town OS desde el cajón de aplicaciones cuando termine de instalarse.
Copiar primero el APK desde una computadora — por transferencia de archivos por USB, con
adb push, o con cualquier app de sincronización — y abrirlo después en un
administrador de archivos funciona exactamente igual.
Activar el modo de desarrollador
Esto solo hace falta para la vía de adb — instalar el APK desde las descargas
del propio celular funciona sin ello. Tanto adb install como
make install se comunican con el celular por depuración USB, que vive detrás
del menú oculto Opciones de desarrollador de Android.
- Abre Configuración → Acerca del teléfono. En los celulares Samsung es Configuración → Acerca del teléfono → Información de software.
- Toca Número de compilación siete veces. Android va contando ("Ya te faltan 3 pasos para ser desarrollador") y te pide tu PIN, patrón o contraseña antes de terminar.
- Un mensaje confirma Ya eres desarrollador. Entonces Opciones de desarrollador aparece en Configuración → Sistema — algunos celulares la ponen en el primer nivel de Configuración, así que búscala ahí si no está donde esperas.
- Abre Opciones de desarrollador y activa la Depuración por USB.
- Conecta el celular a la computadora. Android muestra el diálogo ¿Permitir la depuración por USB? con la huella digital de la llave de la computadora — marca Permitir siempre desde esta computadora y acepta. Corre
adb devicespara confirmar que el celular aparece comodevicey no comounauthorized.
Vuelve a desactivar la Depuración por USB cuando termines. Le da a cada computadora que hayas autorizado acceso completo al celular por el puente de depuración, así que dejarla prendida para el uso diario es un riesgo innecesario.
Instalar con adb, sin el repositorio
No necesitas el código fuente del cliente para instalar por USB — make install
solo es un atajo. La vía de adb únicamente requiere el APK publicado y el
binario adb, que viene en las Android SDK Platform Tools de
Google.
- Ubuntu / Debian —
sudo apt install adb android-sdk-platform-tools-common. El segundo paquete trae las reglas de udev que permiten a tu cuenta de usuario llegar al celular sin ser root; desconecta y vuelve a conectar el celular después. - Arch / Manjaro —
sudo pacman -S android-tools android-udev, y luego agrégate al grupoadbusersconsudo usermod -aG adbusers $USERy cierra y vuelve a abrir sesión. - macOS —
brew install --cask android-platform-tools. No hay nada más que configurar; macOS se comunica con el celular sin controladores. - Windows —
winget install Google.PlatformToolsen PowerShell, o baja el ZIP de abajo. La mayoría de los celulares funcionan con el controlador que Windows instala solo; unos cuantos fabricantes (Samsung, Xiaomi) exigen su propio controlador USB para queadbsiquiera vea el dispositivo. - Cualquier otro sistema — descarga el
ZIP de platform-tools
de Google y descomprímelo donde quieras. No hay nada que instalar — corre
adbdesde esa carpeta (.\adb.exeen Windows).
Confirma que quedó con adb version. Después descarga el APK de depuración desde la
página de versiones,
activa la depuración por USB como se explicó arriba, conecta el celular y:
# Confirma que el celular está conectado y autorizado
adb devices
# Instala el APK
adb install town-os-client-<versión>-debug.apk Un par de cosas que suelen atorar a la gente:
no devices/emulators found— el cable es solo de carga, o no le has dicho al celular que autorice esta computadora. Reconecta el cable y busca el aviso ¿Permitir la depuración por USB? en la pantalla del celular.no permissionsen Linux — falta el paquete de reglas de udev de arriba, o el celular ya estaba conectado antes de instalarlo. Instálalo, reconecta el celular y correadb kill-server && adb devices.INSTALL_FAILED_UPDATE_INCOMPATIBLE— ya hay instalada una copia firmada con otra llave, lo cual pasa si antes compilaste una tú. Quita la app vieja (mantén presionado su ícono en el cajón de aplicaciones, o usaadb uninstallcon el nombre de paquete que salga deadb shell pm list packages town) e instala de nuevo.- Actualizar sin perder datos —
adb install -r town-os-client-<versión>-debug.apkreemplaza una instalación existente y conserva sus datos, siempre que ambas vengan de la página de versiones. - Nada de esto toca el almacenamiento del celular —
adb installtransfiere e instala en un solo paso, así que nunca tienes que buscar el archivo en un administrador de archivos después.
Antes de conectarte
- Crea una red primero. La app solo puede unirse a redes que tengan una superposición WireGuard — la red integrada
homees solo local y no aparecerá. Ve Crear una red para acceso remoto. - Ten lista una cuenta de administrador. Dar de alta un dispositivo es una acción de administrador, así que la app inicia sesión con credenciales de administrador.
Conectarse a una red
- Inicia sesión en tu equipo. Escribe su dirección — una IP pelona,
IP:puertoo una URL completa (se asume el puerto5309) — junto con tu usuario y contraseña de administrador. - Únete a una red. La app lista las redes a las que puedes unirte, cada una con su TLD, su subred y su número de pares. Dale un nombre al dispositivo (por omisión toma el modelo de tu celular) y toca Unirse. El par de llaves de WireGuard se genera en el celular y solo se manda la mitad pública al equipo, así que tu llave privada nunca sale del dispositivo.
- Conéctate. Toca Conectar y aprueba la solicitud de conexión (VPN) de Android. La app levanta el túnel e instala el TLD de la red como dominio de búsqueda, así que tanto
giteacomogitea.default.<tld>se resuelven. - Ya estás en la red por nombre desde donde sea. Usa Desconectar para tirar el túnel, u Olvidar esta red para borrar el alta guardada.
Solución de problemas
- Los nombres no se resuelven, pero el túnel está arriba. El culpable de siempre es el DNS privado estricto de Android. Si está fijado al nombre de host de un proveedor concreto, Android manda todas las consultas ahí e ignora el túnel, así que los nombres de Town OS regresan como «no encontrado». Cambia Configuración → Red e internet → DNS privado a Automático o Desactivado. La app detecta esto y muestra una advertencia con un atajo directo al ajuste. (El modo automático está bien y nunca genera advertencia.)
- ¿Sigue sin funcionar? En la tarjeta de DNS de la app, pon el resolvedor alternativo en la dirección local del equipo — la app lo enruta por el túnel, así que el DNS de horizonte partido sigue funcionando.
- Te desconectó al reiniciar el equipo. Town OS borra todas las sesiones al reiniciarse; solo vuelve a iniciar sesión.
Armar máquinas virtuales desde imágenes USB
El repositorio install
incluye scripts para levantar Town OS en máquinas virtuales, lo cual sirve para pruebas y
desarrollo — ya sea desde una imagen que construiste tú
o directamente desde una memoria USB física que ya grabaste.
make help lista todos los objetivos y variables.
QEMU
make qemu-fg
Construye la imagen si está desactualizada y luego levanta una máquina virtual de QEMU en
primer plano, con la consola serial conectada, aceleración por KVM y
cuatro discos virtuales de datos para probar el almacenamiento. Este es el objetivo al que
debes recurrir: ves el arranque y el instalador directo en tu terminal, y Ctrl-C detiene la
máquina. Usa make qemu si prefieres que corra en segundo plano (conéctate
después con make serial), y
make rebuild-qemu para detener, limpiar, reconstruir y relanzar de un jalón.
La máquina virtual se conecta a la red NAT default de libvirt en
virbr0 y queda fija en VM_IP (192.168.122.50 por
omisión), así que dale su propia dirección a cada máquina que corras al mismo tiempo.
Como el huésped está detrás de NAT, VM_LAN=1 (el valor por omisión) retransmite
la API de control (5309), la interfaz (80/443), ssh
(2222) y los puertos UDP de WireGuard desde la dirección de red local del
anfitrión hacia el huésped — eso es lo que permite que un celular con el
cliente de Android llegue a una máquina virtual. Pon
VM_LAN=0 para apagar esas retransmisiones.
Arrancar una USB física (qemu-usb)
make qemu-usb USB_DEV=/dev/sdX
Arranca QEMU en primer plano directamente desde una memoria USB física ya grabada, en vez
de una imagen construida — práctico para confirmar que la memoria que acabas de grabar
realmente arranca. El dispositivo se abre en solo lectura (instantánea),
así que lo que escriba el huésped se descarta y la USB real nunca se modifica; los cuatro
discos virtuales de datos siguen conectados para probar el almacenamiento. Este objetivo no
construye nada — clona el repositorio install, graba una memoria con
install.sh o make flash, y luego apunta USB_DEV hacia
ella. En un anfitrión x86_64, TARGET=aarch64 (o rpi) arranca la
memoria bajo emulación de sistema completo, así que puedes probar una imagen de otra
arquitectura sin tener el hardware correspondiente.
Detener y limpiar
# Detén la máquina virtual
make stop
# Detén las máquinas virtuales y borra la imagen y los discos virtuales
make clean Variables de entorno
| Variable | Por omisión | Descripción |
|---|---|---|
IMAGE_SIZE | 12G | Tamaño disperso de la imagen USB durante la construcción — después la imagen se encoge |
VM_DISK_SIZE | 50G | Tamaño de cada uno de los cuatro discos virtuales de datos (se lee de vm_disk_size en town-os.yaml) |
VM_MEMORY | 4G | Memoria de la máquina virtual |
VM_CPUS | 4 | vCPUs de la máquina virtual — el valor por omisión de QEMU, 1, deja sin aire al pool de trabajo de rolodex |
VM_BRIDGE | virbr0 | Interfaz puente del anfitrión para la red |
VM_NAME | town-os | Nombre de la máquina virtual, también sirve para encontrarla y detenerla |
VM_IP | 192.168.122.50 | Reserva DHCP de libvirt — dale su propia dirección a cada máquina que corra al mismo tiempo |
VM_LAN | 1 | Retransmite los puertos del huésped tras NAT a la dirección de red local del anfitrión; 0 lo desactiva |
USB_DEV | — | Dispositivo de bloques físico para make flash (escritura) y make qemu-usb (arranque en solo lectura) |
Consola serial
# Conéctate a la consola serial de la máquina virtual
make serial
# O manualmente con socat
socat -,rawer,escape=0x1d unix-connect:/tmp/town-os-serial.sock
# Sal con Ctrl-] Encontrar la máquina virtual
# Obtén la dirección IP de la máquina virtual
make vm-ip
# O conéctate por mDNS desde el anfitrión
ssh root@town-os.local Instalación con RAID
El aprovisionamiento de discos lo hace de forma interactiva ttyforce durante el primer arranque. Todo el almacenamiento usa btrfs.
Selección automática del RAID
ttyforce detecta los discos disponibles, los agrupa por tipo de transporte (NVMe, SATA, etc.) y por tamaño similar, y luego elige automáticamente el nivel de RAID según cuántos discos haya:
- 1 disco — modo único (sin redundancia)
- 2 discos — RAID 1 (espejo de btrfs)
- 3 o más discos — RAID 5 (btrfs con paridad distribuida)
El punto de montaje por omisión es /town-os. ttyforce crea los subvolúmenes
@etc y @var para la persistencia compatible con overlayfs.
Detección de discos
ttyforce detecta solo los dispositivos de almacenamiento disponibles. Identifica discos NVMe, discos SATA/SAS y tarjetas SD, y excluye el dispositivo USB de arranque y cualquier medio extraíble. La lógica de detección garantiza que Town OS nunca toque el disco desde el que arrancó.
Sistema de archivos superpuesto
Sin importar el backend de almacenamiento, Town OS usa montajes superpuestos para la
persistencia de /var y /etc. La capa inferior viene de la raíz
squashfs, mientras que la superior vive en el almacenamiento RAID/ZFS. Así, la
configuración del sistema y los datos de los servicios sobreviven a los reinicios mientras
el sistema operativo base se mantiene inmutable.
Usar la interfaz
Town OS trae un panel web limpio para administrar tu servidor. Después de arrancar, abre un
navegador y ve a la dirección IP de tu máquina con Town OS o a
http://town-os.local.
Primer arranque: crear tu cuenta
En el primer arranque se te pedirá crear una cuenta de administrador. Elige un usuario y una contraseña — esa cuenta tiene control total sobre el sistema.
Panel
El panel muestra un resumen de tu sistema — los paquetes instalados aparecen como tarjetas de servicio con indicadores de estado, acciones rápidas y la salud del sistema de un vistazo.
Explorar e instalar paquetes
La vista de Paquetes te deja buscar los paquetes disponibles, ver sus detalles e instalarlos con preguntas guiadas. Las preguntas de cada paquete se presentan como un formulario — llena los nombres de host, los puertos y demás configuración, y luego haz clic en instalar.
Administrar servicios
Los servicios instalados se pueden arrancar, detener y reiniciar desde la vista de Servicios. Los indicadores de estado muestran si cada servicio está corriendo, detenido o en error.
Ver registros
La vista de Registros ofrece la salida del journal en vivo, con filtrado y búsqueda tipo grep. Puedes filtrar por servicio, por nivel de prioridad y buscar texto específico.
Administración del almacenamiento
Consulta y administra subvolúmenes btrfs, configura cuotas por paquete y vigila el uso de disco en todo tu almacenamiento.
Monitoreo
Town OS incluye monitoreo integrado con Prometheus y Node Exporter para seguir las métricas del sistema, la salud de los servicios y el uso de recursos con el tiempo. Trae un panel ligero integrado por omisión, con la opción de pasarse a Grafana.
Ajustes y bitácora de auditoría
La página de Ajustes te deja configurar las opciones de todo el sistema. La bitácora de auditoría registra cada acción administrativa — instalaciones, desinstalaciones, cambios de estado de servicios y modificaciones de configuración — para que siempre sepas qué cambió y cuándo.
Hospedar sitios estáticos
Más allá de los paquetes en contenedores, Town OS trae hospedaje de sitios estáticos integrado, siempre encendido y administrado en Panel → Páginas. Cada página la sirve un servidor web compartido detrás de la entrada, y obtiene un nombre DNS y un certificado TLS bajo el TLD de su red, igual que un paquete.
Orígenes del contenido
Al crear una página eliges un nombre, un dominio (por
omisión, el nombre), una red (por omisión home) y uno de tres
orígenes de contenido:
- Subir un archivo — sube un tarball de tu sitio. La página se queda pendiente hasta que lo subas.
- Repositorio git — clona desde la URL de un repo. Puedes indicar una rama (por omisión
main), lo cual es cómodo para sitios publicados engh-pages. - Imagen de contenedor — extrae un directorio de una imagen OCI.
Las páginas de git y de contenedor se preparan de forma asíncrona — la tabla muestra una insignia de Preparando… que termina en activa o en error. Usa Reconstruir para traer el contenido más reciente en las páginas de git y de contenedor; en una página de archivo, sube un tarball nuevo.
Cómo se sirven las páginas
Cada página vive en su propio subvolumen de almacenamiento y se sirve directamente por HTTP en el puerto 80, mientras que los servicios de los paquetes redirigen el puerto 80 a HTTPS. Como una página lleva una red, su nombre se resuelve bajo el TLD de esa red y está accesible desde tu red local y — si la red es una superposición WireGuard — desde tus dispositivos remotos dados de alta.
Actualizar Town OS
Town OS actualiza sus servicios centrales en el sitio desde el panel. En Administración del sistema, el botón Actualizar servicios centrales descarga las imágenes de contenedor más recientes y reinicia todos los servicios centrales — incluido el propio controlador del sistema, que es como el equipo se actualiza a sí mismo.
Qué pasa durante una actualización
- Las imágenes se descargan y los servicios se reinician en orden de dependencias: primero el controlador del sistema (para que su imagen nueva esté lista antes de reiniciarse a sí mismo), luego el DNS y después todo lo demás.
- Tu sesión se reinicia a propósito cuando el controlador se reinicia, así que el panel deja en pausa sus verificaciones habituales de sesión mientras corre la actualización, en lugar de mandarte de vuelta a la pantalla de inicio de sesión.
- El avance se muestra en cinco pasos: Arrancando el controlador del sistema → Arrancando el DNS → Iniciando los servicios del sistema → Reiniciando los paquetes (una fila por cada paquete instalado) → Listo.
- Cuando la actualización termina, el panel muestra un botón de Recargar en vez de recargarse solo y dejarte a media acción.
Esos mismos cinco pasos aparecen en la pantalla de aprovisionamiento durante un arranque normal, así que puedes ver el avance del inicio paquete por paquete.
Crear un paquete
Los paquetes de Town OS son archivos YAML que describen cómo correr un servicio en contenedor. Para la especificación completa, ve la referencia del formato de empaquetado. Esta sección cubre el flujo práctico.
Estructura del repositorio
Un repositorio de paquetes es un repositorio git con un directorio packages/.
Cada paquete tiene su subdirectorio con definiciones YAML versionadas:
my-packages/
packages/
my-app/
1.0.yaml
2.0.yaml Escribir la definición de un paquete
Un paquete mínimo solo necesita un campo image. Un paquete típico incluye
además una descripción, red, volúmenes y preguntas para el usuario:
image: myapp:latest
description: My custom application
supplies: ["http"]
network:
external:
"@port@": "8080"
volumes:
data:
mountpoint: /app/data
quota: 5gb
questions:
port:
query: "What external port should this app use?"
type: port
default: "9000"
notes:
URL:
value: "http://@LOCAL_EXTERNAL_HOST@:@port@"
type: url
Las preguntas admiten varios tipos más allá del texto libre y de port:
secret (se genera sola si la dejas en blanco), boolean (se
dibuja como casilla), oauth (un botón de Conectar que corre
el flujo de dispositivo de un proveedor para obtener un token), y cualquier pregunta puede
marcarse con optional: true para permitir dejarla vacía. La lista completa está
en Preguntas, en la referencia del formato de
empaquetado. Al momento de instalar, el operador también elige en qué
red se sirve el paquete.
Sistema de plantillas
Usa la sintaxis @variable@ para referirte a las respuestas de las preguntas y a
las variables integradas (@LOCAL_EXTERNAL_HOST@,
@LOCAL_INTERNAL_HOST@). Las plantillas funcionan en variables de entorno,
asignaciones de puertos, cuotas y valores de las notas.
Probar en local
Usa el entorno de desarrollo para probar tu paquete. Pon tu
repositorio en disco, agrégalo desde la interfaz o desde repositories.json, e
instala tu paquete. El entorno de desarrollo te da todo Town OS para hacer pruebas.
Agregar un repositorio
Agrega tu repositorio de paquetes a Town OS desde la interfaz
(Paquetes → Repositorios → Agregar repositorio) o editando
repositories.json directamente:
[
{"name": "default", "url": "https://github.com/town-os/default-packages"},
{"name": "my-packages", "url": "https://github.com/myuser/my-packages"}
] Cosas que puedes autoalojar
Town OS está hecho para correr cualquier cosa que se distribuya como imagen de contenedor. Aquí van algunas ideas para arrancar — muchas ya están disponibles en el repositorio de paquetes predeterminado, y cualquier imagen de contenedor se puede empaquetar con una definición YAML sencilla.
Medios y entretenimiento
- Plex / Jellyfin — transmite tu colección de películas y series a cualquier dispositivo
- Navidrome — servidor personal de música en streaming
- Calibre-web — administra y lee tu colección de libros electrónicos
Código y colaboración
- Gitea / Forgejo — Git autoalojado y ligero
- GitLab — plataforma DevOps completa
- Nextcloud — archivos, calendario, contactos y más
- Wiki.js / BookStack — documentación y bases de conocimiento
Comunicación
- Jitsi Meet — videoconferencias privadas
- Matrix / Synapse — chat cifrado y federado
- Mattermost / Rocket.Chat — mensajería de equipo
Servidores de juegos
- Servidores dedicados de Valheim, Minecraft, Terraria y Satisfactory
- Soporte de Proton/Steam mediante contenedores de GloriousEggroll
- Cualquier servidor de juego que se distribuya como binario de Linux o como contenedor
Domótica
- Home Assistant — centro de control para el hogar inteligente
- Node-RED — flujos de automatización visuales
- Mosquitto — broker MQTT para dispositivos IoT
Privacidad y seguridad
- Pi-hole / AdGuard — bloqueo de anuncios para toda la red
- WireGuard / OpenVPN — servidores VPN para acceso remoto
- Vaultwarden — administrador de contraseñas autoalojado
Productividad
- Paperless-ngx — gestión documental y OCR
- Immich — gestión autoalojada de fotos y videos
- Planka / Wekan — tableros kanban y gestión de proyectos
Entorno de desarrollo y suite de pruebas
El entorno de desarrollo de Town OS corre todo el sistema en local con contenedores de Podman. Es la manera más rápida de probar cambios, desarrollar paquetes y correr la suite de pruebas.
Requisitos previos
- Linux — necesario para btrfs y para los contenedores rootful de Podman
- Podman — entorno de contenedores (en modo rootful, con sudo)
- Go 1.25+ — para el servidor de la API
- Bun — para la construcción del frontend y su servidor de desarrollo
- btrfs-progs — para administrar el almacenamiento
- QEMU — qemu-system-x86_64 y qemu-img para los paquetes de máquina virtual
- libsystemd — cabeceras de desarrollo para la integración con systemd
- golangci-lint — para el análisis estático de Go
- Python 3 — para los scripts de construcción y de pruebas
Arrancar el entorno de desarrollo
git clone https://gitea.com/town-os/town-os.git
cd town-os
make dev Eso levanta todo el entorno de desarrollo con recarga en caliente. Cuando esté listo, abre la URL que se imprime en la terminal para entrar al panel de Town OS.
Comandos del entorno de desarrollo
| Comando | Descripción |
|---|---|
make dev | Arranca todo el entorno de desarrollo |
make dev-stop | Detiene todos los contenedores de desarrollo |
make dev-logs | Sigue los registros de los contenedores de desarrollo |
make dev-clean | Elimina los contenedores y volúmenes de desarrollo |
Correr las pruebas
| Comando | Descripción |
|---|---|
make test | Corre las pruebas unitarias |
make test-integration | Corre las pruebas de integración (requiere Podman con privilegios) |
make test-ui-integration | Corre las pruebas de integración de la interfaz |
make test-full | Corre todas las pruebas (unitarias + integración + interfaz) |
make auto-test | Vigila los cambios y vuelve a correr las pruebas solo |
Pruebas de integración
Las pruebas de integración corren dentro de un contenedor de Podman con privilegios que provee un sistema de archivos btrfs real, systemd y Podman dentro de Podman. Así las pruebas recorren los mismos caminos de código que una instalación en producción. El contenedor de pruebas es efímero — se crea nuevo en cada corrida y se limpia al terminar.
Reportar errores
¿Encontraste algo roto? Un buen reporte de error ayuda a arreglar las cosas más rápido. Así se junta la información necesaria y se levanta un reporte útil.
Juntar registros con la API
Town OS expone los registros del journal a través de su API REST. Puedes usar Claude Code para conectarte a la API y generar un resumen de los errores recientes:
# Trae las entradas del journal con prioridad de error desde Town OS
curl -s http://town-os.local:5309/api/systemd/logs/tail?priority=err | jq . O usa Claude Code para resumir los errores de forma interactiva:
# Ejemplo de instrucción para Claude Code:
"Connect to the Town OS API at http://town-os.local:5309
and fetch the last 100 error-priority journal entries from
/api/systemd/logs/tail. Summarize the errors, group them
by service, and suggest likely causes." Levantar un issue
Los issues se levantan en la instancia de Gitea de Town OS, en gitea.com/town-os/town-os/issues.
Qué incluir
- Resumen del journal — la salida del registro de errores o un resumen hecho con Claude Code de los errores recientes
- Pasos para reproducirlo — qué hiciste para provocar el problema, paso a paso
- Versión de Town OS — la fecha de compilación o el hash del commit que sale en la pantalla de arranque
- Backend de almacenamiento — btrfs, btrfs-mdadm o ZFS, y cuántos discos
- Entorno — hardware físico o QEMU; tamaños de RAM y de disco