Antimatter Docker: Despliegue autohospedado de la plataforma de colaboración

Publicado por


Docker

Antimatter Docker: Despliegue autohospedado de la plataforma de colaboración

Imagen oficial con plugins preempaquetados, firmados y listos para producción

Vídeo tutorial en YouTube

Mira el vídeo completo sobre cómo instalar y usar Antimatter Docker: Despliegue autohospedado de la plataforma de colaboración en el canal GENBYTE:

¿Qué es Antimatter Docker: Despliegue autohospedado de la plataforma de colaboración?

Antimatter Docker es el repositorio oficial que construye y publica las imágenes de contenedor listas para usar de Antimatter, una bifurcación de Mattermost orientada a la colaboración en equipo. El proyecto empaqueta el servidor Antimatter junto con sus plugins oficiales (Agents, Boards, Calls, GitHub, GitLab, Jira, Metrics, Playbooks en la variante stable; además Voice Channels, Polls, Mail, Calendar, Notes, Whiteboard, GIFs, Todo, Memes en la variante next), firmados con la clave de firma de plugins de Antimatter. Las imágenes se publican en ghcr.io/antimatterchat/antimatter (stable) y ghcr.io/antimatterchat/antimatter-next (next) para arquitecturas linux/amd64 y linux/arm64. Todo el proceso de compilación ocurre dentro de Docker mediante scripts reproducibles, garantizando que una compilación local y la de GitHub Actions usen la misma cadena de herramientas.

Incluye plugins firmados y preempaquetados, listos para instalarse sin conexión desde el Marketplace interno, y se ejecuta sobre una base distroless con usuario no root (uid 2000) para superficie de ataque mínima.

Características principales

Dos variantes de imagen

stable (ghcr.io/antimatterchat/antimatter) con plugins principales; next (ghcr.io/antimatterchat/antimatter-next) añade plugins experimentales como Voice Channels, Polls, Mail, Calendar, Notes, Whiteboard, GIFs, Todo, Memes.

Plugins firmados y verificados

Cada plugin se firma con la clave privada de Antimatter (fingerprint en keys/antimatter-plugin-signing.fingerprint). El servidor solo instala plugins cuya firma verifica contra claves de confianza: la de Antimatter, la de Mattermost Marketplace y las que añada el administrador.

Compilación reproducible en Docker

Scripts fetch-sources.sh, build-plugins.sh, build-server.sh, sign-plugins.sh y build-image.sh ejecutan toda la cadena de compilación dentro de contenedores, usando docker/build.Dockerfile. Permite builds locales (SOURCES=local) o en GitHub Actions con secretos para la clave de firma.

Base distroless y usuario no root

Imagen final sobre gcr.io/distroless/base-debian12. El servidor corre como usuario antimatter (uid 2000, gid 2000). Incluye utilidades de procesamiento de documentos (pdftotext, wvWare, unrtf, tidy) y sus bibliotecas compartidas en /usr/local/lib/doc-tools.

Compatibilidad multi-arquitectura

Imágenes construidas para linux/amd64 y linux/arm64. El Dockerfile usa ARG TARGETARCH para seleccionar el tarball del servidor correspondiente (antimatter-linux-<arch>.tar.gz).

Variables de entorno MM_* heredadas

El servidor sigue leyendo su configuración mediante variables MM_* (MM_SQLSETTINGS_DATASOURCE, MM_SERVICESETTINGS_SITEURL, MM_BLEVESETTINGS_INDEXDIR, etc.). Los alias AM_* llegarán con el rebranding completo del servidor.

Requisitos del sistema

  • Docker con plugin buildx (paquete docker-buildx) para compilación local
  • Python 3, git, gpg disponibles en el host de compilación
  • Permisos para usar Docker (pertenecer al grupo docker)
  • ~16 GB de RAM para la compilación de la aplicación web del servidor (BUILD_NODE_OPTIONS en build.env)
  • ~30 GB de espacio en disco para la compilación completa
  • Para ejecución: Docker Compose v2, PostgreSQL 17 (imagen postgres:17-alpine en compose)
  • Puerto 8065 TCP (web/API), 8443 UDP/TCP (Calls RTC), opcionalmente 8067 (métricas) y 8074 (gossip de clúster)

Instalación con Docker Compose

Despliegue rápido con docker-compose.yml (mínimo, sin proxy)

