Herramientas Informaticas

Etiqueta: MySQL Página 1 de 7

Cómo usar Composer con symlinks para desarrollo local en CodeIgniter 4

Entrada fija

Cuando trabajas con múltiples paquetes en PHP (como módulos propios), llega un punto donde necesitas debuggear directamente el código del paquete y no una copia dentro de vendor.

Si alguna vez terminaste debuggeando en vendor/ en lugar de tu proyecto real… esto es para ti.


🔥 El problema

Por defecto, Composer:

  • Descarga paquetes desde GitHub
  • Los copia en vendor/
  • Xdebug trabaja sobre esa copia

Resultado:

  • Código duplicado
  • Cambios no se reflejan
  • Debug incómodo

🧠 La solución: usar type: path

{
  "repositories": [
    {
      "type": "path",
      "url": "../boilerplateproducts",
      "options": {
        "symlink": true
      }
    }
  ]
}

⚙️ ¿Qué hace esto?

  • Usa tu carpeta local
  • No descarga desde GitHub
  • Crea un symlink en vendor

🔍 Verificar que funciona

composer update

Debes ver:

Installing julio101290/boilerplateproducts: Symlinking from ../boilerplateproducts

Y luego:

ls -l vendor/julio101290/boilerplateproducts

Resultado esperado:

boilerplateproducts -> ../../../boilerplateproducts

🚀 Beneficios

  • Debug directo en tu código
  • Cambios en tiempo real
  • Sin duplicación
  • Flujo más rápido

⚠️ Error común

No mezcles path y vcs:

{
  "type": "path",
  "url": "../boilerplateproducts"
},
{
  "type": "vcs",
  "url": "https://github.com/usuario/boilerplateproducts"
}

Composer puede ignorar el local y usar GitHub.


✅ Desarrollo correcto

rm -rf vendor composer.lock
composer update

🟢 Desarrollo vs Producción

Desarrollo

  • path
  • symlink
  • debug directo

Producción

  • vcs
  • descarga desde GitHub
  • entorno limpio

⚡ Scripts útiles

dev.sh

#!/bin/bash
rm -rf vendor composer.lock
COMPOSER=composer.local.json composer update

prod.sh

#!/bin/bash
rm -rf vendor composer.lock
composer update

🧠 Tip PRO

{
  "repositories": [
    {
      "type": "path",
      "url": "../boilerplateproducts",
      "options": { "symlink": true }
    }
  ],
  "config": {
    "preferred-install": "source"
  }
}

Ejecutar:

COMPOSER=composer.local.json composer update

💡 IDE

Puedes integrar esto con NetBeans usando scripts o herramientas externas.


✅ Conclusión

  • No debuggees código en vendor
  • Usa symlink
  • Automatiza tu flujo

Resultado: desarrollo más rápido y limpio 🚀

🚀 Solución definitiva al error “ONLYOFFICE Document Server is unavailable” en Nextcloud (Snap + Docker)

Entrada fija

¿Tu integración de ONLYOFFICE en Nextcloud se desconecta sola y tienes que estar guardando la configuración a cada rato? 😤
Tranquilo, no eres el único. Después de muchas pruebas, encontré un script automático que simula hacer clic en “Guardar” y mantiene la conexión viva. Y lo mejor: se ejecuta solo a la medianoche para no molestar a los usuarios. 🌙

🔍 ¿Qué causa el error?

Si usas Nextcloud instalado como Snap y el ONLYOFFICE Document Server en Docker (con dominio DDNS y puerto personalizado), el problema suele ser que el servidor de documentos no puede descargar los archivos desde la URL pública. Al guardar manualmente la configuración, todo vuelve a funcionar… hasta que falla otra vez.

✅ La solución: un script + cron nocturno

Este script hace exactamente lo mismo que tú harías en la interfaz web: establece la URL del Document Server, la URL interna (StorageUrl), desactiva la verificación SSL y verifica la conexión. Lo programamos con cron para que se ejecute cada noche a las 12:00 AM, cuando nadie está usando el sistema.

📝 Paso 1: Crear el script

Abre una terminal en tu servidor Ubuntu y crea el archivo:

sudo nano /usr/local/bin/onlyoffice_refresh.sh

Copia y pega este contenido (ajusta las URLs a las tuyas):

#!/bin/bash

# Script para guardar la configuración de ONLYOFFICE exactamente como en la interfaz web
# Esto simula hacer clic en "Save"

NEXTCLOUD_OCC="/snap/bin/nextcloud.occ"

# Valores según tu configuración (¡cámbialos si es necesario!)
DOCUMENT_SERVER_URL="https://tudominio.dyndns.org:4445/"
STORAGE_URL="https://tudominio.dyndns.org:444/"   # O usa la IP interna si funciona mejor
VERIFY_PEER_OFF="true"

# Establecer DocumentServerUrl
$NEXTCLOUD_OCC config:app:set onlyoffice DocumentServerUrl --value="$DOCUMENT_SERVER_URL"

# Establecer StorageUrl (dirección para peticiones internas desde ONLYOFFICE Docs)
$NEXTCLOUD_OCC config:app:set onlyoffice StorageUrl --value="$STORAGE_URL"

# Desactivar verificación de certificados
$NEXTCLOUD_OCC config:app:set onlyoffice verify_peer_off --value="$VERIFY_PEER_OFF"

# Limpiar InternalServerUrl (lo dejamos vacío)
$NEXTCLOUD_OCC config:app:delete onlyoffice InternalServerUrl >/dev/null 2>&1

# Verificar conexión
echo "Configuración aplicada. Verificando conexión..."
$NEXTCLOUD_OCC onlyoffice:documentserver --check

echo "Listo. Configuración guardada."

⚠️ Importante: Reemplaza tudominio.dyndns.org y los puertos por los tuyos. Si tu Nextcloud usa HTTP, cambia https por http. Si no usas puerto 444, ajústalo.

🔧 Paso 2: Dar permisos de ejecución

sudo chmod +x /usr/local/bin/onlyoffice_refresh.sh

🧪 Paso 3: Probar manualmente

sudo /usr/local/bin/onlyoffice_refresh.sh

Deberías ver un mensaje como Document Server is reachable. Si falla, revisa las URLs.

⏲️ Paso 4: Programar la tarea nocturna (cron)

sudo crontab -e

Agrega esta línea para que se ejecute todos los días a las 12:00 AM:

0 0 * * * /usr/local/bin/onlyoffice_refresh.sh >> /var/log/onlyoffice_refresh.log 2>&1

Con esto, cada medianoche el script se ejecutará y dejará la conexión lista para el día siguiente. Además, guarda un log en /var/log/onlyoffice_refresh.log por si quieres revisar que todo vaya bien.

🎯 ¿Por qué funciona?

