feat: pds 0.5 with telemetry and branding changes
Deploy PDS / deploy (push) Canceled after 0s

This commit is contained in:
gov committed 2026-08-09 23:15:35 -04:00
1 parent 82251b973f
commit be08225aaf
9 files changed
+323 -7

No files matched your search

+11
View File
@@ -0,0 +1,11 @@
apiVersion: 1
providers:
- name: PDS
type: file
folder: PDS
updateIntervalSeconds: 30
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: false
+12
View File
@@ -0,0 +1,12 @@
apiVersion: 1
datasources:
- name: Prometheus
uid: pds-prometheus
type: prometheus
access: proxy
url: http://127.0.0.1:9090
isDefault: true
editable: false
jsonData:
timeInterval: 15s
+66
View File
@@ -0,0 +1,66 @@
name: pds-monitoring
# Self-contained monitoring stack for a self-hosted PDS.
# Deployed by Ansible to {{ pds_data_dir }}/monitoring/compose.yaml
#
# All services bind to 127.0.0.1 — nothing is exposed to the internet.
# Reach Grafana via SSH tunnel:
# ssh -L 3001:localhost:3001 you@your-pds-host
# Then open http://localhost:3001 (admin/admin, change on first login)
services:
node-exporter:
container_name: pds-node-exporter
image: prom/node-exporter:v1
network_mode: host
pid: host
restart: unless-stopped
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(dev|proc|sys|run|var/lib/docker/.+)($$|/)'
- '--web.listen-address=127.0.0.1:9100'
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
prometheus:
container_name: pds-prometheus
image: prom/prometheus:v3
network_mode: host
restart: unless-stopped
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
- '--web.listen-address=127.0.0.1:9090'
# Lets the PDS push OTLP metrics directly — no collector needed
- '--web.enable-otlp-receiver'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
grafana:
container_name: pds-grafana
# Grafana publishes no floating major tag — pinned to exact version
image: grafana/grafana:{{ pds_grafana_image_tag }}
network_mode: host
depends_on:
- prometheus
restart: unless-stopped
environment:
GF_SERVER_HTTP_ADDR: 127.0.0.1
GF_SERVER_HTTP_PORT: 3001
GF_ANALYTICS_REPORTING_ENABLED: false
GF_ANALYTICS_CHECK_FOR_UPDATES: false
GF_USERS_ALLOW_SIGN_UP: false
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- ./dashboards:/var/lib/grafana/dashboards:ro
- grafana-data:/var/lib/grafana
volumes:
prometheus-data:
grafana-data:
+48
View File
@@ -33,3 +33,51 @@ PDS_EMAIL_SMTP_URL={{ pds_email_smtp_url }}
{% if pds_email_from_address is defined %}
PDS_EMAIL_FROM_ADDRESS={{ pds_email_from_address }}
{% endif %}
{% if pds_service_name is defined %}
PDS_SERVICE_NAME={{ pds_service_name }}
{% endif %}
{% if pds_logo_url is defined %}
PDS_LOGO_URL={{ pds_logo_url }}
{% endif %}
{% if pds_primary_color is defined %}
PDS_PRIMARY_COLOR={{ pds_primary_color }}
{% endif %}
{% if pds_error_color is defined %}
PDS_ERROR_COLOR={{ pds_error_color }}
{% endif %}
{% if pds_warning_color is defined %}
PDS_WARNING_COLOR={{ pds_warning_color }}
{% endif %}
{% if pds_info_color is defined %}
PDS_INFO_COLOR={{ pds_info_color }}
{% endif %}
{% if pds_success_color is defined %}
PDS_SUCCESS_COLOR={{ pds_success_color }}
{% endif %}
{% if pds_home_url is defined %}
PDS_HOME_URL={{ pds_home_url }}
{% endif %}
{% if pds_terms_of_service_url is defined %}
PDS_TERMS_OF_SERVICE_URL={{ pds_terms_of_service_url }}
{% endif %}
{% if pds_privacy_policy_url is defined %}
PDS_PRIVACY_POLICY_URL={{ pds_privacy_policy_url }}
{% endif %}
{% if pds_support_url is defined %}
PDS_SUPPORT_URL={{ pds_support_url }}
{% endif %}
{% if pds_background_light_url is defined %}
PDS_BACKGROUND_LIGHT_URL={{ pds_background_light_url }}
{% endif %}
{% if pds_background_dark_url is defined %}
PDS_BACKGROUND_DARK_URL={{ pds_background_dark_url }}
{% endif %}
{% if pds_telemetry_enabled is defined and pds_telemetry_enabled | bool %}
NODE_OPTIONS=--import=@atproto/pds/telemetry
OTEL_SERVICE_NAME=pds
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://localhost:9090/api/v1/otlp/v1/metrics
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf
OTEL_METRIC_EXPORT_INTERVAL=15000
OTEL_SEMCONV_STABILITY_OPT_IN=http
OTEL_NODE_RESOURCE_DETECTORS=env,host,os,process,serviceinstance,container
{% endif %}
+28
View File
@@ -0,0 +1,28 @@
global:
scrape_interval: 15s
evaluation_interval: 15s
# Host metrics are scraped. PDS metrics are *pushed* by the PDS over OTLP to
# /api/v1/otlp/v1/metrics (enabled by --web.enable-otlp-receiver in
# compose.yaml), so the PDS needs no scrape job here.
scrape_configs:
- job_name: node
static_configs:
- targets: ['127.0.0.1:9100']
- job_name: prometheus
static_configs:
- targets: ['127.0.0.1:9090']
otlp:
# Keep OTel resource attributes that identify which PDS a series came from
promote_resource_attributes:
- service.name
- service.version
- service.instance.id
- host.name
storage:
tsdb:
# OTLP is a push protocol, so samples can arrive slightly out of order
out_of_order_time_window: 30m