Descripción General

Esta guía lo lleva a través de la implementación de CaseBender en DigitalOcean utilizando App Platform, Managed Databases y Spaces para almacenamiento.

Prerrequisitos

  1. Cuenta de DigitalOcean
  2. doctl CLI instalado y configurado
  3. Docker instalado

Paso 1: Configuración Inicial

Instalar y Configurar doctl CLI

# Usando Homebrew
brew install doctl

# Autenticar con DigitalOcean

doctl auth init

Paso 2: Configurar Almacenamiento

Crear un Espacio (Space)

# Crear un nuevo espacio
doctl spaces create casebender-storage --region nyc3

# Crear una clave de acceso para Spaces
doctl spaces access-keys create --name casebender-key

Anote la clave de acceso y la clave secreta que se muestran, las necesitará más adelante.

Paso 3: Configurar Base de Datos

Crear Clúster de PostgreSQL

# Crear un clúster de PostgreSQL
doctl databases create casebender-db --engine pg --region nyc1 --size db-s-1vcpu-1gb --num-nodes 1 --version 13

# Obtener información de conexión
doctl databases connection casebender-db --format Host,Port,User,Password,Database

# Crear una base de datos para CaseBender
doctl databases db create casebender-db casebender

Crear Clúster de Redis

# Crear un clúster de Redis
doctl databases create casebender-redis --engine redis --region nyc1 --size db-s-1vcpu-1gb --num-nodes 1

# Obtener información de conexión
doctl databases connection casebender-redis --format Host,Port,Password

Paso 4: Configurar Container Registry

# Crear un registro de contenedores
doctl registry create casebender-registry

# Iniciar sesión en el registro
doctl registry login

Paso 5: Preparar Imágenes de Docker

# Extraer imágenes de CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# Etiquetar imágenes para el registro de DigitalOcean
docker tag casebender/casebender:latest registry.digitalocean.com/casebender-registry/app:latest
docker tag casebender/workflow-processor:latest registry.digitalocean.com/casebender-registry/workflow-processor:latest
docker tag casebender/misp-processor:latest registry.digitalocean.com/casebender-registry/misp-processor:latest

# Subir imágenes al registro
docker push registry.digitalocean.com/casebender-registry/app:latest
docker push registry.digitalocean.com/casebender-registry/workflow-processor:latest
docker push registry.digitalocean.com/casebender-registry/misp-processor:latest

Paso 6: Crear Aplicación en App Platform

Crear archivo de especificación

Cree un archivo app.yaml con el siguiente contenido:

name: casebender
region: nyc
services:
  - name: casebender-app
    github:
      repo: your-github-repo
      branch: main
      deploy_on_push: true
    source_dir: /
    dockerfile_path: Dockerfile
    http_port: 3000
    instance_count: 2
    instance_size_slug: basic-xxs
    routes:
      - path: /
    envs:
      - key: POSTGRES_PRISMA_URL
        value: ${casebender-db.DATABASE_URL}
        type: SECRET
      - key: REDIS_URL
        value: ${casebender-redis.DATABASE_URL}
        type: SECRET
      - key: SPACES_KEY
        value: your-spaces-key
        type: SECRET
      - key: SPACES_SECRET
        value: your-spaces-secret
        type: SECRET
      - key: SPACES_ENDPOINT
        value: nyc3.digitaloceanspaces.com
      - key: SPACES_BUCKET
        value: casebender-storage
      - key: NODE_ENV
        value: production

  - name: workflow-processor
    github:
      repo: your-github-repo
      branch: main
      deploy_on_push: true
    source_dir: /
    dockerfile_path: Dockerfile.workflow
    instance_count: 1
    instance_size_slug: basic-xxs
    envs:
      - key: POSTGRES_PRISMA_URL
        value: ${casebender-db.DATABASE_URL}
        type: SECRET
      - key: REDIS_URL
        value: ${casebender-redis.DATABASE_URL}
        type: SECRET
      - key: SPACES_KEY
        value: your-spaces-key
        type: SECRET
      - key: SPACES_SECRET
        value: your-spaces-secret
        type: SECRET
      - key: SPACES_ENDPOINT
        value: nyc3.digitaloceanspaces.com
      - key: SPACES_BUCKET
        value: casebender-storage
      - key: NODE_ENV
        value: production

  - name: misp-processor
    github:
      repo: your-github-repo
      branch: main
      deploy_on_push: true
    source_dir: /
    dockerfile_path: Dockerfile.misp
    instance_count: 1
    instance_size_slug: basic-xxs
    envs:
      - key: POSTGRES_PRISMA_URL
        value: ${casebender-db.DATABASE_URL}
        type: SECRET
      - key: REDIS_URL
        value: ${casebender-redis.DATABASE_URL}
        type: SECRET
      - key: SPACES_KEY
        value: your-spaces-key
        type: SECRET
      - key: SPACES_SECRET
        value: your-spaces-secret
        type: SECRET
      - key: SPACES_ENDPOINT
        value: nyc3.digitaloceanspaces.com
      - key: SPACES_BUCKET
        value: casebender-storage
      - key: NODE_ENV
        value: production