El script fuerza la reescritura de los parámetros clave (DocumentServerUrl, StorageUrl, verify_peer_off) exactamente como lo harías desde el panel de administración de Nextcloud. Al ejecutarse una vez al día, evita que la conexión se caiga durante la jornada laboral. Es una solución sencilla, automática y sin impacto en el rendimiento.

🧠 Consejos adicionales

  • Si la conexión se sigue cayendo varias veces al día, puedes aumentar la frecuencia del cron a cada hora (0 * * * *) o cada 30 minutos (*/30 * * * *). El script es muy liviano.
  • Para una solución definitiva (sin cron), configura correctamente la variable StorageUrl apuntando a la IP interna de tu servidor (ej. http://192.168.0.1). Pero este script es un gran parche mientras encuentras la IP perfecta.
  • Mantén actualizados Nextcloud Snap, el conector ONLYOFFICE y el contenedor Docker del Document Server.

📢 ¿Te funcionó?
Si este tutorial te ayudó, comparte y comenta. Entre todos podemos hacer que Nextcloud + ONLYOFFICE funcione de maravilla. 💪


Etiquetas SEO sugeridas: Nextcloud ONLYOFFICE error, Document Server unavailable, Snap Nextcloud, Docker ONLYOFFICE, cron job, solución Nextcloud

Meta descripción: ¿El ONLYOFFICE de Nextcloud se desconecta solo? Aprende a crear un script automático que guarda la configuración cada noche y olvídate del error. Paso a paso para Snap y Docker.

🔥 Cómo configurar ONLYOFFICE en Docker con SSL y Nextcloud Snap (guía práctica sin errores) 🔥

Entrada fija

Después de varios intentos y errores típicos (puertos, certificados, Docker, etc.), finalmente logré dejar funcionando ONLYOFFICE Document Server en Docker con acceso HTTPS y listo para integrarse con Nextcloud instalado vía Snap. Aquí te dejo el proceso completo con datos genéricos 👇


🚧 Problemas comunes

  • Error de conexión (connection refused o connection reset)
  • Certificados SSL no detectados
  • Confusión entre Apache, Nginx y Docker
  • Intentar usar HTTPS dentro del contenedor (mala idea 😅)

🧠 Lo importante que debes entender

  • ONLYOFFICE usa Nginx interno, no Apache
  • Docker debe correr en HTTP interno
  • El SSL se maneja mejor fuera del contenedor
  • Nextcloud Snap ya trae su propio Apache (aislado)

👉 La solución correcta: usar Apache HTTP Server del sistema como proxy inverso


⚙️ Configuración final

🐳 1. Ejecutar ONLYOFFICE en HTTP

docker run -d -p 8080:80 onlyoffice/documentserver

🔐 2. Generar certificado SSL con Certbot

sudo snap stop nextcloud
sudo certbot certonly --standalone -d tudominio.com
sudo snap start nextcloud

👉 Los certificados quedarán en algo como:

/etc/letsencrypt/live/tudominio.com-0001/

🌐 3. Configurar Apache como proxy SSL

Archivo:

/etc/apache2/sites-available/onlyoffice.conf

Contenido:

<VirtualHost *:4443>
    ServerName tudominio.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/tudominio.com-0001/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/tudominio.com-0001/privkey.pem

    ProxyPreserveHost On
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>

🔌 4. Habilitar el puerto en Apache

Editar:

/etc/apache2/ports.conf

Agregar:

Listen 4443

⚡ 5. Activar módulos necesarios

sudo a2enmod ssl proxy proxy_http headers

🚀 6. Activar sitio y reiniciar

sudo a2ensite onlyoffice.conf
sudo apachectl configtest
sudo systemctl restart apache2

🔥 7. Abrir firewall

sudo ufw allow 4443

✅ Resultado

Acceso funcionando en:

👉 https://tudominio.com:4443

✔ SSL válido
✔ Proxy funcionando
✔ Docker respondiendo correctamente
✔ Listo para integrarse con Nextcloud


🧪 Pruebas clave

curl http://localhost:8080/healthcheck   # → true
curl -k https://localhost:4443           # → 302 (correcto)

🧠 Conclusión

  • ❌ No uses SSL dentro de Docker
  • ✅ Usa proxy inverso en el host
  • ✅ Mantén servicios separados
  • ✅ Evita conflictos con Snap

🚀 Siguiente paso

Integrar ONLYOFFICE con Nextcloud usando JWT correctamente 🔐


Si estás montando tu propio entorno, esta arquitectura te va a ahorrar horas de debugging 💻🔥

Apóyame

Si esta guía te fue útil y quieres apoyar más contenido como este:

👉 https://www.patreon.com/u74078772?

Cómo instalar OnlyOffice en Nextcloud (instalado con Snap) – Guía completa

Entrada fija

Si ya tienes Nextcloud instalado con Snap, el siguiente paso lógico es convertirlo en una suite completa tipo Google Workspace. Para eso, puedes integrar OnlyOffice, una poderosa herramienta que permite editar documentos Word, Excel y PowerPoint directamente desde tu nube.


¿Qué es OnlyOffice?

OnlyOffice es una suite ofimática online que se integra perfectamente con Nextcloud, permitiendo editar documentos en tiempo real, colaborar con otros usuarios y mantener compatibilidad con formatos de Microsoft Office.

  • 📝 Editor de documentos (Word)
  • 📊 Hojas de cálculo (Excel)
  • 📽️ Presentaciones (PowerPoint)
  • 👥 Edición colaborativa en tiempo real

Requisitos

  • Nextcloud instalado vía Snap
  • Servidor Ubuntu (recomendado 2GB RAM mínimo)
  • Acceso SSH con sudo

Instalar OnlyOffice Document Server con Docker

1. Instalar Docker


sudo apt update
sudo apt install docker.io -y
sudo systemctl enable --now docker
  

2. Ejecutar OnlyOffice


sudo docker run -i -t -d -p 8080:80 \
--restart=always \
onlyoffice/documentserver
  

Esto levantará OnlyOffice en:

http://TU_IP:8080

Instalar la aplicación en Nextcloud

  1. Entra a tu panel de Nextcloud
  2. Ve a Apps (Aplicaciones)
  3. Busca: ONLYOFFICE
  4. Instala ONLYOFFICE Docs

Configurar conexión con OnlyOffice

Ve a:

Configuración → Administración → ONLYOFFICE

En “Document Editing Service”, coloca:

http://TU_IP:8080

Configurar seguridad con JWT (recomendado)

Para mayor seguridad, puedes activar autenticación JWT.


sudo docker stop $(sudo docker ps -q)

sudo docker run -i -t -d -p 8080:80 \
-e JWT_ENABLED=true \
-e JWT_SECRET=mi_clave_super_segura \
--restart=always \
onlyoffice/documentserver
  

Luego en Nextcloud:

  • Activa JWT
  • Introduce la misma clave

Solución de problemas (Nextcloud Snap)

Si Nextcloud no se conecta correctamente:


sudo snap set nextcloud ports.http=80
sudo snap set nextcloud ports.https=443
sudo ufw allow 8080
  

Recomendaciones

  • 🔒 Usa HTTPS (Let’s Encrypt)
  • ⚡ Usa mínimo 2GB de RAM
  • 🌐 Configura dominio si lo usarás fuera de red local
  • 📦 Usa Docker para mayor estabilidad

Conclusión

Integrar OnlyOffice con Nextcloud transforma tu servidor en una plataforma completa de productividad, similar a Google Drive o Microsoft 365, pero con control total sobre tus datos.


Apóyame

Si esta guía te fue útil y quieres apoyar más contenido como este:

👉 https://www.patreon.com/u74078772?

Cómo instalar Nextcloud en Ubuntu Server 24.04 (Guía completa + Script automático)

Entrada fija

Si quieres tener tu propia nube privada tipo Google Drive o Dropbox, Nextcloud es una de las mejores opciones. En esta guía te mostraré cómo instalarlo en Ubuntu Server 24.04 de forma sencilla, incluyendo un script automático que hace casi todo por ti.


¿Qué es Nextcloud?

Nextcloud es una plataforma de almacenamiento en la nube de código abierto que te permite guardar archivos, sincronizarlos entre dispositivos, compartirlos y mucho más, todo en tu propio servidor.

  • 📁 Almacenamiento privado
  • 🔄 Sincronización de archivos
  • 🔐 Control total de tus datos
  • 👥 Compartir archivos fácilmente

Requisitos

  • Servidor con Ubuntu Server 24.04
  • Acceso SSH con permisos sudo
  • Conexión a internet

Instalación automática (Script)

Para facilitar todo el proceso, puedes usar el siguiente script que instala Apache, PHP, MariaDB y Nextcloud automáticamente.

#!/bin/bash
# ==========================================
# Instalador automático de Nextcloud
# Ubuntu Server 24.04 (con soporte para PPA sury.org)
# Versión: 4.0 - Definitiva (resuelve conflictos de PHP)
# Adaptado por julio101290
# ==========================================

set -e

# -------------------- CONFIGURACIÓN --------------------
DEFAULT_PORT="${NEXTCLOUD_PORT:-80}"
NC_DIR="${NEXTCLOUD_DIR:-/var/www/nextcloud}"
DB_NAME="${NEXTCLOUD_DB_NAME:-nextcloud}"
DB_USER="${NEXTCLOUD_DB_USER:-ncuser}"

# Generar contraseña segura si no se proporciona
if [ -z "$NEXTCLOUD_DB_PASS" ]; then
    DB_PASS=$(openssl rand -base64 24 | tr -d "=+/" | cut -c1-24)
else
    DB_PASS="$NEXTCLOUD_DB_PASS"
fi

NONINTERACTIVE="${NONINTERACTIVE:-false}"

# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# -------------------- FUNCIONES AUXILIARES --------------------
error_exit() {
    echo -e "${RED}ERROR: $1${NC}" >&2
    exit 1
}

info() {
    echo -e "${GREEN}➡️ $1${NC}"
}

warn() {
    echo -e "${YELLOW}⚠️ $1${NC}"
}

confirm() {
    if [ "$NONINTERACTIVE" = "true" ]; then
        return 0
    fi
    read -p "$1 [S/n]: " -n 1 -r
    echo
    [[ $REPLY =~ ^[Ss]$ ]] || [[ -z $REPLY ]]
}

command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# -------------------- VERIFICACIONES INICIALES --------------------
if [ "$EUID" -ne 0 ]; then
    error_exit "Ejecuta con sudo o como root."
fi

# -------------------- ACTUALIZACIÓN Y REPARACIÓN --------------------
info "Actualizando lista de paquetes..."
apt update -qq

info "Reparando paquetes rotos si los hay..."
apt --fix-broken install -y

# -------------------- APACHE Y PUERTO --------------------
info "Configurando Apache..."
if command_exists apache2; then
    warn "Apache ya está instalado."
    # Detectar puerto activo
    if systemctl is-active --quiet apache2; then
        CURRENT_PORT=$(ss -tlnp 2>/dev/null | grep apache2 | grep -oP ':\K\d+' | head -1)
    fi
    [ -z "$CURRENT_PORT" ] && CURRENT_PORT=$(grep -i "^Listen" /etc/apache2/ports.conf 2>/dev/null | head -1 | awk '{print $2}')
    [ -z "$CURRENT_PORT" ] && CURRENT_PORT=80
    
    if [ "$CURRENT_PORT" != "$DEFAULT_PORT" ] && [ "$DEFAULT_PORT" != "80" ]; then
        warn "Apache ya escucha en el puerto $CURRENT_PORT. Se usará ese."
        PORT=$CURRENT_PORT
    else
        PORT=$DEFAULT_PORT
    fi
else
    info "Instalando Apache..."
    apt install -y apache2
    PORT=$DEFAULT_PORT
fi

# Configurar puerto si es necesario
if [ "$PORT" != "80" ]; then
    info "Ajustando Apache al puerto $PORT..."
    sed -i "s/^Listen 80/Listen $PORT/g" /etc/apache2/ports.conf
    grep -q "^Listen $PORT" /etc/apache2/ports.conf || echo "Listen $PORT" >> /etc/apache2/ports.conf
    systemctl restart apache2
fi

# -------------------- PHP Y EXTENSIONES (RESOLUCIÓN DEFINITIVA) --------------------
info "Verificando PHP..."

PHP_INSTALLED=false
USE_SURY=false

if command_exists php; then
    PHP_INSTALLED=true
    PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;' 2>/dev/null)
    warn "PHP $PHP_VER detectado."
    
    # Determinar origen de PHP
    if apt-cache policy php | grep -q "sury.org"; then
        USE_SURY=true
        warn "PHP instalado desde el repositorio 'deb.sury.org'."
    fi
else
    info "PHP no está instalado. Se instalará desde los repositorios oficiales de Ubuntu."
fi

# Si PHP está presente pero no todas las extensiones, las instalamos según el origen
if [ "$PHP_INSTALLED" = true ]; then
    # Extensiones necesarias
    NEEDED_EXTS="bcmath gmp imagick mysql zip gd mbstring curl xml intl"
    MISSING_EXTS=""
    
    # Verificar qué extensiones faltan
    for ext in $NEEDED_EXTS; do
        case $ext in
            mysql)
                if ! php -m | grep -qiE "mysqli|pdo_mysql"; then
                    MISSING_EXTS="$MISSING_EXTS mysql"
                fi
                ;;
            *)
                if ! php -m | grep -qi "$ext"; then
                    MISSING_EXTS="$MISSING_EXTS $ext"
                fi
                ;;
        esac
    done
    
    if [ -n "$MISSING_EXTS" ]; then
        info "Faltan extensiones: $MISSING_EXTS"
        
        # Solución específica para el conflicto de php-imagick
        if echo "$MISSING_EXTS" | grep -q "imagick"; then
            warn "Se detectó conflicto con php-imagick. Eliminando versión incorrecta..."
            apt remove -y php-imagick 2>/dev/null || true
        fi
        
        # Instalar según el origen
        if [ "$USE_SURY" = true ]; then
            info "Instalando extensiones desde el PPA sury.org..."
            # Construir lista de paquetes específicos para sury
            SURY_PKGS=""
            for ext in $MISSING_EXTS; do
                case $ext in
                    mysql)    SURY_PKGS="$SURY_PKGS php${PHP_VER}-mysql" ;;
                    imagick)  SURY_PKGS="$SURY_PKGS php${PHP_VER}-imagick" ;;
                    bcmath)   SURY_PKGS="$SURY_PKGS php${PHP_VER}-bcmath" ;;
                    gmp)      SURY_PKGS="$SURY_PKGS php${PHP_VER}-gmp" ;;
                    zip)      SURY_PKGS="$SURY_PKGS php${PHP_VER}-zip" ;;
                    gd)       SURY_PKGS="$SURY_PKGS php${PHP_VER}-gd" ;;
                    mbstring) SURY_PKGS="$SURY_PKGS php${PHP_VER}-mbstring" ;;
                    curl)     SURY_PKGS="$SURY_PKGS php${PHP_VER}-curl" ;;
                    xml)      SURY_PKGS="$SURY_PKGS php${PHP_VER}-xml" ;;
                    intl)     SURY_PKGS="$SURY_PKGS php${PHP_VER}-intl" ;;
                esac
            done
            apt install -y --allow-downgrades $SURY_PKGS
        else
            # Repositorios oficiales de Ubuntu
            info "Instalando extensiones desde repositorios oficiales..."
            OFFICIAL_PKGS=""
            for ext in $MISSING_EXTS; do
                case $ext in
                    mysql)    OFFICIAL_PKGS="$OFFICIAL_PKGS php-mysql" ;;
                    imagick)  OFFICIAL_PKGS="$OFFICIAL_PKGS php-imagick" ;;
                    bcmath)   OFFICIAL_PKGS="$OFFICIAL_PKGS php-bcmath" ;;
                    gmp)      OFFICIAL_PKGS="$OFFICIAL_PKGS php-gmp" ;;
                    zip)      OFFICIAL_PKGS="$OFFICIAL_PKGS php-zip" ;;
                    gd)       OFFICIAL_PKGS="$OFFICIAL_PKGS php-gd" ;;
                    mbstring) OFFICIAL_PKGS="$OFFICIAL_PKGS php-mbstring" ;;
                    curl)     OFFICIAL_PKGS="$OFFICIAL_PKGS php-curl" ;;
                    xml)      OFFICIAL_PKGS="$OFFICIAL_PKGS php-xml" ;;
                    intl)     OFFICIAL_PKGS="$OFFICIAL_PKGS php-intl" ;;
                esac
            done
            apt install -y $OFFICIAL_PKGS
        fi
    else
        info "Todas las extensiones necesarias ya están presentes."
    fi
