Nachdem man einen eigenen Bluesky-Server anfangs nur in einem Sandbox-Netz betreiben konnte, ist der Zugang zum Hauptnetz nun offen.
Deshalb habe ich hier mal eine Anleitung geschrieben wie man einen eigenen Server betreiben kann.

Ich habe die ganze Anleitung mehr oder weniger aus dem offiziellen install.sh Script herausgefiltert da ich Apache als Reverse Proxy benutze und deshalb Caddy nicht installieren will/kann/muss und nur den PDS betreibe.

Also!
Als erstes erstelle ich mal eine Gruppe und einen User bluesky und füge den User dann der docker Grupe hinzu.

groupadd --system bluesky
useradd -m -d /opt/bluesky -s /bin/bash --system -g bluesky bluesky
usermod -aG docker bluesky

Nun wechsle ich zum Benutzer und erstelle ein Verzeichnis pds.

su - bluesky
mkdir pds

Dort erstelle ich eine .env-Datei um den Container zu konfigurieren.

PDS_HOSTNAME="bsky.pmj.rocks"
PDS_JWT_SECRET="$(openssl rand --hex 16)"
PDS_ADMIN_PASSWORD="$(openssl rand --hex 16)"
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX="$(openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32)"

cat <<PDS_CONFIG | tee ~/pds/pds.env
PDS_HOSTNAME=${PDS_HOSTNAME}
PDS_JWT_SECRET=${PDS_JWT_SECRET}
PDS_ADMIN_PASSWORD=${PDS_ADMIN_PASSWORD}
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX}
PDS_DATA_DIRECTORY=/pds
PDS_BLOBSTORE_DISK_LOCATION=/pds/blocks
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
PDS_REPORT_SERVICE_URL=https://mod.bsky.app
PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac
PDS_CRAWLERS=https://bsky.network
LOG_ENABLED=true
PDS_CONFIG

Damit das Senden von Emails funktioniert müssen in der pds.env zwei weitere Variablen gesetzt werden (Quelle):

PDS_EMAIL_FROM_ADDRESS=Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
PDS_EMAIL_SMTP_URL=smtp(s)://username:passwort@server:port

Nun muss ich noch den Proxy konfigurieren.
Da ich Apache als Webserver benutze, benutze ich folgende Konfiguration für den Proxy.
Anmerkung: Der Webserver sollte bereits für die Domain konfiguriert sein, inklusive SSL da ich hier nur die zusätzlichen Konfigurationeinstellungen aufliste!

<VirtualHost bsky.pmj.rocks:443>
    {normale Apache Konfiguration für eine SSL Webseite}
    SSLProxyEngine On
  	SSLProxyVerify none
  	SSLProxyCheckPeerCN Off
  	SSLProxyCheckPeerName off
  	SSLProxyCheckPeerExpire off
  	
  	SSLHonorCipherOrder on
  	SSLCipherSuite EECDH+AESGCM:AES256+EECDH:AES128+EECDH
  	SSLCompression off
  	SSLSessionTickets off
  	SSLStaplingResponderTimeout 5
  	SSLStaplingReturnResponderErrors off
  	SSLUseStapling off
	
  	ProxyPreserveHost On
  	ProxyRequests On

    # Bei den folgenden 3 Zeilen bin ich nicht sicher ob es sie wirklich braucht
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule .* "ws://127.0.0.1:3300%{REQUEST_URI}" [P]
  	
  	ProxyPass / http://127.0.0.1:3300/
    ProxyPassReverse / http://127.0.0.1:3300/
</VirtualHost>

Jetzt starte ich den Container.
Anmerkung: Da bei mir Port 3000 schon durch andere node.js Dinge benutzt wird mappe ich den Port auf 3300.

cd
docker run -d --user "$(id -u):$(id -g)" --mount type=bind,source="$PWD/pds",target="/pds" --env-file "$PWD/pds/pds.env" -p 3300:3000 --name bluesky --restart always ghcr.io/bluesky-social/pds:latest

Nun benötige ich einen Invite-Code um mir später einen Account zu erstellen.

PDS_HOSTNAME="bsky.pmj.rocks"
PDS_ADMIN_PASSWORD="$(source ~/pds/pds.env && echo $PDS_ADMIN_PASSWORD)"

curl --silent \
  --show-error \
  --request POST \
  --user "admin:${PDS_ADMIN_PASSWORD}" \
  --header "Content-Type: application/json" \
  --data '{"useCount": 1}' \
  https://${PDS_HOSTNAME}/xrpc/com.atproto.server.createInviteCode

Der Invite Code wird in der Konsole ausgespuckt und man muss ihn dann von da kopieren um den Account zu erstellen.

Nun muss ich dem Netzwerk noch mitteilen dass mein Server da ist.

curl \
  --fail \
  --silent \
  --show-error \
  --request POST \
  --header "Content-Type: application/json" \
  --data "{\"hostname\": \"bsky.pmj.rocks\"}" \
  "https://bsky.network/xrpc/com.atproto.sync.requestCrawl" >/dev/null

Jetzt kann ich über die offizielle Web App meinen Benutzer auf meinem Server registrieren.
Dazu lade ich https://bsky.app ganz normal und wähle "Neues Konto erstellen".
Beim "Hosting-Anbieter" wählt man nun "Benutzerdefiniert" und gibt anschliessend die komplette URL des eigenen Servers an; in meinem Fall https://bsky.pmj.rocks.
Danach füllt man die Felder ganz normal aus, et voilà, man hat einen Account auf dem eigenen Bluesky PDS!