# Publicar una web estática

> Webs hechas solo con HTML, CSS, JavaScript e imágenes. Se publican en segundos, sin construir nada, y no gastan memoria mientras nadie las visita.

Una web estática es una carpeta con ficheros que el navegador abre tal cual: una página de presentación, una carta, un portfolio o el resultado ya compilado de un generador de sitios. Dilohost la publica en segundos, con HTTPS, y no la tiene que construir.

## Cuándo se publica como estática

Dilohost lo decide solo, mirando la carpeta raíz del proyecto:

- tiene un `index.html`, **y**
- no tiene ningún fichero que indique que hay que construir o ejecutar algo: `package.json`, `composer.json`, `requirements.txt`, `pyproject.toml`, `Pipfile`, `go.mod`, `Gemfile`, `Cargo.toml`, `Dockerfile`, `mix.exs`, `pom.xml`, `build.gradle`, `deno.json`, `main.py`, `app.py` ni `index.php`.

Si hay alguno de esos ficheros, el proyecto se publica como [app con servidor](/docs/publicar/apps).

> [!TIP]
> ¿Tu web está hecha con Astro, Vite, Hugo u otro generador? Tienes dos opciones: publicar el proyecto entero como app (Dilohost lo construye) o compilarlo tú y publicar solo la carpeta de salida (`dist/`, `public/`…), que es una web estática y queda en línea al momento.

## Publicarla

<p class="prompt">Publica la carpeta «mi-web» en Dilohost, en el proyecto «portfolio».</p>

Según tu agente, la web llega de una forma u otra:

| Agente | Cómo llega |
|---|---|
| Claude Code, Codex, OpenCode, Gemini CLI | `git push` al repositorio de la app en Dilohost (`deploy.git_remote`). |
| claude.ai, ChatGPT | El agente escribe los ficheros directamente (`deploy.publish` con `files`) o te da un enlace para subir un zip (`upload`). |
| Cualquiera | Si la web está en un repositorio público, con su dirección (`deploy.publish` con `git_url`). |

Todas las vías están en [Formas de subir el código](/docs/publicar/subir-codigo).

Al terminar, el agente te da la dirección:

```text
https://web-portfolio-a1b2c3d.dilosite.es
```

## Cómo se sirve

- **HTTPS siempre**, también en tu dominio propio.
- **Rutas limpias:** `/contacto` sirve `contacto/index.html` si existe.
- **Compresión** automática (gzip y zstd).
- **Cabeceras de seguridad** básicas: `X-Content-Type-Options`, `Referrer-Policy` y `X-Frame-Options`.
- **Ficheros que nunca se sirven** aunque los subas: `.env*`, `.git*` y `.htpasswd`.
- **Enlaces simbólicos:** no se siguen; un enlace simbólico del repositorio queda como un fichero de texto.
- Una dirección que no existe responde con un error 404.

> [!NOTE]
> Las aplicaciones de una sola página (React, Vue…) que cambian de ruta en el navegador funcionan al navegar desde la portada, pero si alguien abre directamente `/producto/5` recibirá un 404, porque no hay un `index.html` en esa ruta. Si necesitas que todas las rutas carguen tu app, usa rutas con `#` o publícala como [app con servidor](/docs/publicar/apps).

## Hacer cambios

<p class="prompt">Cambia el teléfono de la página de contacto del portfolio y vuelve a publicar.</p>

Cada publicación es una versión nueva y la anterior queda en el historial. Para un cambio pequeño, el agente puede mandar solo los ficheros que cambian (`deploy.publish` con `files`); el resto se conserva. Si quiere que la web quede exactamente con lo que envía y borrar lo demás, usa `replace_all`.

## Lo que gasta

Una web estática no tiene ningún proceso propio en marcha: no gasta memoria ni procesador. En el consumo cuenta, sobre todo, lo que ocupa en disco. Por eso, si tu tope de gasto se alcanza, las webs estáticas siguen en línea.

En el plan Gratis puedes tener hasta 3 webs estáticas además de 1 app con servidor. Los límites de cada plan están en [Planes y precios](/docs/cuenta/planes).

## Relacionado

- [Formas de subir el código](/docs/publicar/subir-codigo)
- [Versiones y dirección](/docs/publicar/versiones)
- [Usar tu dominio](/docs/dominios/conectar)
- [Estadísticas de visitas](/docs/publicar/diagnostico#visitas)