else
    # Instalación limpia de PHP (sin PPA previo)
    info "Instalando PHP 8.3 y extensiones desde repositorios oficiales..."
    apt install -y php8.3 php8.3-cli php8.3-common php8.3-mysql php8.3-zip \
        php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml php8.3-bcmath \
        php8.3-intl php8.3-imagick php8.3-gmp libapache2-mod-php8.3
    PHP_VER="8.3"
fi

# Habilitar módulos de Apache
a2enmod rewrite headers env dir mime 2>/dev/null || true
systemctl restart apache2

# -------------------- BASE DE DATOS --------------------
info "Configurando base de datos..."
if command_exists mysql; then
    warn "MySQL/MariaDB ya está instalado."
    systemctl start mariadb 2>/dev/null || systemctl start mysql 2>/dev/null || true
else
    info "Instalando MariaDB..."
    apt install -y mariadb-server
    systemctl start mariadb
fi

# Crear base de datos y usuario (sin romper existentes)
create_database() {
    local db="$1" user="$2" pass="$3"
    
    if mysql -u root -e "exit" 2>/dev/null; then
        MYSQL_CMD="mysql -u root"
    else
        echo -ne "${YELLOW}Contraseña de root de MySQL:${NC} "
        read -s root_pass
        echo
        MYSQL_CMD="mysql -u root -p$root_pass"
    fi
    
    if $MYSQL_CMD -e "USE $db" 2>/dev/null; then
        warn "Base de datos '$db' ya existe. Se usará la existente."
    else
        info "Creando base de datos '$db'..."
        $MYSQL_CMD -e "CREATE DATABASE $db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
    fi
    
    if $MYSQL_CMD -e "SELECT 1 FROM mysql.user WHERE User='$user' AND Host='localhost'" | grep -q 1; then
        warn "Usuario '$user' ya existe. Actualizando contraseña..."
        $MYSQL_CMD -e "ALTER USER '$user'@'localhost' IDENTIFIED BY '$pass';"
    else
        info "Creando usuario '$user'..."
        $MYSQL_CMD -e "CREATE USER '$user'@'localhost' IDENTIFIED BY '$pass';"
    fi
    
    $MYSQL_CMD -e "GRANT ALL PRIVILEGES ON $db.* TO '$user'@'localhost';"
    $MYSQL_CMD -e "FLUSH PRIVILEGES;"
}

