PuTTY, SQLyog y SFTP
Parámetros de conexión, túnel SSH, carga de archivos y diagnóstico.
Documentación técnica centralizada
Accesos, arquitectura, permisos y publicación de proyectos en un solo lugar. Diseñado para consulta rápida durante despliegues y soporte.
Parámetros de conexión, túnel SSH, carga de archivos y diagnóstico.
Separación de aplicaciones, carpeta public y archivos sensibles.
Modelo 2750/0640 y áreas de escritura controlada 2770/0660.
Procedimiento probado con test.denkenlab.com.mx y reutilizable para Eventos.
Guía 01
PuTTY mantiene la sesión SSH y el túnel de MySQL; SQLyog utiliza ese túnel y SFTP viaja por el mismo puerto 22.
| Elemento | Valor |
|---|---|
| Servidor público | 159.54.154.87 |
| Dominio | denkenlab.com.mx |
| Sistema | Ubuntu 24.04 ARM64 |
| Web | Apache + PHP 8.5 mediante PHP-FPM |
| Base | MySQL 8.0.46 |
| Puertos públicos | 22, 80 y 443 |
| MySQL público | No disponible; solamente por túnel SSH |
| Campo | Valor |
|---|---|
| Host Name | 159.54.154.87 |
| Port | 22 |
| Connection type | SSH |
| Auto-login username | ubuntu o usuario individual |
| Private key | Llave .ppk asignada |
L3307 127.0.0.1:3306.| Campo SQLyog | Valor |
|---|---|
| MySQL Host Address | 127.0.0.1 |
| Port | 3307 |
| Username | Usuario MySQL individual |
| Password | Entregada por separado |
| SSH tab | No usar; PuTTY ya proporciona el túnel |
Se usa SFTP, no FTP tradicional. WinSCP o FileZilla deben configurarse explícitamente como SFTP.
| Campo | Valor |
|---|---|
| Protocolo | SFTP |
| Host | 159.54.154.87 o denkenlab.com.mx |
| Puerto | 22 |
| Usuario | ubuntu o usuario individual |
| Llave | .ppk asignada |
| Destino | /var/www/NOMBRE_PROYECTO, una vez preparado |
.env en repositorios, tickets o este portal.| Situación | Revisión |
|---|---|
| SQLyog no conecta | Comprobar PuTTY y el túnel L3307 → 127.0.0.1:3306. |
| Funcionaba y dejó de funcionar | Reabrir PuTTY; el túnel terminó al cerrar la sesión. |
| PuTTY se desconecta | Confirmar keepalive de 30 segundos. |
| SFTP no conecta | Confirmar SFTP, puerto 22, usuario y llave correcta. |
Guía 02
Cada proyecto vive aislado en su carpeta, se publica mediante su subdominio y Apache solamente entrega el contenido de public/.
| Modelo anterior | Modelo propuesto |
|---|---|
| denkenlab.com.mx/eventos | eventos.denkenlab.com.mx |
| denkenlab.com.mx/inventario | inventario.denkenlab.com.mx |
| Todo bajo /var/www/html | Cada proyecto bajo /var/www |
DNS identifica el servidor; Apache identifica el proyecto por ServerName; DocumentRoot limita la superficie web.
| Dentro de public/ | Fuera de public/ |
|---|---|
| index.php o index.html | app/, clases, includes y scripts internos |
| CSS, JavaScript, imágenes y fuentes | .env, credenciales y llaves |
| Descargas expresamente públicas | SQL, ZIP, exportaciones y temporales |
| Front controller del framework | Logs, caché y almacenamiento privado |
/var/www/eventos/ ├── public/ # Única carpeta servida por Apache │ ├── index.php │ └── assets/ ├── app/ # Código PHP no público ├── config/ │ └── .env # Secretos fuera de la web ├── storage/ # Logs, cache y cargas privadas └── vendor/ # Dependencias, si aplica
En un proyecto heredado no se moverán archivos a ciegas: primero se revisan entradas, includes, rutas relativas y directorios de cargas.
| Capa | Responsabilidad |
|---|---|
| DNS | El subdominio apunta al servidor. |
| Apache | VirtualHost y DocumentRoot de cada proyecto. |
| Proyecto | Código y datos bajo /var/www/NOMBRE. |
| MySQL | 127.0.0.1:3306; acceso remoto solamente por SSH. |
| Transferencia | SFTP por el puerto 22; sin FTP tradicional. |
Guía 03
Modelo reutilizable para Eventos: colaboración controlada, sin 777 y con escritura de PHP solamente donde se necesita.
| Identidad | Papel |
|---|---|
| epadilla | Responsable técnico y propietario operativo. |
| ubuntu | Administrador actual. |
| www-data | Apache/PHP-FPM: lee el proyecto y escribe solo donde se autorice. |
| web-eventos | Grupo compartido para colaboración controlada. |
| Modo | Uso |
|---|---|
| 2750 / 0640 | Dueño escribe; grupo lee; otros no acceden. El bit 2 mantiene el grupo en carpetas nuevas. |
| 2770 / 0660 | Dueño y grupo escriben; se reserva para áreas donde PHP crea o modifica archivos. |
| Nunca 777 | Evita que cualquier usuario local modifique el proyecto. |
En carpetas, x significa poder atravesar la ruta. Sin x, Apache no puede llegar a los archivos aunque tengan lectura.
/var/www/eventos/ ├── public/ │ ├── index.php │ ├── assets/ │ └── uploads-publicos/ # Solo si se publican por URL ├── app/ ├── config/ │ └── .env ├── storage/ │ ├── logs/ │ ├── cache/ │ ├── sessions/ │ └── uploads-privados/ └── vendor/
| Ruta | Dueño:grupo | Modo |
|---|---|---|
| /var/www/eventos | epadilla:web-eventos | 2750 |
| app/, config/, vendor/ | epadilla:web-eventos | 2750 dirs / 0640 files |
| config/.env | epadilla:web-eventos | 0640 |
| public/ y assets/ | epadilla:web-eventos | 2750 dirs / 0640 files |
| public/uploads-publicos/ | epadilla:web-eventos | 2770 dirs / 0660 files |
| storage/ | epadilla:web-eventos | 2770 dirs / 0660 files |
| VirtualHost | root:root | 0644 |
| Logs Apache | root:adm | 0640 |
Que una carpeta sea pública por web no significa que deba estar abierta en Unix. Apache lee porque www-data pertenece a web-eventos.
sudo groupadd -f web-eventos
sudo usermod -aG web-eventos epadilla
sudo usermod -aG web-eventos ubuntu
sudo usermod -aG web-eventos www-data
sudo install -d -o epadilla -g web-eventos -m 2750 /var/www/eventos
sudo install -d -o epadilla -g web-eventos -m 2750 /var/www/eventos/{public,app,config,vendor}
sudo install -d -o epadilla -g web-eventos -m 2770 /var/www/eventos/storage
sudo install -d -o epadilla -g web-eventos -m 2770 /var/www/eventos/storage/{logs,cache,sessions,uploads-privados}
sudo install -d -o epadilla -g web-eventos -m 2770 /var/www/eventos/public/uploads-publicosTras agregar usuarios al grupo, deben cerrar y abrir SSH/SFTP. Reiniciar PHP-FPM y Apache para que www-data tome el grupo.
Si el proyecto necesita escritura compartida, el pool PHP-FPM específico puede usar:
; Pool PHP-FPM específico de Eventos umask = 0002 sudo systemctl restart php8.5-fpm sudo systemctl reload apache2
Guía 04
Patrón probado con test.denkenlab.com.mx: DNS explícito, carpeta public, VirtualHost, validación local y comprobación externa.
| Elemento | Decisión |
|---|---|
| Dominio raíz | Landing o sitio principal. |
| Proyecto | /var/www/NOMBRE_PROYECTO |
| Dirección | NOMBRE.denkenlab.com.mx |
| Apache | VirtualHost, DocumentRoot y logs propios. |
| Web pública | /var/www/NOMBRE_PROYECTO/public |
| Campo | Valor para Test |
|---|---|
| Host | test |
| Tipo | CNAME |
| Destino | denkenlab.com.mx |
| TTL | 1 minuto |
Para Eventos se repite como eventos → CNAME → denkenlab.com.mx. El CNAME sigue al dominio raíz si la IP cambia.
/var/www/test/
└── public/
└── index.htmlsudo install -d -o ubuntu -g www-data -m 2755 /var/www/test/public sudo nano /var/www/test/public/index.html
<!doctype html> <html lang="es"> <head><meta charset="utf-8"><title>Test | denkenlab</title></head> <body> <h1>Subdominio test funcionando</h1> <p>Este contenido se sirve desde /var/www/test/public</p> </body> </html>
sudo nano /etc/apache2/sites-available/test.denkenlab.com.mx.conf
<VirtualHost *:80>
ServerName test.denkenlab.com.mx
DocumentRoot /var/www/test/public
<Directory /var/www/test/public>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test-error.log
CustomLog ${APACHE_LOG_DIR}/test-access.log combined
</VirtualHost>sudo a2ensite test.denkenlab.com.mx.conf sudo apache2ctl configtest sudo systemctl reload apache2
curl -i -H 'Host: test.denkenlab.com.mx' http://127.0.0.1/
Debe devolver HTTP/1.1 200 OK y el HTML esperado, incluso antes de la propagación DNS.
| Prueba | Revisión |
|---|---|
| nslookup test.denkenlab.com.mx | Debe resolver al CNAME o a la IP pública. |
| Página de otro sitio | Revisar ServerName, DocumentRoot y a2ensite. |
| 403 | Permisos de carpetas y Require all granted. |
| 500 | sudo tail -f /var/log/apache2/test-error.log |
Después de que DNS resuelva, emitir certificado Let’s Encrypt y forzar redirección de HTTP a HTTPS. El puerto 443 ya está abierto; no se requiere otro puerto.
Control de acceso
La contraseña no vive en este HTML. Apache autentica antes de entregar el archivo y las credenciales viajan únicamente mediante HTTPS.
Crear un usuario para Willy y otro para Epadilla. Cada contraseña se revoca de forma independiente y no se comparte.
sudo apt install -y apache2-utils sudo htpasswd -c /etc/apache2/htpasswd-denkenlab-docs willy sudo htpasswd /etc/apache2/htpasswd-denkenlab-docs epadilla sudo chown root:www-data /etc/apache2/htpasswd-denkenlab-docs sudo chmod 0640 /etc/apache2/htpasswd-denkenlab-docs
Estas directivas se añaden al bloque <Directory /var/www/test/public>:
AuthType Basic AuthName "Documentación interna denkenlab" AuthUserFile /etc/apache2/htpasswd-denkenlab-docs Require valid-user
La autenticación Basic es válida sobre TLS. Sin HTTPS, usuario y contraseña no quedan cifrados de forma segura.
sudo apt install -y certbot python3-certbot-apache sudo certbot --apache -d test.denkenlab.com.mx
Después se comprueba la renovación:
sudo certbot renew --dry-run
curl -I https://test.denkenlab.com.mx # Esperado sin credenciales: HTTP/2 401