Inicio rápido

Pon Town OS en marcha en un ordenador que te sobre, 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

Ejecuta el script de instalación en cualquier máquina con Linux que tenga instalados podman, curl, bzip2, dd, lsblk y tarPodman 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 directamente 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 tarda 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 ejecutas 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 de la EEPROM incluya NVMe (se ajusta con rpi-eeprom-config).

ADVERTENCIA DE DESTRUCCIÓN DE DATOS

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 al ordenador de destino y arranca desde ella. Puede que tengas que pulsar una tecla durante el encendido para llegar al menú de arranque — las teclas más habituales son F12, F2, Esc o Supr, según tu hardware.

3. Primer arranque: usa sledgehammer

Si la máquina de destino ya se ha usado 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 garantiza que Town OS empiece con la pizarra completamente limpia. Así evitas problemas causados por tablas de particiones, sistemas de ficheros 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 sola. Si no, te muestra la selección de redes WiFi con la intensidad de la señal, el tipo de seguridad y la introducción 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 claves SSH — puedes escribir nombres de usuario de GitHub para importar claves 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 de 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, gestionar 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.

Compilar la imagen USB desde el código

La imagen USB de Town OS se compila desde el repositorio install. El proceso produce una imagen arrancable con un sistema de ficheros 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 compilación usa herramientas de Arch Linux (pacstrap, mkinitcpio, arch-chroot), pero no hace falta que ejecutes Arch — en cualquier otra distribución, make image lanza la compilació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/RHEL
  • make deps-debian — Debian o Ubuntu

Esos objetivos traen todo lo que necesitan la compilación y las herramientas de máquinas virtuales — make, podman, arch-install-scripts, squashfs-tools, parted, e2fsprogs, dosfstools, qemu y libvirt.

Clonar y compilar

git clone https://gitea.com/town-os/install.git
cd install
make image

Ejecutar make o make image compila la imagen USB completa. El proceso descarga el sistema base, instala los componentes de Town OS, comprime todo en un sistema de ficheros squashfs y monta 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 ficheros 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 se ejecuta 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 compila la imagen si está desactualizada y la graba en un dispositivo USB. Si prefieres hacerlo a mano, ten en cuenta que la compilación produce un fichero 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 fichero 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

Comprueba dos veces el dispositivo de destino — dd sobrescribe aquello a lo que le apuntes, sin pedir confirmación.

Proceso de arranque
Memoria USB
Tabla de particiones GPT
Sistema EFI Raíz squashfs
arranque
Sistema en marcha
capa tmpfs lectura-escritura
squashfs solo lectura
RAM
El sistema se ejecuta por completo en memoria

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 devuelve 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 ha corrompido.

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 ficheros 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 copias de seguridad de lo que necesites antes de usar esta opción.

Cómo se usa

  1. Conecta la memoria USB de Town OS en la máquina de destino y arranca desde ella
  2. En el menú de arranque, elige la entrada sledgehammer en lugar de la opción predeterminada
  3. El sistema borra todo el almacenamiento detectado y se reinicia solo
  4. 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 ficheros está dañado más allá de toda reparación, sledgehammer te da un punto de partida limpio
  • Reinstalación — reaprovechar el hardware con otra configuración de Town OS
Flujo de reinicio con sledgehammer
Menú de arranque
Elige sledgehammer
sledgehammer
borrar
Limpiar almacenamiento
Se borran todos los discos detectados
NVMe SATA SD
reiniciar
Configuración nueva
El almacenamiento se configura desde cero
town-os.yaml

Configurar el DNS en tu router

Town OS incluye rolodex, un servidor DNS que gestiona 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 en el panel en http://town-os.local despué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
  • Ejecuta make vm-ip si estás usando una máquina virtual
  • Busca en la lista de clientes DHCP de tu router un dispositivo llamado «town-os»
El panel de Town OS mostrando la IP externa y la IP interna con botones para copiarlas

Para que el DNS funcione de forma fiable, 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 añadié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:

  1. Entra en la interfaz de administración de tu router (normalmente 192.168.1.1 o 192.168.0.1)
  2. Busca la sección Configuración DHCP, Configuración LAN o Configuración DNS
  3. Cambia el servidor DNS primario por la dirección IP de tu máquina con Town OS
  4. Si quieres, pon un servidor DNS secundario como respaldo (por ejemplo 1.1.1.1 u 8.8.8.8) — se usará cuando Town OS no esté disponible
  5. 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 habituales