create_database "$DB_NAME" "$DB_USER" "$DB_PASS"

# -------------------- DESCARGA E INSTALACIÓN DE NEXTCLOUD --------------------
info "Preparando Nextcloud en $NC_DIR..."
mkdir -p "$(dirname "$NC_DIR")"
cd "$(dirname "$NC_DIR")"

if [ -d "$NC_DIR" ] && [ -f "$NC_DIR/config/config.php" ]; then
    warn "Parece que Nextcloud ya está instalado."
    if confirm "¿Deseas reinstalar (se perderán los datos)?"; then
        info "Eliminando instalación anterior..."
        rm -rf "$NC_DIR"
    else
        info "Manteniendo instalación existente. Saliendo."
        exit 0
    fi
fi

# Descargar Nextcloud
if [ ! -f latest.zip ]; then
    info "Descargando Nextcloud..."
    wget -q --show-progress https://download.nextcloud.com/server/releases/latest.zip
else
    warn "El archivo latest.zip ya existe. Usándolo."
fi

info "Instalando unzip..."
apt install -y unzip

info "Descomprimiendo..."
unzip -q -o latest.zip
rm -f latest.zip

# Si se movió el directorio de instalación
if [ "$NC_DIR" != "/var/www/nextcloud" ] && [ -d "/var/www/nextcloud" ]; then
    mv /var/www/nextcloud "$NC_DIR"
