---
name: init_metabase
kind: pipeline
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func main() — Despliega stack Metabase + Postgres en Docker"
description: "Pipeline que inicializa un contenedor Metabase con su base de datos Postgres. Crea red Docker, pull de imágenes, inicia Postgres con volume persistente, espera health check y lanza Metabase conectado."
tags: [docker, metabase, postgres, pipeline, infra, analytics, launcher]
uses_functions:
  - docker_create_network_go_infra
  - docker_pull_image_go_infra
  - docker_run_container_go_infra
  - docker_inspect_container_go_infra
  - retry_with_backoff_go_core
uses_types:
  - container_info_go_infra
  - network_go_docker
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [os/exec, encoding/json]
params: []
output: "stdout: JSON con IDs de red, contenedores (postgres, metabase) y URL de acceso"
tested: false
tests: []
test_file_path: ""
file_path: "functions/pipelines/init_metabase/main.go"
---

## Ejemplo

```bash
# Básico
go run functions/pipelines/init_metabase/main.go \
  --project analytics \
  --metabase-port 3000 \
  --pg-user metabase \
  --pg-password metabase

# Con volume para registry.db (detecta cambios en vivo)
go run functions/pipelines/init_metabase/main.go \
  --project fn_registry \
  --mb-volumes "$HOME/fn_registry/registry.db:/data/registry.db"
```

Salida JSON:
```json
{
  "network_id": "abc123...",
  "postgres_id": "def456...",
  "metabase_id": "ghi789...",
  "network_name": "analytics-net",
  "postgres_name": "analytics-postgres",
  "metabase_name": "analytics-metabase",
  "metabase_url": "http://localhost:3000"
}
```

## Notas

El pipeline orquesta 5 pasos secuenciales:

1. **Red Docker** — crea `{project}-net` con driver bridge
2. **Pull** — descarga `postgres:16` y `metabase/metabase:latest`
3. **Postgres** — inicia con volume persistente (named volume por defecto o bind mount con `--pg-volume`)
4. **Health check** — retry exponencial (hasta ~34 min) con `pg_isready` dentro del contenedor
5. **Metabase** — conecta a Postgres via red interna, expone en puerto configurable. Con `--mb-volumes` monta volumes adicionales (ej: registry.db para SQLite)
6. **Permisos** — ajusta ownership de directorios montados para el usuario `metabase` (UID 2000) dentro del contenedor

Reutiliza conceptualmente `docker_create_network`, `docker_pull_image`, `docker_run_container`, `docker_inspect_container` y `retry_with_backoff`, reimplementadas inline por ser un ejecutable independiente.

Para destruir el stack:
```bash
docker stop analytics-metabase analytics-postgres
docker rm analytics-metabase analytics-postgres
docker network rm analytics-net
```