Marca del routerDónde está la configuración de DNS
ASUSLAN → Servidor DHCP → Servidor DNS
TP-LinkDHCP → Configuración DHCP → DNS primario
NetgearInternet → Dirección del servidor de nombres de dominio (DNS)
LinksysConectividad → Red local → Servidor DHCP → DNS estático
UniFiConfiguración → Redes → (tu red) → DHCP Name Server
pfSense / OPNsenseServices → DHCP Server → DNS Servers
OpenWrtRed → 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 resolutor 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 envían las consultas directamente a un proveedor público como Cloudflare o NextDNS, así que Town OS nunca ve la consulta y los nombres de tus paquetes vuelven 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:

  • FirefoxAjustes → 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.)
  • ChromeConfiguración → Privacidad y seguridad → Seguridad, desactiva Usar DNS seguro.
  • EdgeConfiguració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 resolutor del sistema. Comprueba que no haya un perfil de DNS instalado en Ajustes del Sistema → General → VPN, DNS y gestión de dispositivos.

Lo mismo se 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 (mira Elegir un modo de resolución más abajo).

Comprueba que funcione

Cuando tu dispositivo tome la nueva configuración de DNS, comprueba que rolodex esté atendiendo tus consultas:

# Mira qué servidor DNS está usando tu máquina
nslookup example.com

# O consulta directamente 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 resolutor 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 entregue a un resolutor 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 envía las consultas que no coinciden a resolutores 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 el ordenador llega a internet. El DNS cifrado en la otra dirección — el que usan tus propios dispositivos para llegar al ordenador — 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 del propio ordenador, con el mismo nombre y las mismas direcciones que usa el resto del sistema. Si ya has instalado la CA raíz en el dispositivo (véase 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 resolutor, puede descargar la fijación, y así puede comprobar lo que se le entrega 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 ordenador 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 el ordenador simplemente está encendido — 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 gestiona 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 a 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 cachea por adelantado una lista de bloqueo. No se comprueba nada hasta que activas una categoría y añades 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 lanza 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 devuelve NXDOMAIN al dispositivo que preguntó.
  • NXDOMAIN significa limpio — la resolución sigue con normalidad. Un proveedor que da error o agota el tiempo se trata como no listado, así que una lista de bloqueo inalcanzable nunca deja tu red sin conexión.
  • Las listas de bloqueo ganan al mundo exterior, nunca a tus propios registros — la comprobación ocurre después de los registros locales y de paquetes (así que gitea.default.home siempre 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.net esté listado no bloquea stats.g.doubleclick.net, a menos que el proveedor liste también ese nombre. Tumbar un dominio entero por un solo host listado es una decisión tuya, no de la lista.
  • Los resultados se cachean un rato — un listado durante el TTL del proveedor, un resultado limpio durante cinco minutos.

Proveedores DNSBL

Estos son los que puedes añadir con un clic desde el panel. Todos siguen operando, son gratuitos y responden a un resolutor 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.

ProveedorZonaA qué apunta
Spamhaus DBLdbl.spamhaus.orgLa 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.
SURBLmulti.surbl.orgUna 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.
URIBLblack.uribl.comURIs 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 DBLdbl.nordspam.comDominios vistos en spam, con fuentes independientes de las listas anteriores — útil sobre todo como segunda opinión, no como lista principal.
Spam Eating Monkeyuribl.spameatingmonkey.netDominios 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. Comprobar 192.168.1.100 contra zen.spamhaus.org lanza 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 cachean 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 a la navegación. Actívalas si tienes un servicio de correo detrás de Town OS; si no, las listas de dominios son las que merecen tu atención.

Proveedores RBL

ProveedorZonaA qué apunta
Spamhaus ZENzen.spamhaus.orgCuatro 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 enviar correo directamente).
SpamCopbl.spamcop.netIPs denunciadas por la red de reportes de usuarios de SpamCop. Los registros caducan solos cuando dejan de llegar denuncias, así que reacciona rápido y olvida rápido.
PSBLpsbl.surriel.comLa Passive Spam Block List: IPs pilladas 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 añadirlas 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 NXDOMAIN en las consultas directas y surte efecto de inmediato. Se comprueba 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 comprobació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 funciona por sufijo — eximir vendor.example también exime cdn.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 cachea nada a tus espaldas. Si quieres que un dominio de anuncios o rastreo concreto desaparezca, añádelo 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 funcionando, 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).

