Saltar a contenido

Prepara y sube tu bot de Discord

Tu servicio de bot de Discord ejecuta el código que subes. Zaroz se encarga del runtime, del almacenamiento persistente y de la supervisión del proceso que mantiene tu bot en línea; tú aportas los archivos fuente del bot. En esta página verás qué ocurre en cada arranque, dónde deben ir tus archivos y qué cambia entre los runtimes Node.js, Python, Bun, Deno, Java y Otro.

Cómo funciona un arranque

Cada vez que tu bot arranca (el primer inicio, un reinicio tras un fallo o un redespliegue), el contenedor hace siempre las mismas tres cosas, todas desde la carpeta de almacenamiento de tu bot:

  1. Entra en la carpeta de almacenamiento. Ahí viven tus archivos subidos y es el directorio de trabajo de todo lo demás.
  2. Ejecuta el paso de instalación de tu runtime (por ejemplo npm install en Node.js). Algunos runtimes no tienen paso de instalación; consulta Qué se ejecuta en cada runtime.
  3. Ejecuta tu comando de inicio (por ejemplo node index.js). Este es el proceso que se mantiene vivo y se conecta a Discord.

Si el proceso termina, el contenedor lo reinicia y el ciclo vuelve a empezar. Por eso una dependencia rota o un comando de inicio incorrecto se manifiestan como un bucle de fallos y no como un error puntual.

Dónde van tus archivos

Tus archivos deben estar en la carpeta raíz, no dentro de una subcarpeta.

Abre la pestaña Archivos de tu servicio para subirlos desde el navegador, o conéctate por SFTP con las credenciales que se muestran allí. En ambos casos la raíz del almacenamiento de tu bot es /, que aparece como / Home en el gestor de archivos. Tu estructura debe verse así:

/                     ← la carpeta raíz, mostrada como "/ Home"
├── index.js          ← tu archivo de entrada, directamente en la raíz
├── package.json
├── package-lock.json
└── src/
    └── ...

Por qué también puedes ver /data

Dentro del contenedor, esa misma carpeta está montada en /data, así que los registros y los mensajes de error de tu bot suelen mostrar rutas como /data/index.js. Es el mismo sitio: la raíz / de la pestaña Archivos es /data dentro del contenedor. Sube a / y tu bot lo lee como /data.

No anides tu proyecto en una subcarpeta

El paso de instalación y el comando de inicio se ejecutan en la raíz de tu almacenamiento. Si tus archivos acaban un nivel más abajo, por ejemplo /mi-bot/index.js, el comando node index.js se ejecuta en la raíz, no encuentra nada y el bot entra en un bucle de fallos.

Es uno de los problemas más habituales que vemos, y suele ocurrir cuando un .zip se extrae en una carpeta con el nombre del proyecto. Si te pasa, abre la carpeta extraída en la pestaña Archivos, selecciona todo su contenido y súbelo un nivel para que los archivos queden directamente en /.

Subir un zip

Puedes subir un .zip y extraerlo desde la pestaña Archivos. Después de extraerlo, comprueba que index.js (o tu archivo de entrada) esté en la raíz y no dentro de una carpeta anidada. No subas node_modules/: se reinstala en el servidor y solo hace la subida más lenta.

Qué se ejecuta en cada runtime