fi

# Configurar permisos
chown -R www-data:www-data "$NC_DIR"
chmod -R 755 "$NC_DIR"

# -------------------- CONFIGURACIÓN DE APACHE --------------------
info "Configurando VirtualHost de Apache..."
SERVER_IP=$(hostname -I | awk '{print $1}')

cat > /etc/apache2/sites-available/nextcloud.conf <<EOF
<VirtualHost *:$PORT>
    ServerName $SERVER_IP
    DocumentRoot $NC_DIR

    <Directory $NC_DIR>
        Require all granted
        AllowOverride All
        Options FollowSymLinks MultiViews
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/nextcloud_error.log
    CustomLog \${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
EOF

# Deshabilitar sitio por defecto y habilitar Nextcloud
a2dissite 000-default.conf 2>/dev/null || true
a2ensite nextcloud.conf
systemctl reload apache2

# -------------------- RESUMEN FINAL --------------------
echo ""
echo "========================================="
echo -e "${GREEN}✅ INSTALACIÓN COMPLETA${NC}"
echo "========================================="
echo -e "${BLUE}🌐 Accede a Nextcloud en tu navegador:${NC}"
echo -e "   http://$SERVER_IP:$PORT"
echo ""
echo -e "${BLUE}📌 Datos de la base de datos:${NC}"
echo "   Nombre:     $DB_NAME"
echo "   Usuario:    $DB_USER"
echo "   Contraseña: $DB_PASS"
echo "   Host:       localhost"
echo ""
echo -e "${YELLOW}⚠️  IMPORTANTE: Completa la instalación en el navegador${NC}"
echo "   Selecciona 'MySQL/MariaDB' e introduce los datos de arriba."
echo "========================================="

# Guardar credenciales opcionalmente
if [ "$NONINTERACTIVE" != "true" ]; then
    if confirm "¿Guardar las credenciales en /root/nextcloud_credentials.txt?"; then
        cat > /root/nextcloud_credentials.txt <<EOF
# Credenciales de Nextcloud - $(date)
IP: $SERVER_IP
Puerto: $PORT
Base de datos: $DB_NAME
Usuario DB: $DB_USER
Contraseña DB: $DB_PASS
EOF
        chmod 600 /root/nextcloud_credentials.txt
        info "Credenciales guardadas en /root/nextcloud_credentials.txt"
    fi
fi

echo -e "${GREEN}¡Disfruta de Nextcloud! 🚀${NC}"

Cómo ejecutar el script

  1. Crear el archivo: nano install_nextcloud.sh
  2. Pegar el script y guardar
  3. Dar permisos: chmod +x install_nextcloud.sh
  4. Ejecutar: ./install_nextcloud.sh

Acceso a Nextcloud

Una vez terminado, abre tu navegador y entra a:

http://TU_IP

Desde ahí podrás crear el usuario administrador y conectar la base de datos.


Recomendaciones de seguridad

  • 🔐 Cambiar la contraseña de la base de datos
  • 🔒 Activar HTTPS con Let’s Encrypt
  • 🧱 Configurar firewall (UFW)
  • 💾 Hacer backups regularmente

Desinstalación

#!/bin/bash
# ==========================================
# Desinstalador automático de Nextcloud
# Ubuntu Server 24.04
# Revierte todos los cambios del instalador
# ==========================================

set -e

# -------------------- CONFIGURACIÓN --------------------
NC_DIR="${NEXTCLOUD_DIR:-/var/www/nextcloud}"
DB_NAME="${NEXTCLOUD_DB_NAME:-nextcloud}"
DB_USER="${NEXTCLOUD_DB_USER:-ncuser}"
APACHE_SITE="nextcloud.conf"

# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# -------------------- FUNCIONES --------------------
error_exit() {
    echo -e "${RED}ERROR: $1${NC}" >&2
    exit 1
}

info() {
    echo -e "${GREEN}➡️ $1${NC}"
}

warn() {
    echo -e "${YELLOW}⚠️ $1${NC}"
}

confirm() {
    read -p "$1 [s/N]: " -n 1 -r
    echo
    [[ $REPLY =~ ^[Ss]$ ]]
}

command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# -------------------- VERIFICACIÓN DE EJECUCIÓN --------------------
if [ "$EUID" -ne 0 ]; then
    error_exit "Ejecuta con sudo o como root."
fi

echo ""
echo -e "${RED}=========================================${NC}"
echo -e "${RED}   DESINSTALADOR DE NEXTCLOUD${NC}"
echo -e "${RED}=========================================${NC}"
warn "Este script eliminará Nextcloud y sus configuraciones."
warn "Los datos de la base de datos y archivos se perderán permanentemente."
echo ""

if ! confirm "¿Estás seguro de que deseas continuar?"; then
    info "Desinstalación cancelada."
    exit 0
fi

# -------------------- 1. DETENER SERVICIOS --------------------
info "Deteniendo servicios relacionados..."
systemctl stop apache2 2>/dev/null || true
systemctl stop mariadb 2>/dev/null || true
systemctl stop mysql 2>/dev/null || true

# -------------------- 2. ELIMINAR ARCHIVOS DE NEXTCLOUD --------------------
if [ -d "$NC_DIR" ]; then
    info "Eliminando directorio de Nextcloud en $NC_DIR..."
    rm -rf "$NC_DIR"
else
    warn "El directorio $NC_DIR no existe."
fi

# Buscar y eliminar cualquier otro directorio de Nextcloud en /var/www
if [ -d "/var/www/nextcloud" ] && [ "/var/www/nextcloud" != "$NC_DIR" ]; then
    info "Eliminando /var/www/nextcloud..."
    rm -rf "/var/www/nextcloud"
fi

# -------------------- 3. ELIMINAR CONFIGURACIÓN DE APACHE --------------------
info "Eliminando configuración de Apache para Nextcloud..."
a2dissite "$APACHE_SITE" 2>/dev/null || true
rm -f "/etc/apache2/sites-available/$APACHE_SITE"
rm -f "/etc/apache2/sites-enabled/$APACHE_SITE"

# Opcionalmente restaurar el sitio por defecto si existe
if [ -f "/etc/apache2/sites-available/000-default.conf" ]; then
    a2ensite 000-default.conf 2>/dev/null || true
fi

# Revertir cambios en el puerto si solo se usó para Nextcloud (opcional avanzado)
# Nota: no revertimos automáticamente porque podría haber otros sitios usando ese puerto.

systemctl reload apache2 2>/dev/null || true

# -------------------- 4. ELIMINAR BASE DE DATOS Y USUARIO (OPCIONAL) --------------------
echo ""
if confirm "¿Eliminar la base de datos '$DB_NAME' y el usuario '$DB_USER'?"; then
    if command_exists mysql; then
        info "Eliminando base de datos y usuario..."
        # Determinar comando MySQL con o sin contraseña
        if mysql -u root -e "exit" 2>/dev/null; then
            MYSQL_CMD="mysql -u root"
        else
            echo -ne "${YELLOW}Ingresa la contraseña de root de MySQL:${NC} "
            read -s root_pass
            echo
            MYSQL_CMD="mysql -u root -p$root_pass"
        fi
        
        $MYSQL_CMD -e "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null && info "Base de datos $DB_NAME eliminada."
        $MYSQL_CMD -e "DROP USER IF EXISTS '$DB_USER'@'localhost';" 2>/dev/null && info "Usuario $DB_USER eliminado."
        $MYSQL_CMD -e "FLUSH PRIVILEGES;" 2>/dev/null
    else
        warn "MySQL/MariaDB no está instalado. No se pudo eliminar la base de datos."
    fi
else
    info "Base de datos conservada."
fi

# -------------------- 5. ELIMINAR PAQUETES (OPCIONAL) --------------------
echo ""
if confirm "¿Eliminar paquetes de Apache, PHP y MariaDB instalados por el script?"; then
    info "Eliminando paquetes..."
    
    # Lista de paquetes comunes del instalador
    PACKAGES_TO_REMOVE="apache2 mariadb-server mariadb-client"
    PHP_PACKAGES="php8.3 php8.3-cli php8.3-common php8.3-mysql php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml php8.3-bcmath php8.3-intl php8.3-imagick php8.3-gmp libapache2-mod-php8.3"
    
    # Añadir también los nombres genéricos por si acaso
    PHP_GENERIC="php php-cli php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-bcmath php-intl php-imagick php-gmp libapache2-mod-php"
    
    # Preguntar si se quiere purgar (eliminar también configuraciones)
    PURGE=""
    if confirm "¿Eliminar también los archivos de configuración (purgar)?"; then
        PURGE="--purge"
    fi
    
    apt remove $PURGE -y $PACKAGES_TO_REMOVE $PHP_PACKAGES $PHP_GENERIC 2>/dev/null || true
    apt autoremove -y
    
    info "Paquetes eliminados."
else
    info "Paquetes conservados."
fi

# -------------------- 6. LIMPIEZA ADICIONAL --------------------
info "Limpiando archivos residuales..."
rm -f /var/www/latest.zip 2>/dev/null || true
rm -f /root/nextcloud_credentials.txt 2>/dev/null || true

# -------------------- 7. RESUMEN FINAL --------------------
echo ""
echo "========================================="
echo -e "${GREEN}✅ DESINSTALACIÓN COMPLETA${NC}"
echo "========================================="
echo -e "${YELLOW}Se han eliminado:${NC}"
echo "  - Nextcloud (directorio $NC_DIR)"
echo "  - Configuración de Apache (sitio nextcloud)"
if confirm "¿Eliminar base de datos?" 2>/dev/null; then
    echo "  - Base de datos $DB_NAME y usuario $DB_USER"
fi
if confirm "¿Eliminar paquetes?" 2>/dev/null; then
    echo "  - Paquetes de Apache, PHP y MariaDB (si se seleccionó)"
fi
echo ""
echo -e "${BLUE}Nota: Los datos personales de Nextcloud no son recuperables.${NC}"
echo "========================================="

Conclusión

Con este método puedes tener tu propia nube privada funcionando en pocos minutos. Es ideal para uso personal o incluso para pequeñas empresas que quieran tener control total sobre sus datos.


Apóyame

Si esta guía te fue útil y quieres apoyar más contenido como este, puedes hacerlo aquí:

👉 https://www.patreon.com/u74078772?

💎 Guía Maestra: Instalación de SAP HANA Client 2.0

Entrada fija

Edición SAP Business One (HANA 2.0 Rev 56)

Esta guía detalla el despliegue del cliente de base de datos, componente esencial para conectar SAP B1, Crystal Reports, Excel y Power BI.


1 Ubicación del Kit de Instalación

En entornos de SAP Business One, el instalador reside dentro de los paquetes de datos del servidor. No busque instaladores genéricos; navegue a la siguiente ruta:

…\HANA 2.0 rev 56\DATA_UNITS\SAP HANA CLIENT 2.0 FOR B1

Dentro encontrará la arquitectura dual de SAP:

  • 📂 NT_X64: Carpeta exclusiva para Windows (64 bits).
  • 📂 LINX64SUSE: Carpeta para servidores Linux/SUSE.

2 Instalación Paso a Paso

  1. Acceda a la carpeta NT_X64.
  2. Localice el ejecutable hdbinst.exe.
  3. Derechos de Administrador: Haga clic derecho y seleccione “Ejecutar como administrador”.
  4. Consola: Presione Enter para aceptar la ruta por defecto C:\hdbclient.

⚠️ Verificación: La instalación finaliza correctamente cuando visualiza el mensaje: Installation done.

3 Configuración del PATH

Para ejecutar herramientas como hdbsql desde cualquier carpeta, configure la variable de entorno:

  • Busque “Variables de Entorno” en el menú Inicio.
  • En Variables del sistema, edite la variable Path.
  • Agregue una nueva línea con: C:\hdbclient.

4 Activación ODBC (64 bits)

Para habilitar la conexión en aplicaciones de terceros:

  1. Abra el Administrador de orígenes de datos ODBC (64 bits).
  2. Vaya a DSN de sistema > Agregar.
  3. Seleccione el controlador HDBODBC.
  4. Configure la IP del servidor y el puerto (ej: 30015).

// Prueba de fuego en CMDhdbsql -n 192.168.X.X:30015 -u SYSTEM -p Password123 "SELECT * FROM DUMMY"

🚀 Troubleshooting Rápido

  • ¿No ve el driver? Instale “Visual C++ Redistributable 2013/2015”.
  • ¿Error -10709? Verifique el Firewall del servidor en el puerto 30015.

🚀 Guía de Activación CData ODBC SAP BUSINESS ONE

Entrada fija

SAP HANA Driver 2025 | Linux Mint & Ubuntu

Esta guía resuelve el error Could not find a valid license permitiendo la activación del periodo de prueba o licencia comercial.

1. Localizar el Motor de Activación

El driver incluye una utilidad Java específica. En la versión 2025, el archivo clave es:

/opt/cdata/cdata-odbc-driver-for-saphana/lib/cdata.odbcm.saphana.jar

2. Ejecutar el Asistente por Terminal

Usa el siguiente comando para forzar la apertura del gestor de licencias (requiere privilegios de sudo):

sudo java -cp /opt/cdata/cdata-odbc-driver-for-saphana/lib/cdata.odbcm.saphana.jar cdata.odbc.saphana.DriverMain -license

3. Datos de Registro (Modo TRIAL)

Dentro del asistente, completa la información solicitada:

  • 👤 Name: Tu nombre completo
  • 📧 Email: Tu correo electrónico
  • 🔑 Product Key: Escribe TRIAL

Nota: Si tienes una clave comprada, ingrésala en lugar de “TRIAL”.

4. Configuración de Permisos Finales

Es vital copiar la licencia y dar permisos de lectura para que PHP/Apache puedan detectarla:

# Crear carpeta de configuración
mkdir -p ~/.cdata

# Copiar archivo de licencia
sudo cp /opt/cdata/cdata-odbc-driver-for-saphana/lib/CData.ODBC.SAPHANA.lic ~/.cdata/

# Liberar permisos de lectura
sudo chmod 644 ~/.cdata/CData.ODBC.SAPHANA.lic
sudo chmod 644 /opt/cdata/cdata-odbc-driver-for-saphana/lib/CData.ODBC.SAPHANA.lic

📋 Detalles de la Licencia Trial

  • Vigencia: 30 días a partir de la activación.
  • Capacidad: Funcionalidad completa sin límite de registros.
  • Requisito: Requiere Java JRE instalado en el sistema.

Guía generada para Julio César – Linux Mint 22

¿Está Siendo Desmantelado LBRY por Presión de la SEC? El Caso LBC y el Futuro de la Descentralización

Entrada fija

¿Está Siendo Desmantelado LBRY por Presión de la SEC? El Caso LBC y el Futuro de la Descentralización

Introducción

LBRY fue uno de los proyectos pioneros en ofrecer una red descentralizada para la publicación y monetización de contenido, con su token nativo LBC (LBRY Credits). Pero en los últimos meses, LBC ha desaparecido progresivamente de múltiples exchanges, tanto centralizados como descentralizados, dejando a muchos usuarios con activos atrapados y sin liquidez. ¿Qué ocurrió realmente? ¿Fue un fallo tecnológico, una caída del interés… o presión estatal?

Este análisis desglosa lo que pasó con LBRY y cómo el gobierno, en especial la SEC (Securities and Exchange Commission) de Estados Unidos, puede desmantelar incluso proyectos descentralizados sin necesidad de tocar una sola línea de código.

1. El Caso LBRY vs. SEC

¿Qué es LBRY?

LBRY fue creado como un protocolo blockchain que permite a los usuarios compartir contenido (videos, publicaciones, música) sin intermediarios. Su token LBC se usaba para pagar por contenido, apoyar creadores y realizar microtransacciones dentro del ecosistema.

La demanda de la SEC

En marzo de 2021, la SEC presentó una demanda contra LBRY Inc., la empresa detrás del desarrollo del protocolo, acusándola de vender valores no registrados mediante la emisión de LBC, incluso sin haber hecho una ICO formal.

El fallo judicial

En noviembre de 2022, el tribunal falló a favor de la SEC, declarando que LBC era un valor bajo la ley estadounidense. Esto generó consecuencias graves para el ecosistema, ya que incluso las ventas secundarias entre usuarios quedaron bajo amenaza.

2. La desaparición de LBC en exchanges

Tras el fallo:

  • Exchanges como CoinEx, BitMart, MXC y Hotbit eliminaron LBC.
  • Bittrex US cerró sus mercados para clientes estadounidenses.
  • Incluso algunos DEX dejaron de ofrecer pares de LBC debido a la baja liquidez y el riesgo legal.

¿Por qué también los DEX?

Aunque los DEX no son controlados directamente por gobiernos, las plataformas y front-ends prefieren evitar problemas legales. Además, los proveedores de liquidez abandonaron el token tras la sentencia, dejando pares sin volumen.

3. ¿Es esto censura financiera?

Sí, aunque indirectamente. Lo que pasó con LBC demuestra cómo un gobierno puede marginalizar una criptomoneda sin necesidad de prohibirla expresamente.

  • Técnicamente: El protocolo sigue vivo, los tokens existen, puedes correr nodos.
  • En la práctica: No hay liquidez ni adopción. Se volvió inviable para el usuario común.

4. ¿Cómo puede el gobierno controlar criptomonedas descentralizadas?

Los gobiernos pueden limitar una red cripto a través de los siguientes medios:

MecanismoEjemplo
Demandas legalesSEC vs LBRY, SEC vs Ripple
Prohibiciones de listadosExchanges eliminan tokens “en riesgo”
Presión a desarrolladoresArresto de desarrollador de Tornado Cash
Regulación de rampas de entrada/salidaKYC forzado en wallets y exchanges

5. ¿Qué significa esto para la descentralización real?

Niveles de descentralización:

NivelCaracterísticasRiesgo
1. TotalNodos distribuidos, sin empresa detrás (ej. Monero, Bitcoin)Baja censura, difícil de eliminar
2. ParcialRed abierta con empresa de desarrollo (ej. Ethereum, XRP)Presión legal sobre fundadores
3. CentralizadaControl total de empresa o figura única (ej. FTX, Terra)Fácilmente colapsables

6. Lecciones del caso LBRY

  • La descentralización debe ser real y completa: Si dependes de una empresa, puedes ser desmantelado.
  • El marco legal es importante: Aunque el código sea libre, la ley puede limitarlo.
  • La comunidad es clave: Sin una red fuerte de usuarios y nodos independientes, los proyectos mueren.

7. ¿Qué hacer si aún tienes LBC?

Opciones actuales:

  • Algunos exchanges internacionales aún permiten el intercambio, como Bittrex Global (fuera de EE. UU.).
  • Puedes conservar el token en wallets como LBRY Desktop u Odysee.
  • Trading P2P en foros o grupos privados.

Sin embargo, la liquidez y la utilidad del token están prácticamente extintas.

8. Alternativas verdaderamente descentralizadas

Si buscas redes resistentes a la censura, considera:

ProyectoDescripción
Monero (XMR)Criptomoneda centrada en la privacidad total.
IPFS + FilecoinAlmacenamiento de archivos descentralizado.
NostrRed social descentralizada, sin servidores centrales.
KeetMensajería y videollamadas P2P sin servidores.
ZoraPlataforma NFT sin control corporativo.

Conclusión

El caso de LBRY es una advertencia clara: una descentralización parcial no basta. Aunque el código sobreviva, el sistema puede ser asfixiado desde afuera mediante leyes, regulación financiera y censura social.

Si queremos una verdadera libertad en la web y en las finanzas, debemos construir infraestructuras libres de permisos, resistentes a la censura y no dependientes de ninguna entidad legal.

¿Te interesa migrar tus contenidos o tokens a plataformas libres y resistentes? Déjame tu comentario y seguimos explorando juntos.

🧠 Cómo convertir Visual Studio Code en el entorno ideal para PHP en Linux Mint (¡con formato automático como en NetBeans!)

Entrada fija

🧠 Cómo convertir Visual Studio Code en el entorno ideal para PHP en Linux Mint (¡con formato automático como en NetBeans!)

Si vienes de NetBeans y ahora estás usando Visual Studio Code (VS Code), probablemente extrañes esa característica tan útil de formatear automáticamente el código PHP con Ctrl+Shift+F.

¡Buenas noticias! Puedes lograr exactamente lo mismo (¡y mejor!) en VS Code. En esta guía te muestro cómo dejarlo todo listo paso a paso:


✅ Paso 1: Instalar Visual Studio Code en Linux Mint

Abre una terminal y ejecuta estos comandos para agregar el repositorio oficial de Microsoft e instalar VS Code:

sudo apt update
sudo apt install wget gpg
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] \
https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
sudo apt update
sudo apt install code