Flujo del DNS
Dispositivo
Móvil, portátil, etc.
Consulta DNS
DHCP
Router
Reparte Town OS como DNS
DNS = IP de Town OS
reenvío
Town OS
Servidor DNS rolodex
Zonas autoritativas Reenvío al exterior

Confiar en la autoridad de certificación

Town OS emite certificados TLS para tus servicios internos a través de la autoridad de certificación 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 convenga 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 en el 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 fichero 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 en el portal de inscripción (https://<ip-de-town-os>:8500 por omisión) y pulsa 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 gestió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, añádelo al almacén de confianza:

PlataformaCómo
FirefoxAjustes → 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
macOSHaz doble clic en el PEM para añadirlo 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
WindowsDoble clic → Instalar certificado → Equipo local → “Entidades de certificación raíz de confianza”
AndroidAjustes → Seguridad → Cifrado y credenciales → Instalar un certificado → Certificado de CA
iOSAbre el PEM (por AirDrop o correo), instala el perfil y actívalo en Ajustes → 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 emitirlo.

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 gestiona en Panel → Redes (solo administradores).

La página de Redes mostrando la red integrada home con su TLD, subred, número de pares y un interruptor de acceso remoto, más un botón para crear una red

La red predeterminada

  • Siempre está y no se puede quitar. La red home se crea sola y es donde caen los paquetes a menos que elijas otra.
  • Solo local. No tiene transporte WireGuard — los nombres .home se resuelven en tu red local y a propósito nunca se exponen a los pares remotos.
  • Usa el TLD .home, que viene del ajuste dns_tld.

Crear una red para acceso remoto

Pulsa 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).
  • Ejecuta un resolutor DNS por red sobre la superposición, para que los dispositivos conectados puedan resolver los nombres de esa red.
El diálogo de Crear red con los campos Nombre y TLD, indicando que el TLD toma por omisión el nombre de la red

El interruptor de acceso remoto de cada fila levanta o baja la interfaz WireGuard. Apagarlo corta el acceso remoto pero deja los contenedores funcionando 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 pulsa Añadir par. Town OS te devuelve una configuración de WireGuard lista para importar — pégala en la app de WireGuard de tu móvil o tu portátil.

Copia la configuración de inmediato. Contiene una clave 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á levantado. Deja apagado el interruptor Ejecuta rolodex DNS para los dispositivos normales; enciéndelo solo para un par que a su vez ejecute un servidor DNS rolodex al que quieras reenviar.

Cuentas solo de WireGuard

Para dejar que alguien dé de alta sus propios dispositivos sin darle vía libre en el 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 añade 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 clave, 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.

El diálogo de instalar jitsi con un selector de Red arriba, etiquetado «la red en la que se sirve este paquete», sobre las preguntas de configuración del paquete

Por ejemplo, instalar Jitsi en una red con el TLD fart lo publica en jitsi.default.fart. Ya en marcha, el servicio aparece en tu Panel como un enlace en el que puedes pulsar con esa dirección, listo para abrirse desde cualquier dispositivo de la red.

La lista de Servicios instalados del panel mostrando jitsi con un enlace a https://jitsi.default.fart/
Acceso remoto por una red
Tu dispositivo
Móvil o portátil
WireGuard
túnel
Town OS
Superposición de red + DNS
subred oficina TLD .oficina
resolver
Tus servicios
Accesibles por nombre
gitea.default.oficina

Town OS en Android

El cliente de Android de Town OS conecta tu móvil 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 móvil como par por ti; no hay ningún fichero de configuración que copiar a mano.

Pantalla de inicio de sesión del cliente de Android de Town OS — una tarjeta para conectarse a un equipo con los campos de dirección, usuario administrador y contraseña
Iniciar sesión en un equipo
Pantalla de conexión del cliente de Android de Town OS — estado Desconectado con los botones Conectar y Olvidar esta red, sobre una tarjeta de ajustes del resolutor DNS
Gestionar la conexión y el DNS

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.apk de esa misma versión no se puede instalar tal cual — el proyecto no distribuye clave de firma, así que el de depuración es el que debes bajar.
  • Requiere Android 8.0 (Oreo) o superior.
  • ¿Prefieres compilarla tú? Clona el repositorio y ejecuta make deps && make debug && make install con el móvil conectado por USB y la depuración USB activada. make help lista todos los objetivos.

