__ __
/\ \__ /\ \__
__ \ \ ,_\ _____ _ __ ___\ \ ,_\ ___
/'__'\ \ \ \/ /\ '__'\/\''__\/ __'\ \ \/ / __'\
/\ \L\.\_\ \ \_\ \ \L\ \ \ \//\ \L\ \ \ \_/\ \L\ \
\ \__/.\_\\ \__\\ \ ,__/\ \_\\ \____/\ \__\ \____/
\/__/\/_/ \/__/ \ \ \/ \/_/ \/___/ \/__/\/___/
\ \_\
\/_/
This is an implementation of an ATProto PDS, built with Axum and Atrium. Heavily inspired by David Buchanan's millipds. This implementation forked from the azure-rust-app starter template.
This PDS implementation uses a SQLite database to store private account information and file storage to store canonical user data.
If you want to see this PDS in action, there is a live account hosted by this PDS at @test.justinm.one!
Warning
This PDS is undergoing heavy development. Do NOT use this to host your primary account or any important data!
cargo run
This is how much it costs to host the @test.justinm.one account:
- $20/mo
- $13/mo: Azure Application Service
- $5/mo: Azure Container Registry
- $1/mo: Azure Storage Account
This is without optimizing for costs. The PDS can likely be made much cheaper.
* migrations/ - SQLite database migrations
* src/
* endpoints/ - ATProto API endpoints
* auth.rs - Authentication primitives
* config.rs - Application configuration
* did.rs - Decentralized Identifier helpers
* error.rs - Axum error helpers
* firehose.rs - ATProto firehose producer
* main.rs - Main entrypoint
* metrics.rs - Definitions for telemetry instruments
* plc.rs - Functionality to access the Public Ledger of Credentials
* storage.rs - Helpers to access user repository storage
- Authentication
- Storage backend abstractions
- Azure blob storage backend
- Backblaze b2(?)
- Telemetry
- Metrics (counters/gauges/etc)
- Exporters for common backends (Prometheus/etc)
- Service proxying
- UG /xrpc/_health (undocumented, but impl by reference PDS)
- com.atproto.identity
- AP /xrpc/com.atproto.identity.updateHandle
- AP /xrpc/com.atproto.identity.requestPlcOperationSignature
- AP /xrpc/com.atproto.identity.signPlcOperation
- UG /xrpc/com.atproto.identity.resolveHandle
- com.atproto.server
- UG /xrpc/com.atproto.server.describeServer
- UP /xrpc/com.atproto.server.createAccount
- AP /xrpc/com.atproto.server.createInviteCode
- UP /xrpc/com.atproto.server.createSession
- AG /xrpc/com.atproto.server.getServiceAuth
- AG /xrpc/com.atproto.server.getSession
- com.atproto.repo
- AP /xrpc/com.atproto.repo.applyWrites
- AP /xrpc/com.atproto.repo.createRecord
- AP /xrpc/com.atproto.repo.putRecord
- AP /xrpc/com.atproto.repo.deleteRecord
- UG /xrpc/com.atproto.repo.describeRepo
- UG /xrpc/com.atproto.repo.getRecord
- UG /xrpc/com.atproto.repo.listRecords
- AP /xrpc/com.atproto.repo.uploadBlob
- com.atproto.sync
- UG /xrpc/com.atproto.sync.getBlob
- UG /xrpc/com.atproto.sync.getBlocks
- UG /xrpc/com.atproto.sync.getLatestCommit
- UG /xrpc/com.atproto.sync.getRecord
- UG /xrpc/com.atproto.sync.getRepoStatus
- UG /xrpc/com.atproto.sync.getRepo
- UG /xrpc/com.atproto.sync.listBlobs
- UG /xrpc/com.atproto.sync.listRepos
- UG /xrpc/com.atproto.sync.subscribeRepos
az group create --name "webapp" --location southcentralus
az deployment group create --resource-group "webapp" --template-file .\deployment.bicep --parameters webAppName=testapp
az acr login --name <insert name of ACR resource here>
docker build -t <ACR>.azurecr.io/testapp:latest .
docker push <ACR>.azurecr.io/testapp:latest