Elegiste un runtime durante la configuración. Este determina la imagen base, el paso de instalación y el comando de inicio por defecto. Puedes consultar y cambiar el runtime y el comando de inicio actuales en cualquier momento desde la pestaña Configuración.

  • Paso de instalación: npm install --if-present (se omite si no hay package.json).
  • Comando de inicio por defecto: node index.js.
  • Las dependencias provienen de tu package.json. Incluye un package-lock.json para instalaciones reproducibles.
  • Comandos de inicio alternativos habituales: npm start, node bot.js, node src/index.js.
  • Paso de instalación: pip install . cuando existe un pyproject.toml, y en caso contrario pip install -r requirements.txt.
  • Comando de inicio por defecto: python main.py.
  • Enumera todas las dependencias en requirements.txt con versiones fijadas. La caché de pip se guarda en tu volumen, así que las dependencias sin cambios no se vuelven a descargar en el siguiente arranque.
  • Comandos de inicio alternativos habituales: python bot.py, python -m bot.
  • Paso de instalación: bun install --production.
  • Comando de inicio por defecto: bun run index.js.
  • Las dependencias provienen de tu package.json.
  • Comandos de inicio alternativos habituales: bun start, bun run src/index.ts.
  • Paso de instalación: ninguno. Deno descarga y almacena en caché tus imports en la primera ejecución.
  • Comando de inicio por defecto: deno run --allow-all main.ts.
  • --allow-all es la opción fácil por defecto. Redúcelo (por ejemplo --allow-net --allow-env) cuando sepas qué permisos necesita realmente tu bot.
  • Paso de instalación: ninguno. En el servidor no hay paso de compilación, así que sube un .jar ya compilado.
  • Comando de inicio por defecto: java -jar bot.jar.
  • Renombra tu jar a bot.jar o cambia el comando de inicio en la pestaña Configuración para que coincida con tu nombre de archivo, por ejemplo java -jar mi-bot-1.0.jar.
  • Paso de instalación: ninguno automático. Marcamos start.sh como ejecutable y lo lanzamos.
  • Comando de inicio por defecto: ./start.sh.
  • Obtienes una shell simple: Alpine con la imagen Ligera y Debian con la Estándar. Instala lo que necesites desde el propio script, usando apk en Alpine o apt-get en Debian.

Versiones de los runtimes

Las versiones principales son fijas: Node 22, Python 3.13, Java 21 y las versiones actuales de Bun/Deno. La elección de compatibilidad (Ligera frente a Estándar) cambia la base del sistema operativo, no la versión del lenguaje. Consulta Elige la compatibilidad adecuada para saber cuándo escoger Estándar.

Cómo elegir tu comando de inicio

Durante la configuración eliges uno de los preajustes de cada runtime o escribes un comando personalizado. Si lo dejaste en el valor por defecto y tu archivo de entrada tiene otro nombre, el bot no arrancará.

Para cambiarlo más adelante, abre la pestaña Configuración, actualiza el comando de inicio y reinicia. El nuevo comando se aplica en el siguiente arranque.

El comando de inicio lo ejecuta una shell en la raíz de tu almacenamiento, así que la sintaxis habitual de shell funciona. Manténlo como un único proceso en primer plano que siga vivo: no lo pongas en segundo plano con &, o el contenedor pensará que el bot ha terminado y lo reiniciará.

Mantén a salvo el token de tu bot

El token de tu bot es una contraseña. Cualquiera que lo tenga puede controlar tu bot.

  • Nunca escribas el token directamente en un archivo que puedas subir a Git o compartir en un ticket de soporte.
  • Léelo desde una variable de entorno o un archivo de configuración que permanezca en el servidor.
  • Si un token queda expuesto, restablécelo de inmediato en el Portal de Desarrolladores de Discord en Bot → Reset Token y actualízalo en el servidor.

No pegues tu token en chats ni capturas de pantalla

El soporte nunca te pedirá el token de tu bot. Si necesitas ayuda, describe el error de la pestaña Consola: no hace falta que incluya el token.

Qué sobrevive a un reinicio

Todo lo que hay en tu carpeta de almacenamiento es persistente. Sobrevive a reinicios, recuperaciones tras fallos y redespliegues. Eso incluye:

  • Tus archivos fuente subidos.
  • Las dependencias instaladas (node_modules/, la caché de pip, la caché de módulos de Deno).
  • Cualquier archivo que escriba tu bot, como una base de datos SQLite o una configuración JSON.

Como las dependencias instaladas persisten, un arranque que falla a medias puede dejar un node_modules/ corrupto (o __pycache__/, un entorno virtual incompleto, etc.). Si un bot sigue fallando en la instalación después de haber corregido el problema de fondo:

  1. Abre la pestaña Archivos.
  2. Elimina node_modules/ (o el directorio dañado equivalente).
  3. Reinicia. El paso de instalación lo reconstruye desde cero.

Observa el arranque

Abre la pestaña Consola para seguir un arranque en tiempo real. Verás ejecutarse el paso de instalación, después tu comando de inicio y luego los registros de tu propio bot. Cuando algo va mal, el error está aquí: un módulo que falta, un error de sintaxis, un token inválido o un comando de inicio que apunta a un archivo inexistente.

Corrige el problema en tus archivos, reinicia y el contenedor aplicará el cambio en el siguiente arranque.

Siguientes pasos