Copia .env.example a .env, edita SITE_URL y POSTGRES_PASSWORD, luego levanta los servicios. La imagen por defecto es ghcr.io/antimatterchat/antimatter:latest. Los volúmenes nombrados persisten configuración, datos, logs y plugins.

cp .env.example .env
# Edita .env: establece SITE_URL=https://tu-dominio.tld y POSTGRES_PASSWORD=contraseña_segura
docker compose up -d

Prueba local con compose.local.yml (imagen published latest + PostgreSQL local)

Para probar la imagen publicada latest en localhost. Requiere docker login ghcr.io si el paquete es privado (token con read:packages). Los datos se guardan en volúmenes nombrados; docker compose -f compose.local.yml down -v elimina todo.

docker compose -f compose.local.yml up -d
# Para usar una imagen compilada localmente (tag dev):
# ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter:dev docker compose -f compose.local.yml up -d

Compilación local completa (desde checkouts adyacentes)

Clona los repositorios del servidor y plugins junto a antimatter-docker (../antimatter, ../antimatter-plugin-*). Luego ejecuta el script de build con SOURCES=local. El resultado se carga como ghcr.io/antimatterchat/antimatter:dev. Para publicar imagen multi-plataforma: PUSH=1 TAGS="ghcr.io/antimatterchat/antimatter:1.0.0" scripts/build-image.sh (tras docker login ghcr.io).

# Estructura esperada:
# /ruta/antimatter-docker/
# /ruta/antimatter/
# /ruta/antimatter-plugin-calls/
# …
SOURCES=local scripts/build-all.sh

Producción con deploy/compose/

El repositorio incluye un stack de producción documentado en deploy/compose/README.md con nginx (TLS, websockets), puerto Calls, servicio GIF opcional, Let's Encrypt, primer administrador, actualizaciones y backups. No se detallan aquí sus archivos porque no están en la investigación proporcionada.

# Consultar deploy/compose/README.md en el repositorio para la configuración completa de producción.

Acceder al proyecto

Interfaz web

Accede a http://localhost:8065 (o al SITE_URL configurado) tras levantar los contenedores. La primera cuenta creada se convierte en administrador del sistema.

CLI del servidor (amctl)

Disponible dentro del contenedor en /antimatter/bin/amctl (renombrado desde mmctl en refs recientes del servidor). Ejemplo: docker exec -it <contenedor> /antimatter/bin/amctl system status –local

Puertos expuestos

8065 TCP: interfaz web y API. 8443 UDP y TCP: medios de Calls (RTC). 8067 TCP: métricas (Prometheus). 8074 TCP: gossip de clúster. En producción, colocar un proxy TLS inverso frente al puerto 8065 y abrir 8443 en el firewall del host.

Casos de uso

  • Equipos que requieren una alternativa autohospedada a Mattermost/Slack con plugins integrados de serie
  • Organizaciones que necesitan firma de plugins propia para distribución interna sin Marketplace público
  • Despliegues en arquitecturas ARM64 (ej. Raspberry Pi 4/5, servidores Ampere/Graviton) junto a AMD64
  • Entornos con políticas de seguridad que exigen imágenes distroless y ejecución como usuario no root
  • Desarrolladores que contribuyen a Antimatter y necesitan compilar y probar imágenes multi-plataforma localmente

Configuración avanzada

Selección de variante (stable/next) y referencias de compilación

La variable VARIANT selecciona variants/stable.env o variants/next.env (por defecto stable). Las referencias de cada componente (servidor y plugins) se resuelven en orden: 1) SERVER_REF / REF_<PLUGIN> / PLUGIN_REFS explícitos; 2) PREFER_REF para todas las ramas/etiquetas que existan; 3) valores por defecto de build.env y plugins.json. Para una feature cruzada (ej. new-ui en servidor y Calls), crear rama new-ui en cada repo y compilar con PREFER_REF=new-ui.

VARIANT=next scripts/build-all.sh
# O para una feature branch:
PREFER_REF=new-ui scripts/build-all.sh

Firma de plugins y gestión de claves

La clave privada nunca entra al repositorio. sign-plugins.sh la lee de ANTIMATTER_PLUGIN_SIGNING_KEY (clave armored, secreto de GitHub), ANTIMATTER_PLUGIN_SIGNING_KEY_FILE o ~/.config/antimatter/plugin-signing/private-key.asc. Mantener backup offline de la clave privada y de revocation-certificate.rev. Si la clave se pierde o filtra, generar nueva, actualizar keys/ y la clave embebida en el servidor, y recompilar.

