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.
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.
# 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.
# 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).
# /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.
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.
# 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 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.
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.
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 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.
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 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.
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
- Repositorio antimatter-docker (GitHub): https://github.com/AntimatterChat/antimatter-docker
- Imagen stable en GHCR: https://ghcr.io/antimatterchat/antimatter
- Imagen next en GHCR: https://ghcr.io/antimatterchat/antimatter-next
- Licencia Apache 2.0: https://www.apache.org/licenses/LICENSE-2.0
- Aviso de licencia AGPL-3.0 para Dockerfile (adaptado de Mattermost): https://github.com/AntimatterChat/antimatter-docker/blob/main/NOTICE
Apoya el canal GENBYTE
¿Te ha sido útil este contenido?
Suscríbete a YouTube
Newsletter GENBYTE
Ko-fi
Contacto: [email protected]
