Docker
Esta guía asume que tiene nociones en los siguientes temas:
¿Por qué Docker?
Docker proporciona un entorno consistente que garantiza el correcto funcionamiento de cualquier bot tanto en desarrollo como en producción, además de simplificar el flujo de trabajo mediante la integración con herramientas de CI/CD.
Con Docker escalar un bot horizontalmente es sencillo, permitiendo distribuir la carga de trabajo entre múltiples instancias en caso de ser necesario.
¿Qué archivos necesita un proyecto de Seyfert?
package.json
seyfert.config.mjs
/node_modules
/src
o/dist
Desplegando con Node.js
Imagen para un proyecto TypeScript
Una imagen sencilla para desplegar un bot sería la siguiente:
FROM node:<VERSION_TAG>
WORKDIR /bot
COPY package*.json ./
RUN npm install --production
RUN npm i -g typescript
COPY tsconfig.json seyfert.config.mjs ./COPY /src ./src
# Build typescript filesRUN tsc --project tsconfig.json
ENV NODE_ENV=production
ENTRYPOINT ["node", "dist/index.js"]
Debe reemplazar <VERSION_TAG>
por la versión de Node.js que quiera utilizar.
Imagen con multi-stage builds
Pese a que la anterior imagen es sencilla y práctica, todavía puede mejorarse añadiendo multi-stage builds y otras buenas prácticas:
# [ base ] #FROM node:<VERSION_TAG>-alpine AS base
ENV DIR /botWORKDIR $DIR
# [ OS packages ] #FROM base AS pkg
RUN apk update && apk add --no-cache dumb-init
# [ project builder ] #FROM base AS build
COPY package*.json ./
## Ref: https://docs.npmjs.com/cli/v10/commands/npm-ciRUN npm ci## Ref: https://docs.npmjs.com/cli/v10/commands/npm-pruneRUN npm prune --production
RUN npm i -g typescript
COPY tsconfig.json seyfert.config.mjs ./COPY /src ./src
## Build typescriptRUN tsc --project tsconfig.json
# [ production ready ] #FROM base AS production
# Joining stages## PackagesCOPY --from=pkg /usr/bin/dumb-init /usr/bin/dumb-init## DependenciesCOPY --from=build $DIR/node_modules ./node_modules## BuilderCOPY --from=build $DIR/dist ./distCOPY --from=build $DIR/package.json ./package.jsonCOPY --from=build $DIR/seyfert.config.js ./seyfert.config.js
# Environment permissionsENV NODE_ENV production## Remove if your project needs root permissionsENV USER nodeUSER $USER
# Run the applicationENTRYPOINT ["dumb-init", "node", "dist/index.js"]