# En GitHub Actions, añadir secret ANTIMATTER_PLUGIN_SIGNING_KEY con el contenido de private-key.asc
# En local, colocar la clave en ~/.config/antimatter/plugin-signing/private-key.asc

Rebuild nocturno de antimatter-next

antimatter-next se reconstruye cada noche a las 03:17 UTC (tags: latest, nightly, nightly-<YYYYMMDD>, sha-<commit>). Los forks pueden disparar rebuild inmediato enviando repository_dispatch event_type=main-updated a AntimatterChat/antimatter-docker con un token (fine-grained, Contents: read/write) almacenado como secreto ANTIMATTER_DOCKER_DISPATCH_TOKEN.

# Ejemplo workflow en un fork (.github/workflows/rebuild-antimatter-next.yml)
on:
push:
branches: [main]
jobs:
dispatch:
runs-on: ubuntu-latest
steps:
– run: gh api repos/AntimatterChat/antimatter-docker/dispatches -f event_type=main-updated
env:
GH_TOKEN: ${{ secrets.ANTIMATTER_DOCKER_DISPATCH_TOKEN }}

Variables de entorno del contenedor (docker-compose.yml)

Principales variables en .env: SITE_URL (URL pública con HTTPS), POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, ANTIMATTER_IMAGE, HTTP_PORT (8065), CALLS_PORT (8443), TZ (UTC). Dentro del contenedor, el servidor usa MM_SQLSETTINGS_DRIVERNAME=postgres, MM_SQLSETTINGS_DATASOURCE (cadena de conexión), MM_SERVICESETTINGS_SITEURL, MM_BLEVESETTINGS_INDEXDIR=/antimatter/data/bleve-indexes, MM_SERVICESETTINGS_ENABLELOCALMODE=true, MM_INSTALL_TYPE=docker.

# .env ejemplo
SITE_URL=https://chat.example.org
POSTGRES_USER=antimatter
POSTGRES_PASSWORD=contraseña_larga_aleatoria
POSTGRES_DB=antimatter
ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter:latest
HTTP_PORT=8065
CALLS_PORT=8443
TZ=UTC

Gestión y mantenimiento

Actualización de imagen

Para actualizar a la última versión stable: docker compose pull && docker compose up -d. Para next: editar .env cambiando ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter-next:latest y repetir. Los volúmenes nombrados conservan datos y configuración.

docker compose pull
docker compose up -d

Backup de datos y configuración

Los volúmenes Docker (postgres, config, data, logs, plugins, client-plugins) contienen el estado. Hacer backup de los volúmenes (ej. docker run –rm -v antimatter-docker_postgres:/src -v $(pwd):/dst alpine tar czf /dst/postgres-backup.tar.gz -C /src .) y del archivo .env. En producción, usar los scripts de backup documentados en deploy/compose/README.md.

# Ejemplo backup volumen postgres
docker run –rm -v antimatter-docker_postgres:/src -v $(pwd):/dst alpine tar czf /dst/postgres-backup.tar.gz -C /src .

Healthcheck y logs

El contenedor antimatter incluye HEALTHCHECK cada 30s con /antimatter/bin/amctl system status –local. PostgreSQL tiene healthcheck pg_isready cada 10s. Logs accesibles vía docker compose logs -f antimatter y docker compose logs -f postgres. Los logs del servidor también persisten en el volumen logs (/antimatter/logs).

docker compose logs -f antimatter
docker compose logs -f postgres

Limpieza completa (entorno de prueba)

docker compose -f compose.local.yml down -v elimina contenedores, redes y volúmenes (datos incluidos). Útil para reiniciar desde cero en entornos de desarrollo/prueba.

docker compose -f compose.local.yml down -v

Stack técnico

  • Docker / Docker Compose v2
  • Docker Buildx (multi-arch)
  • Distroless base (gcr.io/distroless/base-debian12)
  • Debian 12 (bookworm-slim) como builder
  • PostgreSQL 17 Alpine
  • Go (servidor Antimatter, compilado en builder)
  • Node.js (web app del servidor, BUILD_NODE_OPTIONS)
  • Python 3, git, gpg (scripts de build)
  • Shell (scripts de orquestación: fetch-sources.sh, build-plugins.sh, build-server.sh, sign-plugins.sh, build-image.sh)
  • NGINX (en deploy/compose/ para producción, TLS, websockets)
  • Let's Encrypt (certificados TLS en producción)

Referencias oficiales

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *