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!
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:
- Ya no se usan los contenedores
caddy
ywatchtower
. Una consecuencia de esto es que tendrás que actualizar manualmente el contenedorozone
cuando haya una nueva versión disponible. - Las variables de entorno y volúmenes se montan desde el directorio
ozone
que creaste en vez de/ozone
. - Los contenedores comparten la red
ozone
sin estar expuestos a la red del host. - El puerto
1235
del host está mapeado al puerto3000
del contenedor de Ozone. Puedes cambiarlo a lo que necesites, pero asegúrate de que no esté en uso por otro servicio y de ajustarlo en el próximo paso connginx
.
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.
- Anterior: Escuchar un libro