Hay dos formas de instalarla: directamente desde el móvil, o por USB desde un ordenador. La primera no necesita nada más que el móvil.

Instalar directamente desde el móvil

Sin ordenador, 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.

  1. Descarga el APK en el navegador del móvil. Abre la página de versiones y pulsa el fichero town-os-client-<versión>-debug.apk. El navegador avisa de que este tipo de fichero puede dañar tu dispositivo — ese aviso sale con cualquier APK; elige Descargar de todos modos.
  2. Ábrelo desde la notificación de descarga, desde la lista de Descargas del navegador, o desde la app Archivos.
  3. Autoriza el origen. 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 Ajustes — púlsalo, activa Permitir desde este origen para esa app (tu navegador o tu gestor de ficheros) y vuelve atrás. Ese mismo interruptor está en Ajustes → Aplicaciones → Acceso especial → Instalar apps desconocidas.
  4. Pulsa Instalar. Puede que Play Protect ofrezca analizar la app, o que avise de que viene de un desarrollador no reconocido — algo esperable en una app instalada fuera de la tienda. Elige Instalar de todos modos.
  5. Abre Town OS desde el cajón de aplicaciones cuando termine de instalarse.

Copiar antes el APK desde un ordenador — por transferencia de ficheros por USB, con adb push, o con cualquier app de sincronización — y abrirlo después en un gestor de ficheros 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 móvil funciona sin ello. Tanto adb install como make install se comunican con el móvil por depuración USB, que vive detrás del menú oculto Opciones de desarrollador de Android.

  1. Abre Ajustes → Información del teléfono. En los móviles Samsung es Ajustes → Información del teléfono → Información del software.
  2. Pulsa 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.
  3. Un mensaje confirma Ya eres desarrollador. Entonces Opciones de desarrollador aparece en Ajustes → Sistema — algunos móviles la colocan en el primer nivel de Ajustes, así que búscala ahí si no está donde esperas.
  4. Abre Opciones de desarrollador y activa la Depuración por USB.
  5. Conecta el móvil al ordenador. Android muestra el diálogo ¿Permitir la depuración por USB? con la huella digital de la clave del ordenador — marca Permitir siempre desde este ordenador y acéptalo. Ejecuta adb devices para confirmar que el móvil aparece como device y no como unauthorized.

Vuelve a desactivar la Depuración por USB cuando termines. Da a cada ordenador que hayas autorizado acceso completo al móvil por el puente de depuración, así que dejarla activada 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 / Debiansudo 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 móvil sin ser root; desconecta y vuelve a conectar el móvil después.
  • Arch / Manjarosudo pacman -S android-tools android-udev, y luego añádete al grupo adbusers con sudo usermod -aG adbusers $USER y cierra y vuelve a iniciar sesión.
  • macOSbrew install --cask android-platform-tools. No hay nada más que configurar; macOS se comunica con el móvil sin controladores.
  • Windowswinget install Google.PlatformTools en PowerShell, o descarga el ZIP de abajo. La mayoría de los móviles funcionan con el controlador que Windows instala por su cuenta; unos pocos fabricantes (Samsung, Xiaomi) exigen su propio controlador USB para que adb siquiera vea el dispositivo.
  • Cualquier otro sistema — descarga el ZIP de platform-tools de Google y descomprímelo donde quieras. No hay nada que instalar — ejecuta adb desde esa carpeta (.\adb.exe en Windows).

Comprueba que ha quedado 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 móvil y:

# Confirma que el móvil está conectado y autorizado
adb devices

# Instala el APK
adb install town-os-client-<versión>-debug.apk

Un par de cosas que suelen atascar a la gente:

  • no devices/emulators found — el cable es solo de carga, o no le has dicho al móvil que autorice este ordenador. Vuelve a conectar el cable y busca el aviso ¿Permitir la depuración por USB? en la pantalla del móvil.
  • no permissions en Linux — falta el paquete de reglas de udev de arriba, o el móvil ya estaba conectado antes de instalarlo. Instálalo, vuelve a conectar el móvil y ejecuta adb kill-server && adb devices.
  • INSTALL_FAILED_UPDATE_INCOMPATIBLE — ya hay instalada una copia firmada con otra clave, algo que pasa si antes compilaste una tú. Quita la app antigua (mantén pulsado su icono en el cajón de aplicaciones, o usa adb uninstall con el nombre de paquete que salga de adb shell pm list packages town) e instálala de nuevo.
  • Actualizar sin perder datosadb install -r town-os-client-<versión>-debug.apk sustituye 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 móvil — adb install transfiere e instala en un solo paso, así que nunca tienes que buscar luego el fichero en un gestor de ficheros.

