Despliegue

Docker

El proyecto está diseñado para distribuirse como una imagen de Docker, de tal forma que se pueda desplegar en cualquier sistema preparado para la ejecución de contenedores.

La imagen de Docker estará disponible en:

registry.dekaside.com/nftaas/nftaas-backend

Backend

Para ejecutar la imagen de tal forma que sea corresponda con el servidor HTTP para el API RESTful se tendría que especificar el comando /start. Por defecto, el servicio se expone en el puerto 5000.

Un ejemplo de servicio sería:

services:
  backend: &backend
  image: registry.dekaside.com/nftaas/nftaas-backend:latest
  command: /start
  depends_on:
    - redis
  networks:
    - nftaas
  env_file:
    - ./.env
  deploy:
    update_config:
      order: start-first
      failure_action: rollback
      delay: 10s
    rollback_config:
      parallelism: 0
      order: stop-first
    restart_policy:
      condition: any
      delay: 5s
      max_attempts: 3
      window: 120s
  healthcheck:
    test: curl --fail http://localhost:5000/proxy-health || exit 1
    interval: 60s
    retries: 5
    timeout: 10s

Las variables de entorno en este caso se definen en un fichero .env, siguiendo la lista de variables disponibles que se detallan en la sección de configuración.

Es recomendable que por encima de este servicio se establezca un proxy, por ejemplo nginx. Para simplificar este caso, se recomienda usar la imagen de Docker pública dekalabs/nginx:latest

Un ejemplo de servicio podría ser:

backend-proxy:
  image: dekalabs/nginx:latest
  environment:
    - NGINX_UPSTREAM_APP=app
    - NGINX_UPSTREAM_SERVER=backend
    - NGINX_UPSTREAM_PORT=5000
    - NGINX_PORT=80
    - NGINX_HOST=backend.nftaas.staging.dekaside.com
    - NGINX_MAX_BODY_SIZE=20M
  depends_on:
    - backend
  networks:
    - traefik-public
    - nftaas
  deploy:
    update_config:
      order: start-first
      failure_action: rollback
      delay: 10s
    rollback_config:
      parallelism: 0
      order: stop-first
    restart_policy:
      condition: any
      delay: 5s
      max_attempts: 3
      window: 120s
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik-public
      - traefik.constraint-label=traefik-public
      - traefik.http.routers.nftaas-backend-http.rule=Host(`backend.nftaas.staging.dekaside.com`)
      - traefik.http.routers.nftaas-backend-http.entrypoints=http
      - traefik.http.routers.nftaas-backend-http.middlewares=https-redirect
      - traefik.http.routers.nftaas-backend-https.rule=Host(`backend.nftaas.staging.dekaside.com`)
      - traefik.http.routers.nftaas-backend-https.entrypoints=https
      - traefik.http.routers.nftaas-backend-https.tls=true
      - traefik.http.routers.nftaas-backend-https.tls.certresolver=le
      - traefik.http.services.nftaas-backend-https.loadbalancer.server.port=80
  healthcheck:
    test: curl --fail http://localhost/proxy-health || exit 1
    interval: 60s
    retries: 5
    timeout: 10s

Note

Este ejemplo está extraído de una integración con Traefik, pero es completamente opcional y puede ser ignorada.

Worker asíncrono

El worker asíncrono basado en Celery puede ser ejecutado a partir de la misma imagen de Docker que el backend. El comando para arrancar el worker es /start-celeryworker.

Un ejemplo de servicio, partiendo de la definición de backend hecha anteriormente, sería:

celeryworker:
  <<: *backend
  command: /start-celeryworker
  healthcheck:
    test: /entrypoint celery -A nftaas.taskapp inspect ping
    interval: 30s
    retries: 5
    timeout: 5s

Tareas programadas

Para ejecutar tareas programadas se necesita de un servicio que se basa en Celery Beat. El comando para arrancar el worker es /start-celeryworker, de nuevo, partiendo de la misma imagen de backend.

Un ejemplo de servicio, partiendo de la definición de backend hecha anteriormente, sería:

celerybeat:
  <<: *backend
  command: /start-celerybeat
  healthcheck:
    test: /entrypoint celery -A nftaas.taskapp inspect ping
    interval: 30s
    retries: 5
    timeout: 5s