> ## Documentation Index
> Fetch the complete documentation index at: https://docs.casebender.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Implementar en DigitalOcean

> Implemente CaseBender en DigitalOcean

## 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](https://cloud.digitalocean.com/registrations/new)
2. [doctl CLI](https://docs.digitalocean.com/reference/doctl/how-to/install/) instalado y configurado
3. [Docker](https://docs.docker.com/get-docker/) instalado

## Paso 1: Configuración Inicial

### Instalar y Configurar doctl CLI

<CodeGroup>
  ```bash macOS theme={null}
  # Usando Homebrew
  brew install doctl

  # Autenticar con DigitalOcean

  doctl auth init

  ```

  ```bash Linux theme={null}
  # Descargar la última versión
  cd ~
  wget https://github.com/digitalocean/doctl/releases/download/v1.92.0/doctl-1.92.0-linux-amd64.tar.gz

  # Extraer el archivo
  tar xf ~/doctl-1.92.0-linux-amd64.tar.gz

  # Mover el binario a su ruta
  sudo mv ~/doctl /usr/local/bin

  # Autenticar con DigitalOcean
  doctl auth init
  ```

  ```powershell Windows theme={null}
  # Usando Scoop
  scoop install doctl

  # Autenticar con DigitalOcean
  doctl auth init
  ```
</CodeGroup>

## Paso 2: Configurar Almacenamiento

### Crear un Espacio (Space)

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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:

```yaml theme={null}
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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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
