Resumen del producto
Un servidor entre la red y su aplicación.
Webship es un Rust de borde y servidor web estático autohospedado. Un runtime termina protocolos modernos, aplica políticas de borde, sirve archivos y realiza proxy de solicitudes de aplicaciones.
Transporte moderno
Acepta HTTP/1.1, HTTP/2 y HTTP/3, con TLS 1.3 y un endpoint opcional WebTransport.
Entrega estática y a través de proxy
Servir archivos estáticos con validadores y acompañantes precomprimidos, o enrutar el tráfico de la aplicación a través de grupos limitados de upstream.
Valores predeterminados seguros
Comienza con el WAF, controles DDoS, desafío de bots, cabeceras de seguridad de respuesta, API Shield y protección de archivos de puntos habilitada.
Operaciones observables
Utiliza estadísticas autenticadas, métricas de Prometheus, IDs de solicitud, recargas suaves y el plano de control opcional MCP.
Inicio rápido
Desde el binario de lanzamiento hasta un oyente saludable.
Inicia en loopback, valida todo antes de enlazar y verifica la respuesta de salud incorporada antes de agregar tráfico público.
Preparar archivos
Coloque el binario de la versión, su configuración TOML, la raíz estática y cualquier archivo de certificado y clave TLS configurados en el host.
Validar e inspeccionar
Ejecute ambos comandos de configuración. Corrija el primer error e inspeccione el resultado efectivo redactado antes del inicio.
Iniciar de forma privada
Inicie Webship con el archivo TOML seleccionado. Agregue un par completo de certificados o TLS automático cuando el sitio esté listo para tráfico público seguro.
Verifica el tiempo de ejecución
Llama a GET /health localmente. Luego prueba rutas estáticas, TLS, rutas de proxy, reglas de seguridad y monitoreo autenticado.
listen = "127.0.0.1:4433"
workers = 4
root = "./public"/usr/local/bin/webship --check-config --config /etc/webship/production.toml
/usr/local/bin/webship --print-effective-config --config /etc/webship/production.toml/usr/local/bin/webship --config /etc/webship/production.toml
curl --http3-only --insecure https://127.0.0.1:4433/healthGuía de inicio rápido para agentes de IA
Conecta un agente de IA a Webship en cinco líneas.
Conecta Claude Code, OpenAI, DeepSeek o cualquier cliente compatible con MCP a través de un túnel SSH privado. El agente recibe una superficie de operaciones autenticada sin compartir el listener público ni exponer credenciales de control al tráfico de Internet.
{
"mcpServers": {
"webship": { "url": "https://localhost:19443/mcp",
"headers": { "Authorization": "Bearer <token>" } }
} }Entrega estática
Servir un directorio con valores predeterminados conscientes del protocolo.
Establece una raíz de manera global o por sitio. Los sitios TLS por defecto usan HTTP/3 solamente; los sitios en texto claro usan por defecto HTTP/1.1 y H2C. Sobrescribe HTTP/1.1, HTTP/2 y HTTP/3 de manera independiente para cada sitio.
[[sites]]
domain = "app.example.com"
root = "/srv/app"
listen = "0.0.0.0:443"
[sites.protocols]
h1 = true
h2 = true
h3 = trueEl router incorporado soporta GET y HEAD, rangos de bytes, solicitudes condicionales, validadores y archivos auxiliares .br, .zst y .gz. Por defecto se rechazan las rutas de archivos con punto (dot-files); .well-known permanece disponible.
Tráfico de la aplicación
Enrutar solicitudes a uno o más upstreams.
Habilita el proxy inverso, coincide con un host y ruta, y luego define una política final incondicional. Webship admite grupos limitados, comprobaciones de salud, balanceo de carga, disyuntores, reintentos seguros sin cuerpo, WebSockets y almacenamiento en caché.
[reverse_proxy]
enabled = true
[[reverse_proxy.routes]]
domain = "app.example.com"
path_prefix = "/api"
strip_path_prefix = true
upstreams = ["127.0.0.1:8080", "127.0.0.1:8081"]
[[reverse_proxy.policies]]
name = "default"
hosts = []
path_prefixes = ["/"]
methods = []
max_body_bytes = 1048576
total_timeout_ms = 30000TLS y HTTP/3
Utilice certificados manuales o deje que Webship los gestione.
Webship 1.4.0 acepta TLS 1.3 y permite que cada sitio seleccione su modo de certificado de manera independiente. HTTP/3 utiliza el escucha UDP correspondiente; habilite HTTP/1.1 o HTTP/2 cuando el mismo sitio TLS también necesite compatibilidad con TCP.
listen = "0.0.0.0:443"
[automatic_tls]
enabled = true
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
cache_dir = "/var/lib/webship/acme"
contacts = ["mailto:ops@example.com"]
accept_terms_of_service = true
[[sites]]
domain = "app.example.com"
root = "/srv/app"
certificate_mode = "per_site" # default public ACME certificate
[[sites]]
domain = "legacy.example.com"
root = "/srv/legacy"
certificate_mode = "shared" # legacy public multi-SAN certificateWebship 1.4.0 arquitectura de certificados
Elija la confianza y la escala del certificado de manera independiente para cada sitio.
Webship 1.4.0 mueve certificate_mode a cada entrada [[sites]]. ACME público por sitio, fragmentos de flota DNS-01 pública, la CA privada integrada, el certificado compartido heredado y los archivos de certificado manuales pueden coexistir en un solo proceso autónomo.
por_sitio — certificado público
El valor predeterminado. Solicite un certificado ACME público de navegador confiable para el nombre exacto del sitio con TLS-ALPN-01.
flota — fragmentos DNS-01 públicos
Use la emisión pública DNS-01 para muchos nombres de tercer y cuarto nivel bajo dominios registrados explícitamente. Los nombres permanecen en fragmentos de certificado estables y agrupados.
embebido — CA privada
Emita un certificado separado en el proceso desde la CA privada de Webship. No se requiere cuenta pública ACME, desafío DNS, integración con el registrador ni puerto 443 entrante.
compartido — multi-SAN heredado
Mantenga el grupo público multi-SAN heredado para implementaciones que lo requieran. Este no es el valor predeterminado y sigue estando sujeto a los límites de identificador de CA pública.
[automatic_tls]
enabled = true
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
cache_dir = "/var/lib/webship/acme"
contacts = ["mailto:ops@example.com"]
accept_terms_of_service = true
[automatic_tls.fleet]
shard_size = 64
batch_window_ms = 300000
weekly_certificate_limit = 50
emergency_certificate_reserve = 5
registered_domains = ["example.com"]
[automatic_tls.fleet.dns]
listen = "0.0.0.0:53"
nameservers = ["ns1.example.net"]
addresses = ["192.0.2.10"]
propagation_timeout_ms = 120000
resolver_url = "https://dns.google/resolve"
challenge_ttl_seconds = 900
[[sites]]
domain = "app.example.com"
root = "/srv/app"
certificate_mode = "fleet"
[[sites]]
domain = "media.app.example.com"
root = "/srv/media"
certificate_mode = "fleet"[automatic_tls]
enabled = true
cache_dir = "/var/lib/webship/acme"
[acme_ca]
state_dir = "/var/lib/webship/acme-ca"
leaf_validity_days = 90
[[sites]]
domain = "internal.example.com"
root = "/srv/internal"
certificate_mode = "embedded"Política de borde
Mantén la línea base de seguridad intacta.
Webship activa sus principales capas de protección por defecto. Ajuste los límites para su carga de trabajo y valide después de cada cambio de regla o política de encabezado.
[ddos]
enabled = true
mode = "normal"
requests_per_minute = 600
burst = 100
block_seconds = 300
[security.response_headers]
enabled = true
nosniff = true
frame_deny = true
referrer_no_referrer = true
hsts = "max-age=31536000; includeSubDomains"
content_security_policy = "default-src 'self'; frame-ancestors 'none'"Usa el modo normal para el tráfico regular, bajo_ataque para un manejo más estricto de ataques activos, y bloqueo cuando solo deberían permanecer disponibles las sondas y las rutas explícitamente permitidas.
Diagnósticos privados
Inspeccione el borde sin exponer el plano de control.
Las estadísticas y métricas de Prometheus se ejecutan en un receptor autenticado separado. La instrumentación debe estar habilitada siempre que cualquiera de los endpoints esté activo.
[observability]
instrumentation = true
stats = true
metrics = true
listen = "127.0.0.1:9090"
token = "replace-with-at-least-32-random-printable-ascii-characters"Operaciones seguras
Recargue deliberadamente. Mantenga cerca la reversión.
Recarga de configuración
Envíe SIGHUP después de editar una configuración respaldada por archivo. Webship valida el reemplazo antes de instalarlo y mantiene la configuración en ejecución cuando la validación falla.
Actualización y reversión
Instale el nuevo binario junto a la versión anterior, valide la configuración de producción con él, luego verifique la salud, TLS, proxy y métricas. Mantenga el binario anterior hasta que todas las pruebas se aprueben.
kill -HUP "$(pidof webship)"
/usr/local/bin/webship update --config /etc/webship/production.toml
sudo systemctl daemon-reload
sudo systemctl enable --now webship
sudo systemctl status webshipOptimización guiada por perfil
Recoge perfiles nativos del objetivo sin confundir entrenamiento y producción.
Cada objetivo Webship 1.4.0 tiene un CLI instrumentado separado para recopilar datos de perfil LLVM nativo del objetivo bajo su tráfico representativo. Use la versión exacta y el triple de objetivo, ejercite las rutas y protocolos que importan, y detenga el proceso de manera ordenada para que pueda volcar cada archivo .profraw.
Selecciona el objetivo exacto
Descargar la CLI de entrenamiento PGO cuya versión de lanzamiento y triple de destino Rust coincidan exactamente con el tiempo de ejecución que deseas optimizar. Verificar primero su SHA-256 publicado.
Capturar tráfico representativo
Establezca LLVM_PROFILE_FILE a un directorio escribible, inicie la CLI de entrenamiento con una copia validada de la configuración real, reproduzca tráfico representativo directo y de proxy inverso, luego detenga Webship de manera controlada.
Combinar perfiles en bruto
Usar llvm-profdata del compilador generado grabado para la versión de lanzamiento. Combinar cada archivo .profraw emitido en un solo archivo sparse webship.profdata.
Reconstruir y controlar
Aplicar el perfil combinado únicamente al código fuente, compilador, proveedor de criptografía, conjunto de funciones y objetivo exactos que lo generaron. Ejecutar controles de corrección y rendimiento antes de la promoción.
mkdir -p ./profiles
export LLVM_PROFILE_FILE="$PWD/profiles/webship-%p-%m.profraw"
./webship-pgo-training-1.4.0-<target> --config ./webship.tomlNew-Item -ItemType Directory -Force ./profiles
$env:LLVM_PROFILE_FILE = "$PWD/profiles/webship-%p-%m.profraw"
.\webship-pgo-training-1.4.0-<target>.exe --config .\webship.tomlllvm-profdata merge -sparse ./profiles/*.profraw -o ./webship.profdataReferencia de línea de comandos
Superficie pequeña, inicio explícito.
webship [OPTIONS] | webship update [OPTIONS]
-c, --config PATH- Seleccione el archivo TOML. Si no existe, Webship lo crea con una identidad TLS privada de localhost.
--check-config- Valida la configuración completa y finaliza sin iniciar los listeners.
--print-effective-config- Imprima la configuración efectiva combinada con los secretos eliminados.
actualizar- Verifique el manifiesto de la comunidad firmado, seleccione este objetivo de plataforma exacto e instale una versión más reciente cuando exista.
--help / --version- Imprima la ayuda del comando o la versión instalada de Webship.
Modos de falla comunes
Comience con la configuración, luego expándase hacia afuera.
- Ejecute --check-config y corrija el primer error informado; los campos TOML desconocidos son rechazados.
- Confirme que los puertos TCP y UDP configurados estén disponibles y permitidos por el firewall.
- Confirme que el certificado y la clave existen, son legibles por la cuenta de servicio y forman un par coincidente.
- Para TLS automático, confirme que cada dominio configurado se resuelve al host Webship.
- Llame a /health en el oyente de la aplicación local antes de probar a través de DNS o una ruta de carga externa.
- Habilitar la observabilidad autenticada temporalmente cuando se requiera evidencia en tiempo de ejecución.