diff --git a/.gitignore b/.gitignore index c05e777..bcb2719 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ repos +.claude 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/envs/social-app b/envs/social-app index a6752de..a1bc28f 100644 --- a/envs/social-app +++ b/envs/social-app @@ -1 +1,3 @@ -ATP_APPVIEW_HOST=https://bsky.${host} +ATP_APPVIEW_HOST=https://public.api.bsky.app +EXPO_PUBLIC_BLUESKY_PROXY_DID=did:web:api.bsky.app +EXPO_PUBLIC_ENV=production diff --git a/install.zsh b/install.zsh index 94339c8..61e56a3 100755 --- a/install.zsh +++ b/install.zsh @@ -73,6 +73,7 @@ function at-repos-pull() { echo $repo if [ -d $d/repos/${repo##*/} ];then cd $d/repos/${repo##*/} + git stash if ! git pull;then rm -rf $d/repos/${repo##*/} at-repos-clone @@ -100,9 +101,8 @@ function at-repos-social-app-icon-origin() { curl -sL $icon -o $d/icons/Logotype.tsx } -function at-repos-social-app-write() { +function at-repos-social-app-avatar-write() { did_admin=did:plc:6qyecktefllvenje24fcxnie - dt=$d/repos/social-app/src cd $dt grep -R syu.is .|cut -d : -f 1|sort -u|xargs sed -i "s/syu.is/${host}/g" @@ -123,31 +123,33 @@ 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-repos-atproto-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-repos-social-app-patch() { - f=$d/repos/social-app/Dockerfile - p_=$d/patching/social-app-dockerfile.diff +function at-repos-atproto-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_} + popd +} + +function at-repos-social-app-agent-patch() { + f=$d/repos/social-app/src/state/session/agent.ts + p_=$d/patching/8980-social-app-disable-proxy.diff d_=$d/repos/social-app - cd ${d_} - curl -sLO https://raw.githubusercontent.com/bluesky-social/social-app/refs/heads/main/Dockerfile echo "applying patch: under ${f} for ${p_}" pushd ${d_} patch -p1 < ${p_} @@ -172,19 +174,31 @@ function at-repos-ozone-patch() { pushd ${d_} patch -p1 < ${p_} popd - #cp -rf $d/repos/atproto/service/ozone/* $d/ozone/service/ } -function at-repos-docker() { +function at-repos-build-docker-atproto() { cd $d - docker compose build - # docker compose up -d - # docker compose up -d --no-build - # docker compose up -d --pull always + docker image prune -a + docker compose build --no-cache bsky plc pds jetstream bgs ozone } -function at-regi-docker() { +function at-repos-build-docker-social() { + cd $d + docker compose build --no-cache social-app +} + +function at-repos-build-docker-tag() { + docker restart registry + docker stop registry + docker rm registry + docker volume rm registry-data 2>/dev/null || true + docker run -d -p 5000:5000 --name registry \ + --restart=always \ + -v registry-data:/var/lib/registry \ + registry:2 + sleep 3 + docker run -d -p ${dport}:${dport} --name registry --restart=always registry:2 docker tag at-pds:latest localhost:${dport}/pds:latest docker tag at-ozone-web:latest localhost:${dport}/ozone-web:latest @@ -206,18 +220,34 @@ function at-regi-docker() { docker push localhost:${dport}/plc:latest docker push localhost:${dport}/social-app:latest - docker restart registry + cd $d + docker compose down } -at-repos-env -at-repos-clone -at-repos-pull -at-repos-social-app-icon -at-repos-social-app-icon-origin -at-repos-social-app-write -at-repos-bsky-patch -at-repos-social-app-patch -at-repos-ozone-patch -at-repos-docker +function at-repos-pull-docker() { + cd $d + docker image prune -a + docker compose up -d --pull always +} -# at-regi-docker + +at-repos-env + +case "`cat /etc/hostname`" in + at) + at-repos-pull-docker + ;; + *) + at-repos-clone + at-repos-pull + at-repos-social-app-icon + at-repos-social-app-icon-origin + at-repos-social-app-avatar-write + at-repos-atproto-service-bsky-api-patch + at-repos-atproto-service-pds-index-patch + at-repos-social-app-agent-patch + at-repos-ozone-patch + at-repos-build-docker-atproto + at-repos-build-docker-social + ;; +esac diff --git a/patching/105-atproto-services-for-docker.diff b/patching/4367-atproto-services-bsky-api.diff similarity index 52% rename from patching/105-atproto-services-for-docker.diff rename to patching/4367-atproto-services-bsky-api.diff index c428d6f..f887230 100644 --- a/patching/105-atproto-services-for-docker.diff +++ b/patching/4367-atproto-services-bsky-api.diff @@ -1,14 +1,89 @@ -diff --git a/services/bsky/api.js b/services/bsky/api.js -index 56c769b9d..5d14c0057 100644 ---- a/services/bsky/api.js -+++ b/services/bsky/api.js -@@ -44,19 +44,62 @@ const assert = require('node:assert') +--- a/services/bsky/api.js 2025-12-03 11:04:54 ++++ b/services/bsky/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 bsky = require('@atproto/bsky') // import all bsky features - const { Secp256k1Keypair } = require('@atproto/crypto') +-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() @@ -70,7 +145,7 @@ index 56c769b9d..5d14c0057 100644 } process.on('SIGTERM', shutdown) process.on('disconnect', shutdown) // when clustering -@@ -64,6 +107,12 @@ const main = async () => { +@@ -64,6 +107,12 @@ const getEnv = () => ({ serviceSigningKey: process.env.BSKY_SERVICE_SIGNING_KEY || undefined, diff --git a/patching/4367-atproto-services-pds-index.diff b/patching/4367-atproto-services-pds-index.diff new file mode 100644 index 0000000..a8165f8 --- /dev/null +++ b/patching/4367-atproto-services-pds-index.diff @@ -0,0 +1,20 @@ +--- a/services/pds/index.js 2025-12-03 11:04:54 ++++ b/services/pds/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() diff --git a/patching/8980-social-app-disable-proxy.diff b/patching/8980-social-app-disable-proxy.diff new file mode 100644 index 0000000..4bc454f --- /dev/null +++ b/patching/8980-social-app-disable-proxy.diff @@ -0,0 +1,44 @@ +diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts +index 36d19299b..ba095436a 100644 +--- a/src/state/session/agent.ts ++++ b/src/state/session/agent.ts +@@ -39,7 +39,8 @@ export function createPublicAgent() { + configureModerationForGuest() // Side effect but only relevant for tests + + const agent = new BskyAppAgent({service: PUBLIC_BSKY_SERVICE}) +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ // Disable proxy for self-hosted environments ++ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) + return agent + } + +@@ -77,7 +78,8 @@ export async function createAgentAndResume( + } + } + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ // Disable proxy for self-hosted environments ++ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) + + return agent.prepare(gates, moderation, onSessionChange) + } +@@ -112,7 +114,8 @@ export async function createAgentAndLogin( + const gates = tryFetchGates(account.did, 'prefer-fresh-gates') + const moderation = configureModerationForAccount(agent, account) + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ // Disable proxy for self-hosted environments ++ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) + + return agent.prepare(gates, moderation, onSessionChange) + } +@@ -201,7 +204,8 @@ export async function createAgentAndCreateAccount( + logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) + } + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ // Disable proxy for self-hosted environments ++ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) + + return agent.prepare(gates, moderation, onSessionChange) + } diff --git a/patching/social-app-dockerfile.diff b/patching/social-app-dockerfile.diff deleted file mode 100644 index 816cf15..0000000 --- a/patching/social-app-dockerfile.diff +++ /dev/null @@ -1,10 +0,0 @@ ---- a/Dockerfile -+++ b/Dockerfile -@@ -37,6 +37,7 @@ RUN \. "$NVM_DIR/nvm.sh" && \ - echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$EXPO_PUBLIC_BUNDLE_IDENTIFIER" >> .env && \ - echo "EXPO_PUBLIC_BUNDLE_DATE=$(date -u +"%y%m%d%H")" >> .env && \ - npm install --global yarn && \ -+ yarn config set network-timeout 600000 && \ - yarn && \ - yarn intl:build && \ - EXPO_PUBLIC_BUNDLE_IDENTIFIER=$EXPO_PUBLIC_BUNDLE_IDENTIFIER EXPO_PUBLIC_BUNDLE_DATE=$() yarn build-web