diff --git a/.env b/.env new file mode 100644 index 0000000..1fe14b7 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +CONTAINER_DATA_FILE = 'containers.json' +BASE_IMAGE_TAG = 'debian_vscode:tag' diff --git a/.gitignore b/.gitignore index 8ecdadc..a59443f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ venv app/frontend/node_modules -app/venv \ No newline at end of file +app/venv +d_apps \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4b080b4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#1f6fd0", + "activityBar.background": "#1f6fd0", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#ee90bb", + "activityBarBadge.foreground": "#15202b", + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#1f6fd0", + "statusBar.background": "#1857a4", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#1f6fd0", + "statusBarItem.remoteBackground": "#1857a4", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#1857a4", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#1857a499", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.color": "#1857a4" +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 784958e..89a9c9f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,25 +11,84 @@ RUN apt-get update && \ curl \ gnupg \ apt-transport-https \ + wget \ + build-essential \ + libncursesw5-dev \ + libssl-dev \ + libsqlite3-dev \ + tk-dev \ + libgdbm-dev \ + libc6-dev \ + libbz2-dev \ + libffi-dev \ + zlib1g-dev \ + git \ ca-certificates && \ rm -rf /var/lib/apt/lists/* +# Descargar e instalar Python 3.10 +RUN wget https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgz --no-check-certificate && \ + tar xzf Python-3.10.16.tgz && \ + cd Python-3.10.16 && \ + ./configure --enable-optimizations && \ + make altinstall && \ + ln -s /usr/local/bin/python3.10 /usr/bin/python && \ + cd .. && \ + rm -rf Python-3.10.16* + +# Verificar la instalación de Python y pip +RUN python --version && pip3.10 --version + +# Descargar e instalar code-server de manera explícita +RUN curl -fsSL https://code-server.dev/install.sh | sh && \ + if [ ! -f /usr/bin/code-server ]; then ln -s $(which code-server) /usr/bin/code-server; fi && \ + which code-server && \ + code-server --version -# Descargar e instalar code-server -RUN curl -sSL https://code-server.dev/install.sh | sh || echo "Error al instalar code-server" && \ - which code-server || echo "code-server no encontrado" && \ - code-server --version || echo "Error al obtener la versión de code-server" +# Instalar Node.js 22 +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ + apt-get install -y nodejs && \ + node -v && npm -v +# Habilitar el uso de corepack +RUN corepack enable + +# Definir el directorio de trabajo +WORKDIR /app/frontend + +# Copiar archivos desde la carpeta local +COPY vite-template/ . + + +# Instalar dependencias para evitar `npm install` en cada arranque +RUN npm install + + + +# Crear la estructura de carpetas y asegurar permisos +RUN mkdir -p /app/backend /app/host_transfer && \ + chmod -R 777 /app/backend /app/host_transfer + +# Crear la carpeta en la raíz del contenedor +RUN mkdir -p /app/share && chmod 777 /app/share + + + + +# Copiar el script de inicio +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + # Exponer el puerto por defecto de code-server -EXPOSE 8080 +EXPOSE 8080 5173 # Definir el usuario y grupo de trabajo USER root -# Comando para iniciar code-server como root -ENTRYPOINT ["/bin/bash", "-c", "code-server /app --bind-addr 0.0.0.0:8080 --auth none -vvv"] +# Comando para iniciar code-server y react como root +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/app/utils/python.sh b/app/utils/python.sh deleted file mode 100644 index baae0f6..0000000 --- a/app/utils/python.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Actualizar repositorios -echo "Actualizando repositorios..." -apt-get update - -# Instalar Python 3 y pip -echo "Instalando Python 3 y pip..." -apt-get install -y python3 python3-pip - -# Crear alias para 'python' si no existe -if ! command -v python &> /dev/null -then - echo "Creando alias para 'python'..." - ln -s /usr/bin/python3 /usr/bin/python -fi - -# Actualizar pip a la última versión -echo "Actualizando pip..." -python3 -m pip install --upgrade pip --break-system-packages - -# Verificar la instalación -echo "Verificando la instalación..." -python --version -pip --version - -echo "Instalación completada exitosamente." diff --git a/containers.json b/containers.json index 1f3862f..6bd8c41 100644 --- a/containers.json +++ b/containers.json @@ -1,90 +1,238 @@ [ { - "id": "4d4a8a34c7b4", - "name": "duly-driven-sawfly", - "network": "alpine_network_c9754c4a-e7b8-454d-b00f-448ee0adc051", + "id": "75cce4b7d741", + "name": "kindly-giving-oriole", + "network": "alpine_network_3728b140-66ce-4a8f-b8ec-38f73d9bc1d9", "image": "debian_vscode:tag", - "compose_file": "docker-compose-c9754c4a-e7b8-454d-b00f-448ee0adc051.yml", - "creation_timestamp": "2025-03-03T00:25:28.847998", + "compose_file": "docker-compose-3728b140-66ce-4a8f-b8ec-38f73d9bc1d9.yml", + "creation_timestamp": "2025-03-16T17:48:58.123574", "ports": [ { "host_port": 27000, - "internal_port": 3000 + "internal_port": 5173 }, { "host_port": 27001, - "internal_port": 5000 + "internal_port": 5432 }, { "host_port": 27002, - "internal_port": 8000 + "internal_port": 8786 }, { "host_port": 27003, - "internal_port": 8080 + "internal_port": 8787 }, { "host_port": 27004, + "internal_port": 8080 + }, + { + "host_port": 27005, "internal_port": 17000 } ] }, { - "id": "1e0bbc3d168c", - "name": "jolly-modern-marlin", - "network": "alpine_network_3f7cd6cb-f573-4d3f-b29d-9fea13925acb", + "id": "2a5f0fbacbc3", + "name": "surely-clear-bedbug", + "network": "alpine_network_a0733228-9fd8-4181-90de-921da890b187", "image": "debian_vscode:tag", - "compose_file": "docker-compose-3f7cd6cb-f573-4d3f-b29d-9fea13925acb.yml", - "creation_timestamp": "2025-03-03T00:25:30.606035", + "compose_file": "docker-compose-a0733228-9fd8-4181-90de-921da890b187.yml", + "creation_timestamp": "2025-03-16T17:49:39.088427", "ports": [ - { - "host_port": 27005, - "internal_port": 3000 - }, { "host_port": 27006, - "internal_port": 5000 + "internal_port": 5173 }, { "host_port": 27007, - "internal_port": 8000 + "internal_port": 5432 }, { "host_port": 27008, - "internal_port": 8080 + "internal_port": 8786 }, { "host_port": 27009, + "internal_port": 8787 + }, + { + "host_port": 27010, + "internal_port": 8080 + }, + { + "host_port": 27011, "internal_port": 17000 } ] }, { - "id": "19a7ed4f580b", - "name": "solely-enough-owl", - "network": "alpine_network_3a4a8c19-333e-470d-928b-03a7ac0a5ecb", + "id": "2843d1d781e9", + "name": "sadly-prime-vervet", + "network": "alpine_network_49293255-543b-4ad4-8b25-f09face34151", "image": "debian_vscode:tag", - "compose_file": "docker-compose-3a4a8c19-333e-470d-928b-03a7ac0a5ecb.yml", - "creation_timestamp": "2025-03-03T00:25:32.871372", + "compose_file": "docker-compose-49293255-543b-4ad4-8b25-f09face34151.yml", + "creation_timestamp": "2025-03-16T17:49:40.669883", "ports": [ - { - "host_port": 27010, - "internal_port": 3000 - }, - { - "host_port": 27011, - "internal_port": 5000 - }, { "host_port": 27012, - "internal_port": 8000 + "internal_port": 5173 }, { "host_port": 27013, - "internal_port": 8080 + "internal_port": 5432 }, { "host_port": 27014, + "internal_port": 8786 + }, + { + "host_port": 27015, + "internal_port": 8787 + }, + { + "host_port": 27016, + "internal_port": 8080 + }, + { + "host_port": 27017, + "internal_port": 17000 + } + ] + }, + { + "id": "a24827329b07", + "name": "mildly-tight-dassie", + "network": "alpine_network_7f7ed654-b0e0-4ca6-9170-0d7eb8312755", + "image": "debian_vscode:tag", + "compose_file": "docker-compose-7f7ed654-b0e0-4ca6-9170-0d7eb8312755.yml", + "creation_timestamp": "2025-03-17T22:34:56.871974", + "ports": [ + { + "host_port": 27024, + "internal_port": 5173 + }, + { + "host_port": 27025, + "internal_port": 5432 + }, + { + "host_port": 27026, + "internal_port": 8786 + }, + { + "host_port": 27027, + "internal_port": 8787 + }, + { + "host_port": 27028, + "internal_port": 8080 + }, + { + "host_port": 27029, + "internal_port": 17000 + } + ] + }, + { + "id": "43e5aae90772", + "name": "evenly-next-maggot", + "network": "alpine_network_e9729657-616a-4e2c-b68b-c0534dd70718", + "image": "debian_vscode:tag", + "compose_file": "docker-compose-e9729657-616a-4e2c-b68b-c0534dd70718.yml", + "creation_timestamp": "2025-03-17T22:34:58.494546", + "ports": [ + { + "host_port": 27030, + "internal_port": 5173 + }, + { + "host_port": 27031, + "internal_port": 5432 + }, + { + "host_port": 27032, + "internal_port": 8786 + }, + { + "host_port": 27033, + "internal_port": 8787 + }, + { + "host_port": 27034, + "internal_port": 8080 + }, + { + "host_port": 27035, + "internal_port": 17000 + } + ] + }, + { + "id": "29759ed8a927", + "name": "highly-neat-dingo", + "network": "alpine_network_11390599-fdfb-451f-9903-2d857bf9cc1f", + "image": "debian_vscode:tag", + "compose_file": "docker-compose-11390599-fdfb-451f-9903-2d857bf9cc1f.yml", + "creation_timestamp": "2025-03-17T22:35:00.209660", + "ports": [ + { + "host_port": 27037, + "internal_port": 5173 + }, + { + "host_port": 27038, + "internal_port": 5432 + }, + { + "host_port": 27039, + "internal_port": 8786 + }, + { + "host_port": 27040, + "internal_port": 8787 + }, + { + "host_port": 27041, + "internal_port": 8080 + }, + { + "host_port": 27042, + "internal_port": 17000 + } + ] + }, + { + "id": "32dc96ea7b52", + "name": "duly-nearby-marten", + "network": "alpine_network_cacf7537-064f-4516-8fe9-f4b31859e020", + "image": "debian_vscode:tag", + "compose_file": "docker-compose-cacf7537-064f-4516-8fe9-f4b31859e020.yml", + "creation_timestamp": "2025-03-17T22:35:01.933397", + "ports": [ + { + "host_port": 27043, + "internal_port": 5173 + }, + { + "host_port": 27044, + "internal_port": 5432 + }, + { + "host_port": 27045, + "internal_port": 8786 + }, + { + "host_port": 27046, + "internal_port": 8787 + }, + { + "host_port": 27047, + "internal_port": 8080 + }, + { + "host_port": 27048, "internal_port": 17000 } ] diff --git a/eliminar_1_contenedor.py b/eliminar_1_contenedor.py index afd3840..934358a 100644 --- a/eliminar_1_contenedor.py +++ b/eliminar_1_contenedor.py @@ -7,11 +7,11 @@ import hashlib from datetime import datetime # Archivo JSON para guardar los datos de los contenedores -CONTAINER_DATA_FILE = 'containers.json' +CONTAINER_DATA_FILE = os.getenv("CONTAINER_DATA_FILE") # Nombre y etiqueta para la imagen base -BASE_IMAGE_TAG = 'alpine_vscode:latest' +BASE_IMAGE_TAG = os.getenv("BASE_IMAGE_TAG") -CONTENEDOR_IDENTIFICADOR = "easily-sound-ant" +CONTENEDOR_IDENTIFICADOR = "9755e379cd01" # ------------------------------- # Función: Eliminar un contenedor por ID o nombre y actualizar el JSON @@ -41,6 +41,8 @@ def delete_container(identifier): os.system(f"docker rm -f {container['id']}") print(f"➤ Eliminando red: {container['network']}") os.system(f"docker network rm {container['network']}") + eliminar_carpeta(container['name']) + print(f"➤ Eliminando carpeta: {container['network']}") # Actualizar el JSON excluyendo el contenedor eliminado containers = [c for c in containers if c['id'] != container['id']] @@ -51,6 +53,16 @@ def delete_container(identifier): except Exception as e: print(f"❌ Error eliminando el contenedor {container['name']}: {e}") +# ------------------------------- +# Función: Eliminar carpeta de datos de un contenedor +# ------------------------------- + +def eliminar_carpeta(nombre_carpeta): + ruta_carpeta = os.path.join('d_apps/', nombre_carpeta) + shutil.rmtree(ruta_carpeta) + print(f"✔ Carpeta {nombre_carpeta} eliminada correctamente.") + + # ------------------------------- # Función: Limpiar imágenes huérfanas # ------------------------------- diff --git a/eliminar_contenedores.py b/eliminar_contenedores.py index b25e8af..3bb22c5 100644 --- a/eliminar_contenedores.py +++ b/eliminar_contenedores.py @@ -7,9 +7,9 @@ import hashlib from datetime import datetime # Archivo JSON para guardar los datos de los contenedores -CONTAINER_DATA_FILE = 'containers.json' +CONTAINER_DATA_FILE = os.getenv("CONTAINER_DATA_FILE") # Nombre y etiqueta para la imagen base -BASE_IMAGE_TAG = 'alpine_vscode:latest' +BASE_IMAGE_TAG = os.getenv("BASE_IMAGE_TAG") # ------------------------------- @@ -42,6 +42,9 @@ def delete_all_containers(): os.system(f"docker rm -f {container['id']}") print(f"➤ Eliminando red: {container['network']}") os.system(f"docker network rm {container['network']}") + eliminar_carpeta(container['name']) + print(f"➤ Eliminando carpeta: {container['network']}") + except Exception as e: print(f"❌ Error eliminando el contenedor {container['name']}: {e}") # Guardar el contenedor en la lista si no se pudo eliminar @@ -59,6 +62,15 @@ def delete_all_containers(): print("✔ Todos los contenedores y redes han sido eliminados y el archivo JSON ha sido limpiado.") +# ------------------------------- +# Función: Eliminar carpeta de datos de un contenedor +# ------------------------------- + +def eliminar_carpeta(nombre_carpeta): + ruta_carpeta = os.path.join('d_apps/', nombre_carpeta) + shutil.rmtree(ruta_carpeta) + print(f"✔ Carpeta {nombre_carpeta} eliminada correctamente.") + # ------------------------------- # Función: Limpiar imágenes huérfanas # ------------------------------- diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..051b1bb --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -x # Activa el modo de depuración para ver cada comando ejecutado + +echo "[DEBUG] Iniciando entrypoint.sh" + +# Configurar Code-Server +CONFIG_DIR="/root/.local/share/code-server/User" +SETTINGS_FILE="$CONFIG_DIR/settings.json" + +echo "[DEBUG] Creando directorio de configuración Code-Server en $CONFIG_DIR" +mkdir -p "$CONFIG_DIR" + +echo "[INFO] Configurando Code-Server con tema oscuro y AutoSave desactivado..." +cat > "$SETTINGS_FILE" < 0: + with open(CONTAINER_DATA_FILE, 'r') as file: + try: + data = json.load(file) # Cargar datos existentes + # Verificar si el puerto ya está en uso en los datos existentes + for container in data: + for port_map in container['ports']: + if port_map['host_port'] == port: + return False # Puerto en uso + except json.JSONDecodeError: + pass # Si hay error al leer, continuar con la comprobación de nmap + # Ejecuta nmap para comprobar si el puerto está abierto command = f"nmap -p {port} 127.0.0.1" print(f"[INFO] Ejecutando nmap para el puerto {port}...") @@ -111,7 +125,8 @@ services: restart: always tty: true volumes: - - ./app:/app + - ./share:/app/share + - ./d_apps/{container_name}:/app/host_transfer ports: {custom_ports_yaml} command: tail -f /dev/null # Mantener activo el contenedor diff --git a/share/components/GrapeStudio.jsx b/share/components/GrapeStudio.jsx new file mode 100644 index 0000000..16feec6 --- /dev/null +++ b/share/components/GrapeStudio.jsx @@ -0,0 +1,30 @@ +import StudioEditor from '@grapesjs/studio-sdk/react'; +import '@grapesjs/studio-sdk/style'; + +// ... +My email' + }, + ] + }, + }, + i18n: { + locales: { + en: { + actions: { + importCode: { + content: 'Paste here your MJML code and click Import' + } + } + } + } + } + }} +/> \ No newline at end of file diff --git a/share/components/qrgenerator.tsx b/share/components/qrgenerator.tsx new file mode 100644 index 0000000..3fb5548 --- /dev/null +++ b/share/components/qrgenerator.tsx @@ -0,0 +1,50 @@ +import { useState } from 'react'; +import { Container, Card, TextInput, Title, Group } from '@mantine/core'; +import { Textarea } from '@mantine/core'; + +import { QRCodeCanvas } from 'qrcode.react'; + +export default function QRCodeGenerator() { + const [text, setText] = useState(''); + + return ( + + + + + Generador de QR + + + {/* Input de texto */} +