Antes de conectarte

  • Crea una red primero. La app solo puede unirse a redes que tengan una superposición WireGuard — la red integrada home es solo local y no aparecerá. Mira 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

  1. Inicia sesión en tu equipo. Escribe su dirección — una IP a secas, IP:puerto o una URL completa (se asume el puerto 5309) — junto con tu usuario y contraseña de administrador.
  2. Ú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 móvil) y pulsa Unirse. El par de claves de WireGuard se genera en el móvil y solo se envía la mitad pública al equipo, así que tu clave privada nunca sale del dispositivo.
  3. Conéctate. Pulsa 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 gitea como gitea.default.<tld> se resuelven.
  4. 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á levantado. El culpable de siempre es el DNS privado estricto de Android. Si está fijado al nombre de host de un proveedor concreto, Android envía todas las consultas ahí e ignora el túnel, así que los nombres de Town OS vuelven como «no encontrado». Cambia Ajustes → Redes 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 resolutor 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 ha cerrado la sesión al reiniciar el equipo. Town OS borra todas las sesiones al reiniciarse; solo vuelve a iniciar sesión.

Crear 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 compilaste tú o directamente desde una memoria USB física que ya grabaste. make help lista todos los objetivos y variables.

QEMU

make qemu-fg

Compila la imagen si está desactualizada y luego levanta una máquina virtual de QEMU en primer plano, con la consola serie 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 directamente en tu terminal, y Ctrl-C detiene la máquina. Usa make qemu si prefieres que se ejecute en segundo plano (conéctate después con make serial), y make rebuild-qemu para detener, limpiar, recompilar y relanzar de una vez.

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 ejecutes a la vez.

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 móvil 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 compilada — 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 compila 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

VariablePor omisiónDescripción
IMAGE_SIZE12GTamaño disperso de la imagen USB durante la compilación — después la imagen se encoge
VM_DISK_SIZE50GTamaño de cada uno de los cuatro discos virtuales de datos (se lee de vm_disk_size en town-os.yaml)
VM_MEMORY4GMemoria de la máquina virtual
VM_CPUS4vCPUs de la máquina virtual — el valor por omisión de QEMU, 1, deja sin aire al pool de trabajo de rolodex
VM_BRIDGEvirbr0Interfaz puente del anfitrión para la red
VM_NAMEtown-osNombre de la máquina virtual, también sirve para encontrarla y detenerla
VM_IP192.168.122.50Reserva DHCP de libvirt — dale su propia dirección a cada máquina que ejecutes a la vez
VM_LAN1Retransmite los puertos del huésped tras NAT a la dirección de red local del anfitrión; 0 lo desactiva
USB_DEVDispositivo de bloques físico para make flash (escritura) y make qemu-usb (arranque en solo lectura)

Consola serie

# Conéctate a la consola serie 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
Red de la máquina virtual
Máquina anfitriona
virbr0 — red default de libvirt
QEMU
NAT
VM de Town OS
Town OS completo
192.168.122.50 eth0
retransmisión VM_LAN
Red local
Móviles y equipos de la red llegan a la VM
5309 · 80 · 443 · WireGuard

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 ficheros 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.

Arquitectura de almacenamiento
NVMe
SSD rápido
SATA / SAS
Disco duro o SSD
Tarjeta SD
Extraíble
detección
btrfs single
1 disco
btrfs RAID 1
2 discos (espejo)
btrfs RAID 5
3 o más discos (paridad)
Subvolúmenes
Almacenamiento por paquete
pkg-a pkg-b
Montajes superpuestos
Directorios de sistema persistentes
/var /etc

Usar la interfaz

Town OS trae un panel web limpio para gestionar 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.

Pantalla de creación de cuenta

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.

Vista general del panel

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 — rellena los nombres de host, los puertos y demás configuración, y luego pulsa instalar.

Explorador de paquetes
Preguntas de instalación de un paquete
Detalles de la instalación

Gestionar servicios

Los servicios instalados se pueden arrancar, detener y reiniciar desde la vista de Servicios. Los indicadores de estado muestran si cada servicio está funcionando, detenido o en error.

Gestión de servicios

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 concreto.

Visor de registros

