Skip to main content
andrés ignacio torres

Desplegar Ozone de Bluesky junto a otros servicios

¡Gracias a Casey Primozic (@ameo.dev) por la detallada guía de despliegue de un PDS de Bluesky junto a otros servicios que sirvió de inspiración para esta publicación!

Captura de la pantalla de inicio de Ozone

¡Está vivo!

He estado experimentando con Bluesky por los últimos meses a través de varios proyectos, y naturalmente me ha interesado el self-hosting (autodespliegue) de algunos de sus componentes, dada la naturaleza modular y de código abierto de Bluesky.

Lo primero que hice fue desplegar un Servidor de Datos Personales (PDS), pero la guía oficial requiere desplegar un conjunto de servicios ejecutándose en la red del host, incluyendo a caddy como proxy inverso.

Como quería reutilizar un servidor existente que ya tenía nginx corriendo, seguí la guía de @ameo.dev (en inglés) para configurar el PDS. Luego de unos ajustes, logré hacer que funcionara.

El siguiente paso fue desplegar Ozone, la aplicación oficial de etiquetado de contenido (labeling) de Bluesky. Como en las instrucciones del PDS, la guía oficial de despliegue de Ozone implica ejecutar una imagen de Docker en la red del host con caddy y postgresql. Con unos cuantos ajustes, adapté los pasos para funcionar con una instalación existente de nginx y sin interferir con un postgres ya en uso.

Para referencia futura, estos son los ajustes que hice para desplegar Ozone.

Comenzar con la guía oficial #

La guía de despliegue de Ozone (en inglés) es un buen punto de inicio para revisar que el servidor tenga los prerequisitos y dependencias instaladas, así como suficientes recursos.

Necesitarás la cuenta de servicio para el etiquetador, el dominio apuntando a tu servidor y abrir los puertos del firewall como se describe.

Directorios y archivos de configuración #

Mantuve la estructura de los directorios similar a la que se usa en la guía oficial, pero en vez de crear el directorio base en la raíz del servidor, lo puse en otro lugar. Aquí es donde vivirán los datos de Ozone y la base de datos de Postgres.

Puedes omitir el directorio de caddy ya que estás usando nginx.

# Navega a donde quieras crear el directorio,
# este es un ejemplo
cd /opt

# Crea los directorios
mkdir ozone
mkdir ozone/postgres

Omite el archivo de configuración Caddyfile ya que no usarás caddy.

Crea el archivo de configuración de postgres en el directorio ozone que creaste, no necesariamente en /ozone/postgres.env que es donde lo pone la guía oficial.

Luego, crea el archivo ozone.env en el mismo directorio. Lo único que ajustar es la variable OZONE_DB_POSTGRES_URL. Yo la configuré así (cambiando localhost por postgres como hostname):

OZONE_DB_POSTGRES_URL=postgresql://postgres:${POSTGRES_PASSWORD}@$postgres:5432/ozone

Ya que los contenedores de Docker compartirán la misma red (y no la red del host), puedes usar el nombre del contenedor de Postgres como hostname.

Configuración de los contenedores de Ozone #

El próximo paso en la guía oficial es descargar el archivo compose.yaml y ejecutarlo. Sin embargo, hacerlo de esta forma significa ejecutar todo en la red del host, incluyendo caddy, lo cual no es lo que queremos.

Puedes ajustar el archivo compose.yaml similar a esto:

networks:
  ozone:
    driver: bridge
services:
  ozone:
    container_name: ozone
    image: ghcr.io/bluesky-social/ozone:0.1
    restart: unless-stopped
    networks:
      - ozone
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - '1235:3000'
    env_file:
      - /opt/ozone/ozone.env
  postgres:
    container_name: postgres
    image: postgres:14.11-bookworm
    networks:
      - ozone
    restart: unless-stopped
    healthcheck:
      test: pg_isready -h localhost -U $$POSTGRES_USER
      interval: 2s
      timeout: 5s
      retries: 10
    volumes:
      - type: bind
        source: /opt/ozone/postgres
        target: /var/lib/postgresql/data
    env_file:
      - /opt/ozone/postgres.env

Entre los cambios están:

Guarda el archivo como compose.yaml y ejecútalo con docker compose up -d para verificar que todo funcione.

Crea, habilita e inicia el servicio con systemd como lo indica la guía oficial. Asegúrate de ajustar el WorkingDirectory a la ruta donde guardaste el archivo compose.yaml. Con esto, Ozone se iniciará automáticamente al reiniciar el servidor.

En este punto, puedes verificar que todo se ejecuta correctamente haciendo curl a http://localhost:1235/xrpc/_health. Si todo funciona, el único paso que queda es configurar nginx para que funcione como proxy inverso y redirija el tráfico a Ozone.

Configuración de nginx #

Creé un archivo de configuración ozone.conf en nginx similar a este:

server {
  listen 80;
  server_name labeler.example.com;

  location / {
      proxy_pass http://localhost:1235;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header Host $host;

      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";

      proxy_buffering off;
  }
}

Ajusta el dominio y el puerto a lo que necesites, y asegúrate de mantener las líneas proxy_set_header para que los websockets funcionen correctamente.

Habilita el archivo de configuración y reinicia nginx para aplicar los cambios.

Luego, para agregar soporte HTTPS, puedes usar certbot:

certbot --nginx -d labeler.example.com

¡Y listo!

Espero que esta guía te sea útil para desplegar tu propio Ozone, y si tienes alguna sugerencia para la publicación, déjame un mensaje en Bluesky.