✅ Paso 2: Instalar PHP y Composer (si no los tienes)

En la misma terminal, instala PHP y sus extensiones comunes:

sudo apt install php-cli php-common php-mbstring php-xml php-curl php-zip php-gd

Y luego Composer:

sudo apt install composer

✅ Paso 3: Instalar extensiones esenciales para PHP

Abre Visual Studio Code y presiona Ctrl+P, luego escribe:

ext install bmewburn.vscode-intelephense-client
ext install kokororin.vscode-phpfmt
ext install xdebug.php-debug

🔹 ¿Qué hace cada extensión?

  • PHP Intelephense: autocompletado, documentación, detección de errores.
  • phpfmt: formatea el código PHP automáticamente (como NetBeans).
  • PHP Debug: permite depurar con Xdebug.

✅ Paso 4: Configurar el formateador por defecto para PHP

Abre VS Code, presiona Ctrl+Shift+P y escribe: Preferencias: Abrir configuración (JSON).

Agrega o edita lo siguiente:

{
  "[php]": {
    "editor.defaultFormatter": "kokororin.vscode-phpfmt",
    "editor.formatOnSave": false
  }
}

¿Prefieres que se formatee al guardar? Cambia formatOnSave a true.


✅ Paso 5: Cambiar el atajo a Alt + Shift + F para formatear (como en NetBeans)

