{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/es/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Implementación del servidor Linux"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"implementación-del-servidor-linux","__idx":0},"children":["Implementación del servidor Linux"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implemente MoreLogin en un servidor Ubuntu sin cabeza y automatice los perfiles del navegador a través de la API local, sin necesidad de un entorno de escritorio."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"lo-que-lograrás","__idx":1},"children":["Lo que lograrás"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Al final de esta guía tendrás:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Una instancia de MoreLogin en ejecución en un servidor sin cabeza Ubuntu 24.04"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reenvío de red configurado para que las máquinas externas puedan conectarse a través de CDP (Protocolo Chrome DevTools)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Un script de automatización de Python funcional que crea, inicia, controla y limpia perfiles del navegador."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"descripción-general-de-la-arquitectura","__idx":2},"children":["Descripción general de la arquitectura"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"┌──────────────────────────────────────────────────────────┐\n│                    Ubuntu 24.04 Server                   │\n│                                                          │\n│  ┌──────────────┐    ┌───────────────────────────────┐   │\n│  │   xvfb       │───▶│  MoreLogin AppImage           │   │\n│  │ (virtual     │    │  Local API :40000             │   │\n│  │  display)    │    │  CDP debug :<dynamic>         │   │\n│  │              │    │    (127.0.0.1, per profile)   │   │\n│  └──────────────┘    └───────────────────────────────┘   │\n│                              │                           │\n│                        socat forwarding                  │\n│                              │                           │\n│                     0.0.0.0:40001 → 127.0.0.1:40000      │\n│                     0.0.0.0:<N+1> → 127.0.0.1:<N>        │\n└──────────────────────────────────────────────────────────┘\n                               │\n                          External machine\n                     (Playwright / Puppeteer / Selenium)\n"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","El puerto de depuración de CDP es ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["dinámico"]},": cada perfil de navegador tiene su propio puerto, devuelto por el punto final ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/start"]},". El diagrama anterior utiliza ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<N>"]}," como marcador de posición."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"requisitos-previos","__idx":3},"children":["Requisitos previos"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Requisito"},"children":["Requisito"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Detalles"},"children":["Detalles"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sistema operativo"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Servidor Ubuntu 24.04 (x86_64)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Especificaciones recomendadas"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["8 vCPU, 8 GB de RAM (admite ~5 perfiles simultáneos)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Red"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Acceso a Internet saliente; abra el puerto de entrada ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["40001"]}," y los puertos CDP reenviados que elija, o utilice túneles SSH en su lugar"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Python"]}," (opcional)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Python 3.8+ con ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pip"]}," para ejecutar el script de ejemplo"]}]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"paso-1-instalar-las-dependencias-del-sistema","__idx":4},"children":["Paso 1: instalar las dependencias del sistema"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Conéctese a su servidor a través de SSH e instale los paquetes requeridos:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# FUSE support (required for AppImage)\nsudo apt install -y libfuse2t64\n\n# GTK / accessibility / display libraries\nsudo apt install -y libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0\nsudo apt install -y libcups2\nsudo apt install -y libgtk-3-0 libgdk-pixbuf2.0-0\nsudo apt install -y libgbm1 libxkbcommon0 libasound2t64\n\n# Virtual framebuffer (headless display)\nsudo apt install -y xvfb\n\n# TCP forwarder\nsudo apt install -y socat\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"instalar-fuentes-opcional","__idx":5},"children":["Instalar fuentes (opcional)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Si las páginas del navegador se muestran sin texto o muestran caracteres faltantes, instale los paquetes de fuentes correspondientes:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# CJK (Chinese, Japanese, Korean)\nsudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra\n\n# Arabic\nsudo apt install -y fonts-noto-color-emoji fonts-noto-extra\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Para otros idiomas, instale el paquete ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://fonts.google.com/noto"},"children":["familia de fuentes Noto"]}," correspondiente."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"paso-2-descargar-y-ejecutar-másiniciar-sesión","__idx":6},"children":["Paso 2: Descargar y ejecutar MásIniciar sesión"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"21-descargar-la-appimage","__idx":7},"children":["2.1 Descargar la AppImage"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"wget https://get.morelogin.com/client/prod/linux/x64/2.54.0/MoreLogin_x86_64_2.54.0.AppImage\nchmod +x MoreLogin_x86_64_2.54.0.AppImage\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reemplace ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2.54.0"]}," con la última versión disponible en su cuenta MoreLogin o en la ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.morelogin.com/download/"},"children":["página de descarga"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"22-comenzar-másiniciar-sesión-en-segundo-plano","__idx":8},"children":["2.2 Comenzar másIniciar sesión en segundo plano"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Utilice ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xvfb-run"]}," para proporcionar una pantalla virtual, luego ejecute AppImage:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"nohup xvfb-run -a ./MoreLogin_x86_64_2.54.0.AppImage --no-sandbox > morelogin.log 2>&1 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Verifique que haya comenzado exitosamente:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Check the process is running\nps aux | grep MoreLogin\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["El proceso puede tardar entre 5 y 10 segundos en inicializarse por completo."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"paso-3-inicie-sesión-en-morelogin-mediante-api-obligatorio","__idx":9},"children":["Paso 3: inicie sesión en MoreLogin mediante API (obligatorio)"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!CAUTION]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Debe iniciar sesión antes de llamar a cualquier otro punto final de API local."]}," En un servidor sin cabeza no hay una GUI para iniciar sesión manualmente, por lo que debe autenticarse a través de la API. Sin este paso, todas las llamadas API devolverán:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"status\": \"error\", \"code\": 401, \"message\": \"Su estado de inicio de sesión ha caducado, inicie sesión nuevamente\"}\n","lang":"json"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"31-obtenga-sus-credenciales-api","__idx":10},"children":["3.1 Obtenga sus credenciales API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Abra el cliente de escritorio MoreLogin (en cualquier máquina en la que haya iniciado sesión) y navegue hasta ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Configuración → API y MCP"]},". Copie el ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["ID de aplicación"]}," y la ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Clave de API"]}," de la sección ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Abrir API"]},":"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image.cfac9a4c31ae47e8434739e42cab4601ee08d737bba4fccba40f2f3bc78e9648.81141750.png","alt":"Más configuración de API de inicio de sesión: copie el ID de la aplicación y la clave de API de la sección Abrir API"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"32-iniciar-sesión-mediante-curl","__idx":11},"children":["3.2 Iniciar sesión mediante curl"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Llame al punto final de inicio de sesión con sus credenciales:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/user/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiId\": \"YOUR_APP_ID\",\n    \"apiKey\": \"YOUR_API_KEY\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Una respuesta exitosa se parece a:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"code\": 0, \"msg\": null, \"data\": true}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"33-verificar-el-inicio-de-sesión","__idx":12},"children":["3.3 Verificar el inicio de sesión"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Confirme que la API esté lista enumerando los perfiles del navegador:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -s -X POST http://127.0.0.1:40000/api/env/page \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"pageNo\": 1, \"pageSize\": 1}'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Una respuesta ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"code\":0, ...}"]}," significa que ha iniciado sesión y que la API está lista."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Punto de control:"]}," Su servidor MoreLogin está en pleno funcionamiento. Continúe con el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-4--configure-network-forwarding-socat"},"children":["Paso 4"]}," para obtener acceso remoto o vaya directamente al ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-5--quick-automation-example"},"children":["Paso 5"]}," si ejecuta scripts en el mismo servidor."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","La sesión de inicio de sesión persiste mientras se esté ejecutando el proceso MoreLogin. Si reinicia AppImage, deberá iniciar sesión nuevamente."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"paso-4-configurar-el-reenvío-de-red-socat","__idx":13},"children":["Paso 4: configurar el reenvío de red (socat)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["De forma predeterminada, tanto la API local (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":40000"]},") como los puertos de depuración del CDP se vinculan a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]},". Si necesita acceder a ellos desde una máquina externa (por ejemplo, su computadora portátil de desarrollo), use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["socat"]}," para reenviar el tráfico."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!WARNING]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Riesgo de seguridad: no exponga estos puertos a la Internet pública."]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["La API local ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["no tiene autenticación integrada"]}," para la mayoría de los puntos finales."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Un puerto de depuración CDP otorga ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["control remoto total"]}," de la instancia del navegador (leer cookies, inyectar scripts, capturar capturas de pantalla)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Recomendaciones:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Utilice un ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["túnel SSH"]}," en lugar de socat para acceso remoto: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ssh -L 40000:127.0.0.1:40000 user@server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Si debe usar socat, restrinja el acceso con reglas de firewall a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IP específicas únicamente"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Utilice una ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["VPN"]}," o grupos de seguridad de proveedores de nube para limitar el tráfico entrante"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Nunca"]}," abra los puertos ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["40001"]},"/CDP a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0.0.0.0"]}," en un servidor público sin restricciones de IP"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"41-reenviar-el-puerto-api-local","__idx":14},"children":["4.1 Reenviar el puerto API local"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"nohup socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Las máquinas externas ahora pueden acceder a la API en ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://<server-ip>:40001"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"42-puertos-de-depuración-cdp-directos","__idx":15},"children":["4.2 Puertos de depuración CDP directos"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cuando inicia un perfil de navegador a través de la API, la respuesta incluye un ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["dinámico"]}," (por ejemplo, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["9222"]},"). Cada perfil puede recibir un puerto diferente. Reenvíelo para que las herramientas de automatización externas (Playwright, Puppeteer, Selenium) puedan conectarse:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Example: if debugPort=9222, forward to external port 9223 (debugPort + 1)\n# Adjust both ports to match the actual debugPort returned by /api/env/start\nnohup socat TCP-LISTEN:9223,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9222 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!WARNING]"," ","Cuando ejecute varios perfiles simultáneamente, asegúrese de que los puertos reenviados no choquen con los puertos de depuración de otros perfiles. Por ejemplo, si el perfil A obtiene ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort=9222"]}," y usted reenvía a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["9223"]},", pero el perfil B recibe ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort=9223"]},", habrá un conflicto de puerto. Considere utilizar un desplazamiento mayor o un rango de puertos dedicado."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","En producción, cree el reenvío socat ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["dinámicamente"]}," después de cada llamada ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/start"]},", utilizando el ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]}," devuelto. Consulte el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#52-create--start--automate--cleanup"},"children":["ejemplo de Python"]}," para ver una implementación funcional."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Si ejecuta scripts de automatización ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["en el mismo servidor"]},", puede omitir socat y conectarse directamente a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"43-abrir-puertos-de-firewall","__idx":16},"children":["4.3 Abrir puertos de firewall"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Si usa socat, restrinja el acceso solo a direcciones IP confiables:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Allow only a specific IP (recommended)\nsudo ufw allow from <YOUR_IP> to any port 40001 proto tcp\nsudo ufw allow from <YOUR_IP> to any port 9223 proto tcp\n\n# Or allow from any IP (NOT recommended for production)\n# sudo ufw allow 40001/tcp\n# sudo ufw allow 9223/tcp\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"44-recomendado-utilice-el-túnel-ssh-en-su-lugar","__idx":17},"children":["4.4 Recomendado: utilice el túnel SSH en su lugar"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Para obtener el acceso remoto más seguro, utilice un túnel SSH: no se necesitan cambios en el firewall ni socat."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Debido a que el puerto CDP es ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["dinámico"]}," (asignado cuando inicia un perfil), el flujo de trabajo es:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Primero canalice el puerto API:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Run this on your local machine\nssh -L 40000:127.0.0.1:40000 user@<server-ip>\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inicie el perfil"]}," a través de la API tunelizada (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://127.0.0.1:40000/api/env/start"]},") y lea el ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]}," devuelto."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Abrir un segundo túnel para el puerto CDP:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Replace <debugPort> with the actual port returned by the API\nssh -L <debugPort>:127.0.0.1:<debugPort> user@<server-ip>\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Conéctate"]}," a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://127.0.0.1:<debugPort>"]}," desde tus scripts locales de Playwright/Puppeteer como si el servidor fuera local."]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Puede combinar ambos túneles en un comando si conoce el rango de puertos de antemano, por ejemplo:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"golpecito","header":{"controls":{"copy":{}}},"source":"ssh -L 40000:127.0.0.1:40000 -L 9222:127.0.0.1:9222 -L 9223:127.0.0.1:9223 usuario@<ip-servidor>\n","lang":"golpecito"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Pero en la práctica es más fácil iniciar primero el túnel API y luego agregar túneles por perfil según sea necesario."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"paso-5-ejemplo-de-automatización-rápida","__idx":18},"children":["Paso 5: ejemplo de automatización rápida"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A continuación se muestra un ejemplo mínimo de Python que muestra el ciclo de vida completo de un perfil de navegador. Para obtener el script completo listo para producción con simultaneidad y manejo de errores, consulte el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py"},"children":["ejemplo completo en GitHub"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"51-instalar-dependencias-de-python","__idx":19},"children":["5.1 Instalar dependencias de Python"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"pip install requests playwright\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Playwright se utiliza aquí solo para su cliente CDP (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["connect_over_cdp"]},"). ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No"]}," es necesario ejecutar ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["playwright install"]},": MoreLogin proporciona su propio navegador."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"52-configurar---no-sandbox-para-perfiles-de-navegador-obligatorio-en-linux","__idx":20},"children":["5.2 Configurar ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," para Perfiles de Navegador (Obligatorio en Linux)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["En Linux Server, el motor del navegador ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["debe"]}," ejecutarse con la bandera ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]},". Este parámetro se pasa a través del campo ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," al crear o actualizar un perfil de navegador."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!CAUTION]"," ","Sin ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]},", el navegador no podrá iniciarse en la mayoría de los entornos de servidor Linux (especialmente al ejecutar como ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["root"]}," o sin una sesión de escritorio completa)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"nuevos-perfiles--incluir-startupparams-en-la-creación","__idx":21},"children":["Nuevos perfiles — incluir ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," en la creación"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/advanced"]}," para crear un perfil con ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," (el endpoint ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["no soporta"]}," este campo):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/env/create/advanced \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"browserTypeId\": 1,\n    \"operatorSystemId\": 5,\n    \"startupParams\": [\"--no-sandbox\"]\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Si usó ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]}," para crear el perfil, llame a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/update"]}," para agregar ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," antes de iniciarlo — vea a continuación."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"perfiles-existentes--actualizar-mediante-apienvupdate","__idx":22},"children":["Perfiles existentes — actualizar mediante ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/update"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Si ya tiene perfiles de navegador creados sin ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]},", actualícelos antes de iniciar:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/env/update \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"envId\": \"YOUR_ENV_ID\",\n    \"startupParams\": [\"--no-sandbox\"]\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","El campo ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," acepta un array de strings. También puede incluir otras banderas de Chrome (por ejemplo, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"--no-sandbox\", \"--disable-gpu\"]"]},"). La bandera ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," solo es necesaria en Linux — los perfiles de Windows y macOS no la necesitan."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"53-crear--iniciar--automatizar--limpiar","__idx":23},"children":["5.3 Crear → Iniciar → Automatizar → Limpiar"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Este ejemplo supone que el script se ejecuta ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["en el mismo servidor"]}," que MoreLogin. Para escenarios remotos, consulte las notas después del código."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"import requests\nfrom playwright.sync_api import sync_playwright\n\n# ── Configuration ──────────────────────────────────────────\n# Local:  script runs on the SAME server as MoreLogin\n# Remote: script runs on a DIFFERENT machine — see notes below\nAPI_BASE  = \"http://127.0.0.1:40000\"\n\n\n# ① Create a browser profile\nresp = requests.post(f\"{API_BASE}/api/env/create/quick\", json={\n    \"browserTypeId\": 1,\n    \"operatorSystemId\": 5,\n    \"quantity\": 1\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Create failed: {resp_data}\"\nenv_id = resp_data[\"data\"][\"envIds\"][0]\nprint(f\"✅ Created profile: {env_id}\")\n\n\n# ①-b Add --no-sandbox (required on Linux Server)\nresp = requests.post(f\"{API_BASE}/api/env/update\", json={\n    \"envId\": env_id,\n    \"startupParams\": [\"--no-sandbox\"]\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Update failed: {resp_data}\"\nprint(f\"✅ Set --no-sandbox for profile: {env_id}\")\n\n\n# ② Start the profile (headless)\nresp = requests.post(f\"{API_BASE}/api/env/start\", json={\n    \"envId\": env_id\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Start failed: {resp_data}\"\ndebug_port = resp_data[\"data\"][\"debugPort\"]   # Dynamic — different for each profile\nprint(f\"✅ Started — debug port: {debug_port}\")\n\n\n# ③ Build the CDP URL\ncdp_url = f\"http://127.0.0.1:{debug_port}\"\n\n\n# ④ Connect via CDP and automate\nwith sync_playwright() as p:\n    browser = p.chromium.connect_over_cdp(cdp_url)\n    page = browser.contexts[0].pages[0]\n    page.goto(\"https://www.google.com\")\n    page.screenshot(path=f\"screenshot_{env_id}.png\")\n    print(f\"✅ Screenshot saved\")\n    # Use disconnect() — not close() — to detach without killing the browser.\n    # The profile will be stopped cleanly via the API in step ⑤.\n    browser.disconnect()\n\n\n# ⑤ Stop the profile\nrequests.post(f\"{API_BASE}/api/env/close\", json={\"envId\": env_id})\nprint(f\"✅ Profile stopped\")\n\n\n# ⑥ Delete the profile\nrequests.post(f\"{API_BASE}/api/env/remove\", json={\"envIds\": [env_id]})\nprint(f\"✅ Profile deleted\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["¿Se ejecuta desde una máquina remota?"]}," Dos enfoques:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Opción A: túnel SSH (recomendado):"]}," ","Configure túneles SSH desde su máquina local al servidor (consulte ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#44-recommended-use-ssh-tunnel-instead"},"children":["§ 4.4"]},"), luego mantenga ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API_BASE = \"http://127.0.0.1:40000\""]}," y ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cdp_url = f\"http://127.0.0.1:{debug_port}\""]},": SSH hace que los puertos remotos parezcan locales."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Opción B: socat en el servidor:"]}," ","En el ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["servidor"]},", inicie el reenvío socat para el puerto API y para cada puerto CDP:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"golpecito","header":{"controls":{"copy":{}}},"source":"# Ejecútelos en el SERVIDOR, no en su máquina local\nsocat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &\nsocat TCP-LISTEN:$((debug_port+1)),fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:$debug_port &\n","lang":"golpecito"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Luego, en su secuencia de comandos, configure ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API_BASE = \"http://<server-ip>:40001\""]}," y ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cdp_url = f\"http://<server-ip>:{debug_port + 1}\""]},"."," ","⚠️ Restringir el acceso con reglas de firewall: consulte ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#43-open-firewall-ports"},"children":["§ 4.3"]},"."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!IMPORTANT]"," ","La estructura ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resp.json()[\"data\"][\"envIds\"]"]}," coincide con el formato de respuesta ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]}," actual. Si encuentra una forma diferente (por ejemplo, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data: [\"id1\", ...]"]},"), consulte la ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/es/api-reference/browser"},"children":["Referencia de API"]}," para su versión; los formatos de respuesta pueden variar según la versión."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"punto-de-referencia-de-rendimiento","__idx":24},"children":["Punto de referencia de rendimiento"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Se obtuvieron los siguientes resultados en una máquina virtual de servidor Ubuntu 24.04 (8 vCPU, 8 GB de RAM) utilizando el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py"},"children":["script de prueba de esfuerzo completo"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Métrica"},"children":["Métrica"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Valor"},"children":["Valor"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ejecuciones totales"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["100"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Simultaneidad"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4 (simultáneo)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tasa de éxito"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["100,0%"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tiempo total"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["604,06 segundos"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tiempo promedio por tarea"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["6,04 segundos"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Rendimiento"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["0,17 tareas/s"]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Estos números sirven como punto de referencia. El rendimiento real depende de las especificaciones del servidor, las condiciones de la red y la complejidad de la página."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"implementación-de-producción-systemd","__idx":25},"children":["Implementación de producción (systemd)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Para servidores de producción, ejecute MoreLogin como un ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["servicio systemd"]}," para obtener un inicio automático al arrancar, reiniciar en caso de falla y un registro centralizado."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"crear-el-archivo-de-servicio","__idx":26},"children":["Crear el archivo de servicio"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo tee /etc/systemd/system/morelogin.service > /dev/null <<'EOF'\n[Unit]\nDescription=MoreLogin Browser (headless)\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=root\nWorkingDirectory=/opt/morelogin\nExecStart=/usr/bin/xvfb-run -a /opt/morelogin/MoreLogin_x86_64_2.54.0.AppImage --no-sandbox\nRestart=on-failure\nRestartSec=10\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=multi-user.target\nEOF\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ajuste las rutas ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WorkingDirectory"]}," y ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExecStart"]}," para que coincidan con el lugar donde colocó la AppImage."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Para producción, considere crear un usuario dedicado (por ejemplo, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["morelogin"]},") en lugar de ejecutarlo como ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["root"]}," y ajuste la propiedad y los permisos del archivo en consecuencia. Si AppImage actualmente requiere privilegios de root, puede conservar ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["User=root"]},", pero aislar el proceso en una cuenta que no sea root es una buena práctica."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"habilitar-e-iniciar","__idx":27},"children":["Habilitar e iniciar"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo systemctl daemon-reload\nsudo systemctl enable morelogin    # Auto-start on boot\nsudo systemctl start morelogin     # Start now\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"gestionar-el-servicio","__idx":28},"children":["Gestionar el servicio"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo systemctl status morelogin    # Check status\nsudo journalctl -u morelogin -f    # Stream logs\nsudo systemctl restart morelogin   # Restart\nsudo systemctl stop morelogin      # Stop\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","Después de reiniciar, debe volver a llamar al ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#32-log-in-via-curl"},"children":["punto final de inicio de sesión"]},"; la sesión API no sobrevive a los reinicios del proceso. Para una recuperación automatizada, considere agregar un script ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExecStartPost"]}," o un trabajo cron de verificación de estado que llame al punto final de inicio de sesión después de que se inicie el servicio."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"solución-de-problemas","__idx":29},"children":["Solución de problemas"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"másel-inicio-de-sesión-no-puede-iniciarse","__idx":30},"children":["MásEl inicio de sesión no puede iniciarse"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"AppImages require FUSE to run.\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Solución:"]}," Instalar soporte FUSE:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo apt install -y libfuse2t64\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"las-páginas-del-navegador-muestran-texto-en-blanco-o-caracteres-faltantes","__idx":31},"children":["Las páginas del navegador muestran texto en blanco o caracteres faltantes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Solución:"]}," Instale el paquete de fuentes para el idioma de destino (consulte ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#install-fonts-optional"},"children":["Paso 1: Instalar fuentes"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conexión-cdp-rechazada-desde-una-máquina-externa","__idx":32},"children":["Conexión CDP rechazada desde una máquina externa"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Causa:"]}," Los puertos de depuración de CDP se vinculan a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]}," de forma predeterminada."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Solución:"]}," Configure el reenvío socat (consulte el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-4--configure-network-forwarding-socat"},"children":["Paso 4"]},") y asegúrese de que las reglas del firewall permitan el puerto reenviado."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"curl-a-la-api-local-devuelve-conexión-rechazada","__idx":33},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," a la API local devuelve \"Conexión rechazada\""]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Causa:"]}," MoreLogin aún no ha terminado de iniciarse o el proceso falló."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Arreglo:"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Espere de 5 a 10 segundos después del inicio"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verifique ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["morelogin.log"]}," para ver si hay errores"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verifique que el proceso se esté ejecutando: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ps aux | grep MoreLogin"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"api-devuelve-401-el-estado-de-inicio-de-sesión-ha-caducado","__idx":34},"children":["API devuelve 401 \"el estado de inicio de sesión ha caducado\""]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"status\": \"error\", \"code\": 401, \"message\": \"Your login status has expired, please log in again\"}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Causa:"]}," No has iniciado sesión a través de la API o se reinició el proceso MoreLogin."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Solución:"]}," Llame al punto final de inicio de sesión antes de cualquier otra llamada API (consulte el ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-3--log-in-to-morelogin-via-api-required"},"children":["Paso 3"]},")."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"próximos-pasos","__idx":35},"children":["Próximos pasos"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Objetivo"},"children":["Objetivo"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Enlace"},"children":["Enlace"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Referencia completa de la API del navegador"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/es/api-reference/browser"},"children":["API del navegador"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Configuración de autenticación"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/es/api-reference/getting-started/authentication"},"children":["Guía de autenticación"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Ejemplos de Playwright / Selenium / Puppeteer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/es/api-reference/examples"},"children":["Ejemplos de automatización"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Script completo de prueba de estrés de Linux"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py"},"children":["GitHub — linux_server_test.py"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Inicio rápido de CLI"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/es/cli/quick-start"},"children":["Guía CLI"]}]}]}]}]}]}]},"headings":[{"value":"Implementación del servidor Linux","id":"implementación-del-servidor-linux","depth":1},{"value":"Lo que lograrás","id":"lo-que-lograrás","depth":2},{"value":"Descripción general de la arquitectura","id":"descripción-general-de-la-arquitectura","depth":2},{"value":"Requisitos previos","id":"requisitos-previos","depth":2},{"value":"Paso 1: instalar las dependencias del sistema","id":"paso-1-instalar-las-dependencias-del-sistema","depth":2},{"value":"Instalar fuentes (opcional)","id":"instalar-fuentes-opcional","depth":3},{"value":"Paso 2: Descargar y ejecutar MásIniciar sesión","id":"paso-2-descargar-y-ejecutar-másiniciar-sesión","depth":2},{"value":"2.1 Descargar la AppImage","id":"21-descargar-la-appimage","depth":3},{"value":"2.2 Comenzar másIniciar sesión en segundo plano","id":"22-comenzar-másiniciar-sesión-en-segundo-plano","depth":3},{"value":"Paso 3: inicie sesión en MoreLogin mediante API (obligatorio)","id":"paso-3-inicie-sesión-en-morelogin-mediante-api-obligatorio","depth":2},{"value":"3.1 Obtenga sus credenciales API","id":"31-obtenga-sus-credenciales-api","depth":3},{"value":"3.2 Iniciar sesión mediante curl","id":"32-iniciar-sesión-mediante-curl","depth":3},{"value":"3.3 Verificar el inicio de sesión","id":"33-verificar-el-inicio-de-sesión","depth":3},{"value":"Paso 4: configurar el reenvío de red (socat)","id":"paso-4-configurar-el-reenvío-de-red-socat","depth":2},{"value":"4.1 Reenviar el puerto API local","id":"41-reenviar-el-puerto-api-local","depth":3},{"value":"4.2 Puertos de depuración CDP directos","id":"42-puertos-de-depuración-cdp-directos","depth":3},{"value":"4.3 Abrir puertos de firewall","id":"43-abrir-puertos-de-firewall","depth":3},{"value":"4.4 Recomendado: utilice el túnel SSH en su lugar","id":"44-recomendado-utilice-el-túnel-ssh-en-su-lugar","depth":3},{"value":"Paso 5: ejemplo de automatización rápida","id":"paso-5-ejemplo-de-automatización-rápida","depth":2},{"value":"5.1 Instalar dependencias de Python","id":"51-instalar-dependencias-de-python","depth":3},{"value":"5.2 Configurar --no-sandbox para Perfiles de Navegador (Obligatorio en Linux)","id":"52-configurar---no-sandbox-para-perfiles-de-navegador-obligatorio-en-linux","depth":3},{"value":"Nuevos perfiles — incluir startupParams en la creación","id":"nuevos-perfiles--incluir-startupparams-en-la-creación","depth":4},{"value":"Perfiles existentes — actualizar mediante /api/env/update","id":"perfiles-existentes--actualizar-mediante-apienvupdate","depth":4},{"value":"5.3 Crear → Iniciar → Automatizar → Limpiar","id":"53-crear--iniciar--automatizar--limpiar","depth":3},{"value":"Punto de referencia de rendimiento","id":"punto-de-referencia-de-rendimiento","depth":2},{"value":"Implementación de producción (systemd)","id":"implementación-de-producción-systemd","depth":2},{"value":"Crear el archivo de servicio","id":"crear-el-archivo-de-servicio","depth":3},{"value":"Habilitar e iniciar","id":"habilitar-e-iniciar","depth":3},{"value":"Gestionar el servicio","id":"gestionar-el-servicio","depth":3},{"value":"Solución de problemas","id":"solución-de-problemas","depth":2},{"value":"MásEl inicio de sesión no puede iniciarse","id":"másel-inicio-de-sesión-no-puede-iniciarse","depth":3},{"value":"Las páginas del navegador muestran texto en blanco o caracteres faltantes","id":"las-páginas-del-navegador-muestran-texto-en-blanco-o-caracteres-faltantes","depth":3},{"value":"Conexión CDP rechazada desde una máquina externa","id":"conexión-cdp-rechazada-desde-una-máquina-externa","depth":3},{"value":"curl a la API local devuelve \"Conexión rechazada\"","id":"curl-a-la-api-local-devuelve-conexión-rechazada","depth":3},{"value":"API devuelve 401 \"el estado de inicio de sesión ha caducado\"","id":"api-devuelve-401-el-estado-de-inicio-de-sesión-ha-caducado","depth":3},{"value":"Próximos pasos","id":"próximos-pasos","depth":2}],"frontmatter":{"seo":{"title":"Implementación del servidor Linux"}},"lastModified":"2026-07-13T14:51:02.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/es/linux-server/overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}