Gestión del almacenamiento

Consulta y gestiona subvolúmenes btrfs, configura cuotas por paquete y vigila el uso de disco en todo tu almacenamiento.

Gestión del almacenamiento

Monitorización

Town OS incluye monitorización integrada 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.

Paneles de monitorización

Ajustes y registro de auditoría

La página de Ajustes te deja configurar las opciones de todo el sistema. El registro de auditoría anota 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.

Ajustes
Registro de auditoría

Alojar sitios estáticos

Más allá de los paquetes en contenedores, Town OS trae alojamiento de sitios estáticos integrado, siempre activo y gestionado 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 fichero — 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 en gh-pages.
  • Imagen de contenedor — extrae un directorio de una imagen OCI.

Las páginas de git y de contenedor se aprovisionan de forma asíncrona — la tabla muestra una insignia de Aprovisionando… que acaba en activa o en error. Usa Recompilar para traer el contenido más reciente en las páginas de git y de contenedor; en una página de fichero, 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 Gestió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 comprobaciones habituales de sesión mientras se ejecuta 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 sistemaArrancando el DNSIniciando los servicios del sistemaReiniciando 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 ficheros YAML que describen cómo ejecutar un servicio en contenedor. Para la especificación completa, mira 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 ejecuta 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. Durante la instalación, 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, añádelo desde la interfaz o desde repositories.json, e instala tu paquete. El entorno de desarrollo te da todo Town OS para hacer pruebas.

Añadir un repositorio

Añade tu repositorio de paquetes a Town OS desde la interfaz (Paquetes → Repositorios → Añadir 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"}
]
Ciclo de vida de un paquete
Definición YAML
imagen, volúmenes, preguntas
1.0.yaml
instalar
Preguntas de configuración
El usuario responde
nombre de host puerto
desplegar
Contenedor en marcha
Servicio activo con sus volúmenes
@variable@ → valor

Cosas que puedes autoalojar

Town OS está hecho para ejecutar cualquier cosa que se distribuya como imagen de contenedor. Aquí van algunas ideas para empezar — 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 — gestiona 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 — ficheros, 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 — gestor de contraseñas autoalojado

Productividad

  • Paperless-ngx — gestión documental y OCR
  • Immich — gestión autoalojada de fotos y vídeos
  • Planka / Wekan — tableros kanban y gestión de proyectos

Entorno de desarrollo y batería de pruebas

El entorno de desarrollo de Town OS ejecuta todo el sistema en local con contenedores de Podman. Es la manera más rápida de probar cambios, desarrollar paquetes y lanzar la batería 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 compilación del frontend y su servidor de desarrollo
  • btrfs-progs — para gestionar 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 compilació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 en el panel de Town OS.

Comandos del entorno de desarrollo

ComandoDescripción
make devArranca todo el entorno de desarrollo
make dev-stopDetiene todos los contenedores de desarrollo
make dev-logsSigue los registros de los contenedores de desarrollo
make dev-cleanElimina los contenedores y volúmenes de desarrollo

Lanzar las pruebas

ComandoDescripción
make testLanza las pruebas unitarias
make test-integrationLanza las pruebas de integración (requiere Podman con privilegios)
make test-ui-integrationLanza las pruebas de integración de la interfaz
make test-fullLanza todas las pruebas (unitarias + integración + interfaz)
make auto-testVigila los cambios y vuelve a lanzar las pruebas solo

Pruebas de integración

Las pruebas de integración se ejecutan dentro de un contenedor de Podman con privilegios que provee un sistema de ficheros 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 ejecución y se limpia al terminar.

Flujo de desarrollo
Editor
Escribe código
Go + Bun
guardar
auto-test
Las pruebas se lanzan al guardar
make auto-test
recargar
Navegador
Vista previa en vivo
localhost:5173
↻ iterar — Backend :5309 · Frontend :5173

Informar de fallos

¿Has encontrado algo roto? Un buen informe de fallo ayuda a arreglar las cosas más rápido. Así se reúne la información necesaria y se presenta un informe útil.

Reunir 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."

Abrir un issue

Los issues se abren 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
Flujo para informar de fallos
Detectar el problema
Algo se ha roto
⚠ error
curl a la API
Reunir registros
Traer entradas del journal
:5309/api/systemd/logs
resumir
Resumir
Agrupar por servicio
Claude Code
presentar
Abrir en Gitea
Crear el issue con detalles
✓ informado