databases:
  - name: casebender-db
    engine: PG
    production: true
    cluster_name: casebender-db
    db_name: casebender
    db_user: doadmin

  - name: casebender-redis
    engine: REDIS
    production: true
    cluster_name: casebender-redis
    version: "6"

Implementar la aplicación

# Crear la aplicación desde el archivo de especificación
doctl apps create --spec app.yaml

# Obtener el ID de la aplicación
APP_ID=$(doctl apps list --format ID,Spec.Name | grep casebender | awk '{print $1}')

# Verificar el estado de la implementación
doctl apps get $APP_ID

Paso 7: Configurar Dominio Personalizado

Obtener URL de la Aplicación

# Obtener URL de la aplicación
APP_URL=$(doctl apps get $APP_ID --format DefaultIngress | grep -v DEFAULT | tr -d ' ')
echo "URL de la aplicación: $APP_URL"

Configurar Dominio Personalizado

# Agregar dominio personalizado
doctl apps tier instance list
doctl apps update $APP_ID --spec app.yaml --tier professional

# Agregar dominio
doctl apps update $APP_ID --add-domain su-dominio.com

Siga las instrucciones para configurar los registros DNS para su dominio.

Monitoreo y Mantenimiento

Monitorear la Aplicación

# Ver registros de la aplicación
doctl apps logs $APP_ID

# Ver componentes de la aplicación
doctl apps list-deployments $APP_ID

# Ver métricas de la aplicación (requiere nivel profesional)
doctl apps get $APP_ID --format ActiveDeployment.Metrics

Escalar la Aplicación

# Actualizar el número de instancias
doctl apps update $APP_ID --spec app.yaml

Edite el archivo app.yaml para cambiar instance_count o instance_size_slug según sea necesario.

Solución de Problemas

Problemas Comunes

  1. Errores de Conexión a Base de Datos:

    • Verifique las cadenas de conexión en las variables de entorno
    • Confirme que la base de datos esté en ejecución
    • Verifique que los firewalls permitan conexiones desde App Platform
  2. Problemas de Implementación:

    • Revise los registros de implementación: doctl apps logs $APP_ID --deployment
    • Verifique que las imágenes de Docker sean accesibles
    • Confirme que el Dockerfile sea válido
  3. Problemas de Rendimiento:

    • Considere aumentar el tamaño de la instancia
    • Aumente el número de instancias
    • Revise las métricas de rendimiento

Siguientes Pasos

  1. Configure copias de seguridad automáticas para la base de datos
  2. Implemente un pipeline de CI/CD con GitHub Actions
  3. Configure reglas de escalado automático
  4. Implemente DigitalOcean CDN para mejorar el rendimiento