From b4f97fc5b9ab7b2360d6cb21248ea37c91d1199c Mon Sep 17 00:00:00 2001 From: syui Date: Tue, 2 Dec 2025 21:37:41 +0900 Subject: [PATCH] fix service pds, bsky --- compose.yml | 40 +++-- install.zsh | 29 ++-- patching/4367-atproto-services-bsky-api.diff | 160 ++++++++++++++++++ patching/4367-atproto-services-pds-index.diff | 20 +++ 4 files changed, 219 insertions(+), 30 deletions(-) create mode 100644 patching/4367-atproto-services-bsky-api.diff create mode 100644 patching/4367-atproto-services-pds-index.diff diff --git a/compose.yml b/compose.yml index 813393a..f2efcb5 100644 --- a/compose.yml +++ b/compose.yml @@ -48,10 +48,32 @@ services: - ./envs/pds volumes: - ./data/pds/:/data/ + - ./repos/atproto/services/pds/index.js:/app/run-pds.js + command: ['node', '--enable-source-maps', '/app/run-pds.js'] depends_on: database: condition: service_healthy + bsky: + ports: + - 2584:2584 + build: + context: ./repos/atproto/ + dockerfile: services/bsky/Dockerfile + restart: always + env_file: + - ./envs/bsky + user: root + volumes: + - ./data/bsky/:/data/ + - ./repos/atproto/services/bsky/api.js:/app/run-bsky.js + command: ['node', '--enable-source-maps', '/app/run-bsky.js'] + depends_on: + database: + condition: service_healthy + redis: + condition: service_healthy + bgs: ports: - 2470:2470 @@ -78,24 +100,6 @@ services: - ./envs/social-app command: "/usr/bin/bskyweb serve" - bsky: - ports: - - 2584:2584 - build: - context: ./repos/atproto/ - dockerfile: services/bsky/Dockerfile - restart: always - env_file: - - ./envs/bsky - user: root - volumes: - - ./data/bsky/:/data/ - command: node --enable-source-maps api.js - depends_on: - database: - condition: service_healthy - redis: - condition: service_healthy jetstream: build: diff --git a/install.zsh b/install.zsh index 94339c8..3fd5020 100755 --- a/install.zsh +++ b/install.zsh @@ -123,19 +123,23 @@ function at-repos-social-app-write() { grep -R $did_admin .|cut -d : -f 1|sort -u|xargs sed -i "s/${did_admin}/${did}/g" } -function at-repos-bsky-patch() { +function at-service-bsky-api-patch() { + # https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/105-atproto-services-for-docker.diff f=$d/repos/atproto/services/bsky/api.js curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/bsky/api.js -o $f d_=$d/repos/atproto - p_=$d/patching/105-atproto-services-for-docker.diff - cd ${d_} - if [ ! -f ${p_} ];then - # https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/105-atproto-services-for-docker.diff - echo download patch: https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/105-atproto-services-for-docker.diff - curl -sL https://raw.githubusercontent.com/itaru2622/bluesky-selfhost-env/refs/heads/master/patching/105-atproto-services-for-docker.diff -o ${p_} - else - echo local patch - fi + p_=$d/patching/4367-atproto-services-bsky-api.diff + echo "applying patch: under ${f} for ${p_}" + pushd ${d_} + patch -p1 < ${p_} + popd +} + +function at-service-pds-index-patch() { + f=$d/repos/atproto/services/pds/index.js + curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/pds/index.js -o $f + d_=$d/repos/atproto + p_=$d/patching/4367-atproto-services-pds-index.diff echo "applying patch: under ${f} for ${p_}" pushd ${d_} patch -p1 < ${p_} @@ -215,9 +219,10 @@ at-repos-pull at-repos-social-app-icon at-repos-social-app-icon-origin at-repos-social-app-write -at-repos-bsky-patch +at-service-bsky-api-patch +at-service-pds-index-patch at-repos-social-app-patch at-repos-ozone-patch at-repos-docker - # at-regi-docker + diff --git a/patching/4367-atproto-services-bsky-api.diff b/patching/4367-atproto-services-bsky-api.diff new file mode 100644 index 0000000..b3f5256 --- /dev/null +++ b/patching/4367-atproto-services-bsky-api.diff @@ -0,0 +1,160 @@ +--- repos/atproto/services/bsky/api.js 2025-12-03 11:04:54 ++++ patching/api.js 2025-12-03 11:00:02 +@@ -1,62 +1,105 @@ + /* eslint-env node */ + /* eslint-disable import/order */ +- ++// https://github.com/bluesky-social/atproto/blob/main/services/bsky/api.js + 'use strict' + +-const dd = require('dd-trace') ++//const dd = require('dd-trace') ++// ++//dd.tracer ++// .init() ++// .use('http2', { ++// client: true, // calls into dataplane ++// server: false, ++// }) ++// .use('express', { ++// hooks: { ++// request: (span, req) => { ++// maintainXrpcResource(span, req) ++// }, ++// }, ++// }) + +-dd.tracer +- .init() +- .use('http2', { +- client: true, // calls into dataplane +- server: false, +- }) +- .use('express', { +- hooks: { +- request: (span, req) => { +- maintainXrpcResource(span, req) +- }, +- }, +- }) +- + // modify tracer in order to track calls to dataplane as a service with proper resource names + const DATAPLANE_PREFIX = '/bsky.Service/' +-const origStartSpan = dd.tracer._tracer.startSpan +-dd.tracer._tracer.startSpan = function (name, options) { +- if ( +- name !== 'http.request' || +- options?.tags?.component !== 'http2' || +- !options?.tags?.['http.url'] +- ) { +- return origStartSpan.call(this, name, options) +- } +- const uri = new URL(options.tags['http.url']) +- if (!uri.pathname.startsWith(DATAPLANE_PREFIX)) { +- return origStartSpan.call(this, name, options) +- } +- options.tags['service.name'] = 'dataplane-bsky' +- options.tags['resource.name'] = uri.pathname.slice(DATAPLANE_PREFIX.length) +- return origStartSpan.call(this, name, options) +-} ++//const origStartSpan = dd.tracer._tracer.startSpan ++//dd.tracer._tracer.startSpan = function (name, options) { ++// if ( ++// name !== 'http.request' || ++// options?.tags?.component !== 'http2' || ++// !options?.tags?.['http.url'] ++// ) { ++// return origStartSpan.call(this, name, options) ++// } ++// const uri = new URL(options.tags['http.url']) ++// if (!uri.pathname.startsWith(DATAPLANE_PREFIX)) { ++// return origStartSpan.call(this, name, options) ++// } ++// options.tags['service.name'] = 'dataplane-bsky' ++// options.tags['resource.name'] = uri.pathname.slice(DATAPLANE_PREFIX.length) ++// return origStartSpan.call(this, name, options) ++//} + + // Tracer code above must come before anything else + const assert = require('node:assert') + const cluster = require('node:cluster') + const path = require('node:path') + +-const { BskyAppView, ServerConfig } = require('@atproto/bsky') +-const { Secp256k1Keypair } = require('@atproto/crypto') ++const bsky = require('/app/packages/bsky') // import all bsky features ++const { Secp256k1Keypair } = require('/app/packages/crypto') + + const main = async () => { + const env = getEnv() +- const config = ServerConfig.readEnv() ++ const config = bsky.ServerConfig.readEnv() + assert(env.serviceSigningKey, 'must set BSKY_SERVICE_SIGNING_KEY') + const signingKey = await Secp256k1Keypair.import(env.serviceSigningKey) +- const bsky = BskyAppView.create({ config, signingKey }) +- await bsky.start() ++ ++// starts: involve logics in packages/dev-env/src/bsky.ts >>>>>>>>>>>>> ++// Separate migration db in case migration changes some connection state that we need in the tests, e.g. "alter database ... set ..." ++ const migrationDb = new bsky.Database({ ++ url: env.dbPostgresUrl, ++ schema: env.dbPostgresSchema, ++ }) ++ if (env.migration) { ++ await migrationDb.migrateToOrThrow(env.migration) ++ } else { ++ await migrationDb.migrateToLatestOrThrow() ++ } ++ await migrationDb.close() ++ ++ const db = new bsky.Database({ ++ url: env.dbPostgresUrl, ++ schema: env.dbPostgresSchema, ++ poolSize: 10, ++ }) ++ ++ const dataplane = await bsky.DataPlaneServer.create( ++ db, ++ env.dataplanePort, ++ config.didPlcUrl ++ ) ++ ++ const bsync = await bsky.MockBsync.create(db, env.bsyncPort) ++ ++// ends: involve logics in packages/dev-env/src/bsky.ts <<<<<<<<<<<<< ++ ++ const server = bsky.BskyAppView.create({ config, signingKey }) ++// starts: involve logics in packages/dev-env/src/bsky.ts >>>>>>>>>>>>> ++ const sub = new bsky.RepoSubscription({ ++ service: env.repoProvider, ++ db, ++ idResolver: dataplane.idResolver, ++ background: new bsky.BackgroundQueue(db), ++ }) ++// ends: involve logics in packages/dev-env/src/bsky.ts <<<<<<<<<<<<< ++ await server.start() ++ sub.start() // involve logics in packages/dev-env/src/bsky.ts + // Graceful shutdown (see also https://aws.amazon.com/blogs/containers/graceful-shutdowns-with-ecs/) + const shutdown = async () => { +- await bsky.destroy() ++ await server.destroy() ++ await bsync.destroy() ++ await dataplane.destroy() ++ await sub.destroy() ++ await db.close() + } + process.on('SIGTERM', shutdown) + process.on('disconnect', shutdown) // when clustering +@@ -64,6 +107,12 @@ + + const getEnv = () => ({ + serviceSigningKey: process.env.BSKY_SERVICE_SIGNING_KEY || undefined, ++ dbPostgresUrl: process.env.BSKY_DB_POSTGRES_URL || undefined, ++ dbPostgresSchema: process.env.BSKY_DB_POSTGRES_SCHEMA || undefined, ++ dataplanePort : maybeParseInt(process.env.BSKY_DATAPLANE_PORT) || undefined, ++ bsyncPort : maybeParseInt(process.env.BSKY_BSYNC_PORT) || undefined, ++ migration: process.env.ENABLE_MIGRATIONS === 'true' || undefined, ++ repoProvider: process.env.BSKY_REPO_PROVIDER || undefined + }) + + const maybeParseInt = (str) => { diff --git a/patching/4367-atproto-services-pds-index.diff b/patching/4367-atproto-services-pds-index.diff new file mode 100644 index 0000000..1b29f8e --- /dev/null +++ b/patching/4367-atproto-services-pds-index.diff @@ -0,0 +1,20 @@ +--- repos/atproto/services/pds/index.js 2025-12-03 11:04:54 ++++ patching/index.js 2025-12-02 22:11:39 +@@ -1,5 +1,5 @@ + /* eslint-env node */ +- ++// https://github.com/bluesky-social/atproto/blob/main/services/pds/index.js + 'use strict' + + const { +@@ -8,8 +8,8 @@ + envToSecrets, + httpLogger, + readEnv, +-} = require('@atproto/pds') +-const pkg = require('@atproto/pds/package.json') ++} = require('/app/packages/pds') ++const pkg = require('/app/packages/pds/package.json') + + const main = async () => { + const env = readEnv()