1
Produccion Hetzner acceso
Opix (agente) edited this page 2026-08-12 11:13:21 -04:00

Producción (Hetzner + Coolify) — acceso y ejecución

Verificado contra el servidor el 2026-08-12 en solo lectura. — Opix

Esta página sustituye a lo que dicen Infraestructura y Limitaciones-servidor-prod sobre producción: ambas describen el servidor anterior (cPanel/CDMON, 134.0.10.170, /web/wp-nuevo), retirado en el cutover a Hetzner del 2026-08-03.

SSH

ssh -i ~/.ssh/id_ed25519 rafa@188.40.120.157
# también por Tailscale:
ssh rafa@srv1.taild3aaf6.ts.net

⚠️ La clave es ~/.ssh/id_ed25519 (comentario claude-code@feadulta). La otra clave del directorio, ~/.ssh/feadulta_ed25519 (claude-code@wsl-feadulta-deploy, mayo 2026), da Permission denied: es de la etapa CDMON. Es un error fácil de cometer porque el nombre parece el correcto.

FEA_PROD_SSH_PASS en el perfil de Hermes está vacío a propósito: la autenticación es por clave. Los scripts sync_*_to_prod.py caen a ssh normal (sin sshpass) cuando esa variable está vacía. No es un valor que falte por rellenar.

El contenedor de WordPress

Contenedor wordpress-r2ssjifwj0r0ghyoqd528uaa
Imagen wordpress:latest — WordPress 7.0.3
PHP 8.3.31 (CLI) en /usr/local/bin/php
Docroot /var/www/html (volumen persistente r2ssjifwj0r0ghyoqd528uaa_wordpress-files)
BD contenedor mysql-r2ssjifwj0r0ghyoqd528uaa (MySQL 8)
Servicio Coolify feadulta-wp, uuid r2ssjifwj0r0ghyoqd528uaa

En el mismo host conviven tres WordPress (feadulta, summaraise, aqtalent), el relay de Buzz, el CRM Relaticle, Beszel y el mirror estático de Joomla. Comprueba siempre el nombre completo del contenedor antes de un docker exec.

⚠️ No hay WP-CLI en el contenedor

command -v wp → nada. La imagen oficial wordpress:latest no lo incluye; no es un fallo de configuración ni algo que se haya perdido.

La vía correcta es php -r cargando wp-load.php — es lo que describe FEA_PROD_WPLOAD del perfil de Hermes.

ssh -i ~/.ssh/id_ed25519 rafa@188.40.120.157 \
  "docker exec wordpress-r2ssjifwj0r0ghyoqd528uaa php -r \
   'require \"/var/www/html/wp-load.php\"; echo home_url(),\"|\",get_bloginfo(\"version\"),\"|\",wp_count_posts()->publish;'"

Salida real del 2026-08-12:

https://www.feadulta.com|7.0.3|29435

Scripts largos

scp -i ~/.ssh/id_ed25519 script.php rafa@188.40.120.157:/tmp/script.php
ssh -i ~/.ssh/id_ed25519 rafa@188.40.120.157 \
  'docker cp /tmp/script.php wordpress-r2ssjifwj0r0ghyoqd528uaa:/tmp/script.php && \
   docker exec wordpress-r2ssjifwj0r0ghyoqd528uaa php /tmp/script.php'

⚠️ Para copiar directorios, usa docker cp origen/. <c>:/destino/ con el /. final. Sin él, si el destino ya existe, Docker crea destino/origen anidado — y WordPress no carga mu-plugins desde subdirectorios, así que el despliegue queda silenciosamente inactivo. Ver Trampas-del-entorno.

Verificación: Cloudflare sigue delante

curl -sI https://www.feadulta.com devuelve 403 con cf-mitigated: challenge, incluso desde el propio servidor. No se puede certificar nada con curl, Playwright, headless ni wp_remote_get. La verificación de producción es server-side (docker exec … php -r) o navegación humana real.

Desde dentro del servidor, curl -H 'Host: www.feadulta.com' http://127.0.0.1/ sí llega al origen (302), saltándose Cloudflare.

Credenciales

No están en esta wiki y no deben estarlo. Viven en:

  • ~/.hermes/profiles/feadulta/.env (WSL) — host SSH, contenedor, wp-load.
  • ~/.env (WSL, permisos 600) — tokens de Gitea.
  • ~/.ssh/id_ed25519 — clave de acceso al servidor.

Local, para contraste

docker exec wordpress-web php -r 'require "/var/www/html/wp-load.php"; echo home_url();'
docker cp /tmp/x.php wordpress-web:/tmp/x.php && \
  docker exec wordpress-web wp eval-file /tmp/x.php --allow-root --path=/var/www/html

El local tiene wp-cli pero no cliente mysql: wp db query falla, hay que usar wp eval-file. QA visual siempre contra https://farmer.taild3aaf6.ts.net/fea/, que es el siteurl real — localhost:8081 sirve desde la raíz y las @font-face caen por CORS.