Author SHA1 Message Date
notplants e23c2951c1 chore: publish 0.4.0+0.4.5027 release 2026-08-17 12:44:19 -04:00
notplantsandnotplants b95cb05c8f chore: empty commit to cut 0.4.0 release 2026-08-17 16:42:17 +00:00
notplants f1f8fce700 chore: publish 0.3.0+0.4.5027 release 2026-08-17 12:38:18 -04:00
notplants 8bf9f1a62e chore: publish 0.2.1+0.4.5027 release 2026-08-17 12:37:11 -04:00
notplants f051d36d04 Merge pull request 'Upgrade 0.3.1+v0.4.5001' (#4) from upgrade-0.3.1+v0.4.5001 into main
Reviewed-on: https://git.coopcloud.tech/coop-cloud/bluesky-pds/pulls/4
2026-08-17 16:35:22 +00:00
autonomic-bot c13a5f7226 chore: upgrade bluesky-social/pds to 0.4.5027
cc-ci/testme cc-ci: success
2026-08-14 02:14:54 +00:00
autonomic-bot 4619810ec6 chore: upgrade bluesky-social/pds to 0.4.5009
cc-ci/testme cc-ci: success
2026-08-03 21:17:47 +00:00
autonomic-bot a562c6eca5 chore: upgrade pds to 0.4.5009
cc-ci/testme cc-ci: success
2026-06-26 03:22:55 +00:00
autonomic-bot 17b5c09328 chore: upgrade app to 0.4.5006
cc-ci/testme cc-ci: success
2026-06-22 20:48:55 +00:00
notplantsandnotplants dcf933813d chore: upgrade to 0.3.1+v0.4.5001
cc-ci/testme cc-ci: success
Bump ghcr.io/bluesky-social/pds 0.4.219 -> 0.4.5001 (atproto/pds 0.2.19 -> 0.5.1).
Upstream renamed the service entrypoint from index.js to index.ts (ESM, type:
module, Node base image 20 -> 24), so update entrypoint.sh.tmpl to exec index.ts
and bump ENTRYPOINT_VERSION v1 -> v2 so the new swarm config is applied.
2026-06-17 01:32:57 +01:00
notplants bc665d5fb0 Merge pull request 'chore: upgrade to 0.3.0+v0.4.219' (#3) from upgrade-0.3.0+v0.4.219 into main
Reviewed-on: https://git.coopcloud.tech/coop-cloud/bluesky-pds/pulls/3
2026-06-15 18:54:53 +00:00
autonomic-bot f7b6c8dfb8 chore: upgrade to 0.3.0+v0.4.219
cc-ci/testme cc-ci: success
Pin an exact released image tag. The previous pin :0.4 is a moving tag
that upstream now republishes with main-branch builds (currently
@atproto/pds 0.5.1 on Node 24, where the service entrypoint moved from
/app/index.js to /app/index.ts), so the recipe's entrypoint.sh
(exec node --enable-source-maps index.js) crash-loops MODULE_NOT_FOUND.
ghcr.io/bluesky-social/pds:0.4.219 is the newest released exact tag and
keeps the layout this recipe's entrypoint expects (Node 20.20,
/app/index.js, dumb-init).
2026-06-11 11:37:47 +00:00
notplants b2d86efba3 Update README.md 2026-02-23 13:41:18 +00:00
notplants 6f2d724770 Update README.md 2026-02-23 13:34:59 +00:00
notplants 4b67c42e76 fix invite in readme 2026-02-22 14:19:16 -05:00
notplants e0ea4188d4 Merge pull request '0.2.0+v0.4' (#1) from 0.2.0+v0.4 into main
Reviewed-on: https://git.coopcloud.tech/coop-cloud/bluesky-pds/pulls/1
2026-02-22 18:12:58 +00:00
notplants 0ef640eae6 rename federation settings to network settings 2026-02-22 18:12:08 +00:00
notplants 28dee997c3 bump to 0.2.0+v0.4 2026-02-22 18:05:58 +00:00
notplants 3b6fce26a8 remove hardcoded federation defaults, rewrite README quickstart 2026-02-22 18:05:50 +00:00
notplantsandnotplants 3cc342340b bump to 0.1.1+v0.4 2026-02-21 23:58:58 -05:00
notplants e1cedf7e88 working on caddy sidecar 2026-02-21 23:48:21 -05:00
notplants 9ad93b86d2 starting on recipe 2026-02-19 15:54:21 -05:00
notplants d7b2feb2d5 first commit 2026-02-19 11:50:14 -05:00
5 changed files with 72 additions and 56 deletions
+3 -1
View File
@@ -6,7 +6,9 @@ LETS_ENCRYPT_ENV=production
# Blob upload limit in bytes (default: 100MB)
#PDS_BLOB_UPLOAD_LIMIT=104857600
# Federation settings (defaults connect to the main Bluesky network)
# Network settings
# These are managed by the upstream PDS image with sensible defaults.
# Only set these if you need to override the upstream defaults.
#PDS_DID_PLC_URL=https://plc.directory
#PDS_BSKY_APP_VIEW_URL=https://api.bsky.app
#PDS_BSKY_APP_VIEW_DID=did:web:api.bsky.app
+65 -45
View File
@@ -13,53 +13,47 @@
<!-- endmetadata -->
## About
## Quickstart
A [Bluesky PDS](https://github.com/bluesky-social/pds) (Personal Data Server)
is a self-hosted server for the AT Protocol, allowing you to own your social
data and federate with the Bluesky network.
0. setup a server with [abra](https://git.coopcloud.tech/toolshed/abra) and deploy [coop-cloud/traefik](https://git.coopcloud.tech/coop-cloud/traefik)
## Basic usage
1. `abra app new bluesky-pds` (do **not** use `--secrets` yet, see below)
2. Generate secrets:
1. Set up Docker Swarm and [`abra`]
2. Deploy [`coop-cloud/traefik`]
3. `abra app new bluesky-pds` (do **not** use `--secrets` yet, see below)
4. `abra app config YOURAPPDOMAIN` - set `DOMAIN` to something that resolves to
your Docker swarm box
5. Generate the PLC rotation key and create secrets (see below)
6. `abra app deploy YOURAPPDOMAIN`
7. Verify the PDS is running: `curl https://YOURAPPDOMAIN/xrpc/_health`
The JWT secret and admin password can be generated automatically:
## Generating secrets
```bash
abra app secret generate YOURAPPDOMAIN pds_jwt_secret v1
abra app secret generate YOURAPPDOMAIN pds_admin_password v1
```
The JWT secret and admin password can be generated automatically:
The PLC rotation key is a secp256k1 private key and must be generated
manually:
```bash
abra app secret generate YOURAPPDOMAIN pds_jwt_secret v1
abra app secret generate YOURAPPDOMAIN pds_admin_password v1
```
```bash
openssl ecparam --name secp256k1 --genkey --noout --outform DER | \
tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32
```
The PLC rotation key is a secp256k1 private key and must be generated manually:
Then store it as a secret:
```bash
openssl ecparam --name secp256k1 --genkey --noout --outform DER | \
tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32
```
```bash
abra app secret insert YOURAPPDOMAIN pds_plc_rotation_key v1 <THE_KEY_HEX>
```
Then store it as a secret:
3. `abra app deploy YOURAPPDOMAIN`
```bash
abra app secret insert YOURAPPDOMAIN pds_plc_rotation_key v1 <THE_KEY_HEX>
```
Verify the PDS is running: `curl https://YOURAPPDOMAIN/xrpc/_health`
## Account management
Create an account on your PDS:
Create an account on your PDS (use the admin password you stored during secret
generation):
```bash
abra app run YOURAPPDOMAIN app -- \
goat pds admin account create \
--admin-password "$(abra app secret get YOURAPPDOMAIN pds_admin_password v1)" \
--admin-password YOUR_ADMIN_PASSWORD \
--handle user.YOURAPPDOMAIN \
--email user@example.com \
--password yourpassword
@@ -69,10 +63,25 @@ Create an invite code:
```bash
abra app run YOURAPPDOMAIN app -- \
goat pds admin account create-invite \
--admin-password "$(abra app secret get YOURAPPDOMAIN pds_admin_password v1)"
goat pds admin create-invites \
--admin-password YOUR_ADMIN_PASSWORD
```
## Usage
Once you've created an account (see above), you can log in with any
ATProto-compatible client:
1. Open [bsky.app](https://bsky.app) (or another client like Graysky, Sky.app,
etc.)
2. On the login screen, tap **Hosting provider** (or **Custom PDS** depending on
the client)
3. Enter your PDS hostname: `YOURAPPDOMAIN`
4. Log in with the handle and password you used when creating the account
Your handle will be `user.YOURAPPDOMAIN` by default (a subdomain handle). You
can switch to a custom domain handle — see **Handle configuration** below.
## Handle configuration
User handles on a PDS can work in two ways:
@@ -86,6 +95,24 @@ User handles on a PDS can work in two ways:
`did=did:plc:<their-did>`. This works without any additional server
configuration.
## DNS setup
At minimum, create an A record pointing your PDS domain to your server:
```
pds.example.com A <server-ip>
```
For subdomain handles, also add a wildcard record:
```
*.pds.example.com A <server-ip>
```
[`abra`]: https://git.coopcloud.tech/coop-cloud/abra
[`coop-cloud/traefik`]: https://git.coopcloud.tech/coop-cloud/traefik
## TLS architecture (Caddy sidecar)
This recipe uses a **Caddy sidecar** for TLS instead of letting Traefik terminate
@@ -114,19 +141,12 @@ Caddy obtains the TLS certificate from Let's Encrypt. Subsequent requests are in
No changes to the Traefik recipe are needed — the TCP passthrough is configured
entirely via deploy labels on the Caddy service in this recipe's `compose.yml`.
## DNS setup
## About
At minimum, create an A record pointing your PDS domain to your server:
A [Bluesky PDS](https://github.com/bluesky-social/pds) (Personal Data Server)
is a self-hosted server for ATProto. This is a co-op cloud recipe for a PDS
as implemented by bluesky, although other pds implementations exist such as [cocoon](https://tangled.org/hailey.at/cocoon), [tranquil-pds](https://tangled.org/tranquil.farm/tranquil-pds), [pegasus](https://tangled.org/futur.blue/pegasus) and [rsky-pds](https://github.com/blacksky-algorithms/rsky/tree/main/rsky-pds).
```
pds.example.com A <server-ip>
```
# ❃
For subdomain handles, also add a wildcard record:
```
*.pds.example.com A <server-ip>
```
[`abra`]: https://git.coopcloud.tech/coop-cloud/abra
[`coop-cloud/traefik`]: https://git.coopcloud.tech/coop-cloud/traefik
recipe maintained by @notplants
+1 -1
View File
@@ -1,2 +1,2 @@
export ENTRYPOINT_VERSION=v1
export ENTRYPOINT_VERSION=v2
export CADDYFILE_VERSION=v1
+2 -8
View File
@@ -3,7 +3,7 @@ version: "3.8"
services:
app:
image: ghcr.io/bluesky-social/pds:0.4
image: ghcr.io/bluesky-social/pds:0.4.5027
networks:
- internal
environment:
@@ -11,12 +11,6 @@ services:
- PDS_DATA_DIRECTORY=/pds
- PDS_BLOBSTORE_DISK_LOCATION=/pds/blocks
- PDS_BLOB_UPLOAD_LIMIT=${PDS_BLOB_UPLOAD_LIMIT:-104857600}
- PDS_DID_PLC_URL=${PDS_DID_PLC_URL:-https://plc.directory}
- PDS_BSKY_APP_VIEW_URL=${PDS_BSKY_APP_VIEW_URL:-https://api.bsky.app}
- PDS_BSKY_APP_VIEW_DID=${PDS_BSKY_APP_VIEW_DID:-did:web:api.bsky.app}
- PDS_REPORT_SERVICE_URL=${PDS_REPORT_SERVICE_URL:-https://mod.bsky.app}
- PDS_REPORT_SERVICE_DID=${PDS_REPORT_SERVICE_DID:-did:plc:ar7c4by46qjdydhdevvrndac}
- PDS_CRAWLERS=${PDS_CRAWLERS:-https://bsky.network}
- PDS_EMAIL_SMTP_URL=${PDS_EMAIL_SMTP_URL:-}
- PDS_EMAIL_FROM_ADDRESS=${PDS_EMAIL_FROM_ADDRESS:-}
- PDS_INVITE_REQUIRED=${PDS_INVITE_REQUIRED:-true}
@@ -42,7 +36,7 @@ services:
max_attempts: 5
labels:
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "coop-cloud.${STACK_NAME}.version=0.1.1+v0.4"
- "coop-cloud.${STACK_NAME}.version=0.4.0+0.4.5027"
- "backupbot.backup=true"
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/xrpc/_health"]
+1 -1
View File
@@ -5,4 +5,4 @@ export PDS_JWT_SECRET=$(cat /run/secrets/pds_jwt_secret)
export PDS_ADMIN_PASSWORD=$(cat /run/secrets/pds_admin_password)
export PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=$(cat /run/secrets/pds_plc_rotation_key)
exec node --enable-source-maps index.js
exec node --enable-source-maps index.ts