🖱 Opción 1: Desde el menú

  1. Abre VS Code.
  2. Ve a Archivo > Preferencias > Métodos abreviados de teclado.

⌨ Opción 2: Usando atajo

Presiona Ctrl + K y luego Ctrl + S.

Luego:

  1. En la barra de búsqueda escribe: format document.
  2. Ubica la acción: Editor: Format Document.
  3. Haz clic en el lápiz ✎ y selecciona “Cambiar combinación de teclas”.
  4. Presiona: Alt + Shift + F y confirma.

¡Listo! Ahora puedes formatear tu código PHP como lo hacías en NetBeans.


✅ (Opcional) Personaliza el estilo de formato con phpfmt.ini

Para controlar cómo se acomoda el código, crea un archivo phpfmt.ini en tu proyecto o en tu carpeta personal con este contenido:

passes = ["PSR2KeywordsLowerCase", "PSR2LnAfterNamespace", "PSR2CurlyOpenNextLine"]
indent_with_space = true
psr1 = true
psr2 = true

Más opciones en: phpfmt tools (GitHub).


🎯 Resultado final

  • ✅ Código PHP se formatea automáticamente con Alt+Shift+F.
  • ✅ Autocompletado inteligente y validación en tiempo real.
  • ✅ Depuración de código con Xdebug.
  • ✅ Más rápido y moderno que NetBeans.

🗨 Conclusión

Visual Studio Code no solo reemplaza a NetBeans, ¡lo supera!

Ligero, potente, extensible y totalmente configurable, VS Code puede ser tu nuevo editor favorito para proyectos PHP en Linux Mint.

¿Te gustaría una plantilla base ya configurada para clonar desde GitHub? ¡Pídela y te la preparo!


#PHP #VisualStudioCode #LinuxMint #DevTips #NetBeansToVSCode #VSCodePHP #OpenSourceTools #DesarrolloWeb #CodeClean

🎯 Cómo lanzar una instancia EC2 con Ubuntu 24.04 lista para montar tu página web 🚀

Entrada fija

¿Quieres montar tu sitio web en la nube? Aquí te explico cómo lanzar una instancia EC2 en Amazon Web Services (AWS) con Ubuntu 24.04 y configurarla con un grupo de seguridad que te permita publicar tu página web en minutos. ✅

🔧 Paso 1: Lanza la instancia EC2

  1. Entra a la consola de AWS y ve a EC2 > Instancias > Lanzar Instancia.
  2. Nombre: Ponle un nombre descriptivo (ej. ServidorWeb-Ubuntu24).
  3. AMI: Selecciona Ubuntu Server 24.04 LTS (HVM), SSD Volume Type.
  4. Tipo de instancia: Puedes usar t2.micro si estás en el nivel gratuito.
  5. Par de claves: Crea uno nuevo o selecciona uno existente para acceder por SSH.
  6. Grupo de seguridad: Aquí es clave. Crea uno con las siguientes reglas:
    • ✅ Tipo: SSH, Puerto: 22, Origen: Mi IP
    • ✅ Tipo: HTTP, Puerto: 80, Origen: 0.0.0.0/0
    • ✅ Tipo: HTTPS, Puerto: 443, Origen: 0.0.0.0/0
  7. Revisa y lanza la instancia.

🔌 Paso 2: Conéctate vía SSH

ssh -i "tu-clave.pem" ubuntu@<IP-Pública>

🍃 Paso 3: Instala el stack básico para tu página web
Actualiza el sistema e instala un servidor web (como Nginx o Apache):

sudo apt update && sudo apt upgrade -y
sudo apt install nginx -y

Verifica que funcione:

http://localhost

🔍 También puedes acceder desde el navegador:
http://<IP-Pública-de-tu-instancia>

📁 Sube tus archivos HTML o usa Git para clonar tu proyecto web dentro de /var/www/html/.

🧠 Consejo extra: Si vas a usar un dominio propio, asegúrate de apuntar los DNS a la IP de tu instancia EC2. Puedes usar Let’s Encrypt para HTTPS gratuito con Certbot.


💡 ¡Listo! Ya tienes tu servidor Ubuntu 24.04 en AWS listo para servir páginas web. Ideal para desarrolladores, estudiantes o emprendedores que quieren su web en línea rápido y sin complicaciones.

¿Quieres que te comparta un script que automatice esto? ¡Déjamelo saber! 👇

#AWS #EC2 #Ubuntu24 #DevOps #WebHosting #Linux #CloudComputing

Página 1 de 7

Creado con WordPress & Tema de Anders Norén