From 2f19ca0d09dfff725b8b5f3fbb927236e3cb1ec7 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn Date: Fri, 28 Aug 2026 15:31:36 -0500 Subject: [PATCH 1/2] posts: add explainer about setting up my own PDS for atproto --- .../index.md | 203 ++++++++++++++++++ .../og-image.png | Bin 0 -> 59304 bytes 2 files changed, 203 insertions(+) create mode 100644 src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md create mode 100644 src/Blog/wwwroot/posts/atproto-personal-data-server-setup/og-image.png diff --git a/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md b/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md new file mode 100644 index 0000000..a7765d5 --- /dev/null +++ b/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md @@ -0,0 +1,203 @@ +```json meta +{ + "title": "How to Run Your Own Personal Data Server", + "lead": "The idea and vision behind the At protocol really excites me as someone who has spent a lot of time over the last decade creating content on the web. At the core of that excitement is the ability to host your own data server where all the content you publish to the atmosphere is stored. I recently went through the process of migrating my existing atproto identity to my own PDS and wanted to share how I did it.", + "isPublished": true, + "publishedAt": "2026-08-28", + "openGraphImage": "posts/atproto-personal-data-server-setup/og-image.png" +} +``` + +I've spent a good amount of my adult life making things on the internet. It started my senior year of high school with [this](https://intellectualfitness.weebly.com/) not so impressive Weebly website. At the time and still to this day I was a pretty big nerd about all things physical fitness and found it was cool to be able to share the things I was learning and studying with other people. Obviously I'd be lying too if I didn't also want it to be a way to establish myself as a bit of an - albeit tiny - authority on the topic to my friends and family. It wasn't too much earlier than that when I got introduced to social media on the internet with a Facebook account and not too much later before I started using it and other social platforms as again a way to share content about what I was passionate about at that time and build a bit of a personal brand. And while what I make and how I make it has changed over the last decade or so my enjoyment for creating content really hasn't ever left me. + +However, the internet of today isn't the same as it was back then and I imagine that will continue to be the case as time goes on. Platforms come, many go, and some stay and even those that stay change and evolve over time losing and increasing relevance depending on whatever else is going on in the world. A pain point for me as someone who has a regular life with a day job, kids, and a wife has always been that I've found it quite a bit exhausting to always have to be maintaining the different identities I have across platforms like [Twitter](https://x.com/stevanfreeborn), [Facebook](https://www.facebook.com/stevanreece), [Instagram](https://www.instagram.com/stevan.freeborn/), [YouTube](https://youtube.stevanfreeborn.com), [Twitch](https://twitch.stevanfreeborn.com), etc. Not to mention it is a pain that anything I share on one of those only exists there and anyone who follows me on one of those only follows me there. The social web and let's be honest for the most part today the social web is pretty much a bunch of siloed, walled gardens that sit next to each other. From a content creation perspective as well as just from a general user perspective this sucks. If I ever want to stop using one platform it means I stop getting the content from the people I enjoy following and the small subset who enjoy following me don't get any of my content either. Granted I know this isn't quite the way content gets distributed to folks on these platforms today, but I think you get my point. Our identities and our data on these apps exist only and exclusively to those apps. + +It was because of this reason I got really excited about the [At protocol](https://atproto.com/) when I learned about it. I signed up for [Bluesky](https://bsky.app/) likely for a lot of the same reasons everyone else did. Twitter became some strange, lesser form of its former self and if you liked that style of social media Bluesky seemed to present a great alternative experience. At the time though I knew nothing about the underlying technology or how absolutely kickass the whole vision of it was. See the idea behind the At protocol is basically that the social web should be like the original web was - open, decentralized, interoperable. Users should be able to establish an identity on the network and then own and control the content they publish on that network. I'm a fairly new beginner when it comes to all things atproto and many smarter people have done a better job writing about what the At protocol is, how it works, and how you can try to conceptually think about it so I'll just link to those folks below. + +- [https://atproto.com/guides/understanding-atproto](https://atproto.com/guides/understanding-atproto) +- [https://overreacted.io/open-social/](https://overreacted.io/open-social/) +- [https://overreacted.io/a-social-filesystem/](https://overreacted.io/a-social-filesystem/) + +The point of this post though is to talk through a recent project I did related to the At protocol that was fun and also highlights one of the coolest parts about the protocol and network. Remember when I said users get to own and control their data? Well that is exactly the case and one of the most fundamental pieces of enabling that is the idea of a Personal Data Server (PDS). This is basically the home for all the data that you publish to the [atmosphere](https://atproto.com/guides/glossary#atmosphere) (a fun way to refer to the ecosystem of atproto). A PDS might sound like a new concept to you, but if you are on Bluesky you are using a PDS it is just likely one supplied by Bluesky. + +The [Personal Data Server](https://atproto.com/specs/account) is a part of the [At protocol specification](https://atproto.com/specs/atp) which means anyone can build their own implementation of it and then anyone is free to host those implementations and users are free to pick and choose where they specifically choose to host their data on one of these PDSs. You can even host your own on your own hardware as I've chosen to do and how I did it is what I want to share with you. This likely won't serve as a great step by step tutorial given the topology of my home lab probably is unique to me, but maybe some of what I share can help you and at the very least pique your interest into learning more about the At protocol and getting involved with it. + +The first step in setting up a PDS is deciding on which implementation you are going to use. There are actually quite a few floating around in the wild, but the vast majority from what I looked at seem to be more of toy or hobby projects rather than anything serious that you'd actually want to deploy and run in production. There are though some options and I'll just share the ones I considered below: + +- [Bluesky PDS](https://github.com/bluesky-social/pds) +- [Cocoon](https://github.com/haileyok/cocoon) +- [Tranquil](https://tangled.org/tranquil.farm/tranquil-pds) + +Ultimately I chose to stick with what looks to be the oldest, most used, and probably best supported and maintained - which to no surprise - is Bluesky's own implementation. I know it is a pretty boring choice, but when it comes to picking technologies that I am actually going to trust to support my own personal needs for the foreseeable future boring and reliable sound wonderfully attractive to me. Not to mention it never hurts to be using something a lot of other people are also using and which likely means there is a lot of freely available helpful information about out on the web...because you know the web is awesome like that. Kind of illustrates the point why you'd want the social web to be similar. + +With a PDS implementation selected it is now time to figure out the plan for deployment. This is where things are going to get uber specific to me so let me just give you the lay of the land a bit for myself when it comes to self-hosting things like this. I like to use VPSs either hosted in my homelab or in someone's cloud. I like to proxy traffic from the outside world to my servers through [Cloudflare](https://cloudflare.com). I like to use [Nginx](https://nginx.org/) as a webserver. And whenever possible I like to run things in containers on the host. I don't think any of that is edgy or really notable, but those technologies are ubiquitous, well-supported, and don't have much of a cost to them at all. + +I don't want to get into the details too much on the DNS and networking side of things here, but I do want to highlight what steps I took in preparation just to make sure I had things properly configured to make sure that traffic could reach my server. I started by making sure that there was a DNS record entry for the domain I want the PDS to be available at pointing to the machine where the PDS container will be running. Then I made sure I had an nginx configuration setup to properly route traffic received at the machine for this domain to the PDS which will be running in a container. Below is an example of what that config looks like: + +```conf +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +server { + server_name ; + + listen 80; + listen [::]:80; + + return 302 https://$server_name$request_uri; +} + +server { + server_name ; + + listen 443 ssl http2; + listen [::]:443 ssl http2; + + ssl_certificate /etc/ssl/cloudflare_cert.pem; + ssl_certificate_key /etc/ssl/cloudflare_key.pem; + ssl_client_certificate /etc/ssl/cloudflare.crt; + ssl_verify_client on; + + location / { + client_max_body_size 512M; + proxy_pass http://localhost:3737; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +Pretty standard typical Nginx reverse proxy stuff. Seriously I don't mean to skip over anything here just everyone's exact deployment environment is likely going to be different especially when we get into the self-hosting world that I don't want to belabor any of it more than what is necessary. If you have questions you can always hit me up on the atmosphere here. + +The [Bluesky PDS](https://github.com/bluesky-social/pds) implementation already comes containerized and if you are starting with a fresh machine they've pretty much done all the heavy lifting for you with great install and setup [script](https://github.com/bluesky-social/pds#installing-on-ubuntu-200422042404-and-debian-111213) you can use to get up and running in no time aside from any potential networking or DNS management you might need to do on your own. In my case though I'm not deploying to a fresh machine. The machine I'm using is a shared host that I use for several other things and is already setup to handle traffic proxied through Cloudflare and has Nginx already running on it as a reverse proxy so using the out-of-the-box setup that Bluesky provides didn't work for me. The changes though I had to make were really minimal. + +I basically stole the necessary services configurations for their official docker compose file and created one for myself that looks like this: + +```yml +services: + pds: + container_name: pds + image: ghcr.io/bluesky-social/pds:latest + restart: always + ports: + - "3737:3000" + extra_hosts: + - "host.docker.internal:host-gateway" + volumes: + - type: bind + source: . + target: /pds + env_file: + - ./pds.env + watchtower: + container_name: watchtower + image: ghcr.io/nicholas-fedor/watchtower:latest + restart: always + volumes: + - type: bind + source: /var/run/docker.sock + target: /var/run/docker.sock + environment: + WATCHTOWER_CLEANUP: true + WATCHTOWER_SCHEDULE: "@midnight" +``` + +> [!NOTE] +> If you aren't familiar with [watchtower](https://github.com/nicholas-fedor/watchtower) like I was it is basically a docker container that you can run in your stack that will manage automatically updating the version of the containers you are using without you having to manually do it yourself. It isn't a mandatory inclusion, but I figured why not? + +You'll likely notice that the `pds` container does expect to receive some configuration through environment variables which we are supplying with a `.env` file. These variables and what they do are explained thoroughly in [Bluesky's documentation](https://github.com/bluesky-social/pds#environment-variables). The values for some of them will also require you to run some commands to generate what you'll need. + +`PDS_JWT_SECRET` + +```sh +openssl rand --hex 16 +``` + +`PDS_ADMIN_PASSWORD` + +```sh +openssl rand --hex 16 +``` + +`PDS_PLC_ROTATION_KEY` + +```sh +openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32 +``` + +Below is what my final `.env` file looks like albeit I obviously populated the actual values with the values I obtained in the prior steps. + +```env +PDS_HOSTNAME= +PDS_JWT_SECRET= +PDS_ADMIN_PASSWORD= +PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX= +PDS_DATA_DIRECTORY= +PDS_BLOBSTORE_DISK_LOCATION= +PDS_BLOB_UPLOAD_LIMIT=314572800 +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_RATE_LIMITS_ENABLED=true +PDS_INVITE_REQUIRED=true # !IMPORTANT: Prevents just any random from creating an account on your PDS +PDS_EMAIL_SMTP_URL=smtp://:@host.docker.internal/?servername= +PDS_EMAIL_FROM_ADDRESS= +PDS_CONTACT_EMAIL_ADDRESS= +``` + +Assuming you've got the compose and `.env` file created and they are situated in the proper places relative to where one expects the other all that is left to do to get the PDS up is run `docker compose up -d`. If all goes well the PDS container should start and be running ready for you to use. You can do some simple smoke testing to verify. + +```sh +# Verify the container responds locally +curl http://127.0.0.1:/xrpc/_health + +# Verify the container responds remotely +curl https:///xrpc/_health + +# Verify you can establish a websocket connection to the container +wsdump "wss:///xrpc/com.atproto.sync.subscribeRepos?cursor=0" +``` + +If all those check out you can be pretty confident you now have your very own PDS that you can use for all your things atproto related. However first you'll need to establish an account on the PDS, perform the needful to claim the handle you want, and actually start using that account and identity to do things on the atmosphere. + +Lucky for us the pds container contains all the tools you need for the job, specifically this CLI tool called [`goat`](https://github.com/bluesky-social/goat). This is a tool that enables you to do all the necessary bits of administration you'll need to do for creating/updating accounts, creating invite codes, etc. In this case we can keep it pretty simple and get our first account created like so: + +```sh +docker exec pds goat pds admin account create \ + --handle \ + --email \ + --password +``` + +> [!NOTE] +> One thing I did run into here is that the PDS expects the accounts you create to use a handle that is a subdomain of the domain your pds is located at. For example, if your PDS's domain is pds.open.social then the handles for new accounts need to be something like .pds.open.social. You aren't restricted to this you can update the handle after you create the account to something different. Say change .pds.open.social to .open.social or what have you. + +After running that account creation command you should have received a DID for the new account something like this `did:plc:74yqep5iwq2kr2y6n7fn2e4c`. You'll want to keep that handy as you'll need it so that you can take the necessary steps to establish the connection between your chosen handle and this account you've created on your PDS. To do this all you really have to do is go to wherever you manage DNS records for the domain of your chosen handle and create a `TXT` record like the one below: + +```txt +_atproto. TXT did=did:plc: +``` + +You can verify that you've created the record correctly and that your handle is now properly resolving to your account by running the following command that again makes use of `goat` in the docker container. + +```sh +docker exec pds goat did resolve-handle --handle .open.social +``` + +If that was successful you can be confident you've got an account that is hosted on your PDS and whose data will be stored on your PDS, but whose identity can be used all around the atmosphere. Easiest way to test is just by signing in to your account using [Bluesky](https://bsky.app). You'll need to make sure that you specifically set the hosting provider to your pds using the domain you configured to reach it at. + +Couple of things I want to touch on related to this set up. The first is related to allowing my PDS to send emails. The PDS implementation supports this by supplying the necessary information as the following environment variables: `PDS_EMAIL_SMTP_URL`, `PDS_EMAIL_FROM_ADDRESS`, and `PDS_CONTACT_EMAIL_ADDRESS`. The underlying host I deployed my PDS to is already configured to send emails using a relay service so I just set up a local account for the PDS to use for this purpose, but you can obviously choose the solution that best fits your setup and needs. The second is that I opted to mount a TrueNAS dataset to the host machine and use a dead simple shell script and cron job to regularly back up the locations that the PDS is storing data in as specified by these environment variables: `PDS_DATA_DIRECTORY` and `PDS_BLOBSTORE_DISK_LOCATION`. I think this is an important consideration given that you are now 100% in control and thus responsible for the safety and retention of the data you publish to the atmosphere as it all ends up back here on your PDS. I can just hear Uncle Ben now...happy to share more specifics about these two things if you have questions. Reach out to me [here](https://bsky.app/profile/stevanfreeborn.com). + +Last thing I want to touch on before wrapping up is on account migration because so far we've only really gone through the necessary steps for establishing a new PDS with a new account, but chances are if you are already on Bluesky you'll want to also migrate that existing account to this new PDS. Originally I thought this was going to be a topic for a whole separate blog post which it definitely is if you want to go the manual route. Lucky for us though the manual route isn't the only option anymore. There is this really wonderful tool called [PDS MOOver](https://pdsmoover.com/) created by a gentleman named [Bailey Townsend](https://bsky.app/profile/pds.dad) that will do all the work for you and if I had to guess with far more consideration for everything that can go wrong than you'll be able to muster yourself. The tool also has support for maintaining a backup of your PDS data for you as well which can help alleviate some of the pressure you may have felt from my comments above regarding being responsible for keeping your data safe. I'm using it myself. Again if you run into any troubles yourself using the tool feel free to reach out to me [here](https://bsky.app/profile/stevanfreeborn.com) and I'll be happy to try and steer you in the right direction. + +Alright I've taken up more than enough of your time today with my atproto excitement and retelling, but I hope I've sparked your interest even a little about what atproto has to offer both users and content creators and maybe even enough to get you to start getting involved with it yourself. I know things can look pretty grim right now for the general state of the internet, but to me atproto presents a really exciting future for what could be and I'd like to try to do my part to help make it so by using it, talking about it, and sharing it with others. diff --git a/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/og-image.png b/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e642f51fd9590349cc92a2699d6281034f2e1cad GIT binary patch literal 59304 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
37Em22TI;u?B+_VcKm
zB52fQp4GNxkk+w{J#k;qmXD+p6UIwXCz9#BxS#tkZP+z)D5Ru4)>P&2@23d#T?_HW
z?=pPMcGU~DzSDHcygOeXYQEDF_`?|iLDr*vi5M#Hr<=>LwoEz#E?GJ&SKc$QDcMkx+A-ck(&vc^QqiB
zmv=tcIB!L5Mz~9)XjpsJCpygUdCB{)q%XHYmJf%jOfJb>V0*aUpzG>m7Q
z@!HHwT3s<$-nl>z>*c2mi;jcF>7p2Yif)EtR!*p_kn!>f%|oid73p
z8P$WIo!;^Le>8mxPpvC~m)Wmbmm{|aBW7}UxdVw>tLRA7B10Uktn`(
zudu}X5CmC&ZR$Af%>k|>TH~omvU$@5k#`e;o?L|W3Lm~y^SVru2r&$>*!Q?8aK~DW
zcxjUDm)5cMN3}Fjjh%lBWMVKp2R`1}T)=kSEE_82oOj(E1*rlNx-ouj1G8Z7OOLQ|5!+>MaN7>d)HIK{@PJgBkqZn>w=GEwCAV#UP
zYdnf)ZI%ttSR+R25W1icMryJnoPI?EXK?7hFMLg8Mr3*RWJ_AbvGAy*1|+zXzGw-(M_E&p%c!b=?hDc
zKI;$W7F+Ibu*V58hpQpen~`EV@0EJfeZfef;
z%|logBX+>Y#4Y6>chJ`PlC~=6qzoGJW%9(k^hPT81D`;EO3G2Ul%m#u9m@_Kl~s6*
zqsP4TH<{*~bqrM(;&pP+IVR!NZOM|ttp;BPG-o#d%cYwO(C!!*9*<^TRMhn=tJh{i
zoA9a_OVLk$pS$1pXAqRQ)LD?R6De*SRJrOOJFCpZ#UP)To6@%
zPtcLCHOz1CUYXFnCyQp=~)#O8j-!FF*+WGR(93ABWLhe#PKz*^+7JIW(@F
zIZJ3W_|rFvk5L~#*o;gP1S^N#b2yYV1)uKIsB?)KYVe!ryMzKC#7o&NM@0!~9f{BE
zQ+q!I^(kG*s-3WCVlHZJZY4+9ta$PE`nmZ=CJ7WJJ`KA{Z6F2*k6;xjpJpydt47y)
zwPw#*SPgR7<{&>7Q|rP$Nu5VkLAaIzv{DE1a|V>gIaqJWrha9Y?g2wr1;DuBP9~nUecbTe_aO(Az(SS4BbI-J
zHz8qh$29S4y#Z%#!zztsRI*ThB(jGo#Xoee8jcwPFuy(!xS*%HwPv_at!BGHYlv;K*#9_TV
zDH#i)tCHrLCojCdp()wg*1eLNf5-
wNJ#(Gr|o&to@^>%@!611NO6{Ji~QpsE~ZCM&$zryhDHNnLfXpn0%__00C%Mt@Bjb+

literal 0
HcmV?d00001

-- 
2.54.0


From 5540a492caca8ee0b65b58e7e3b62e6bc1901803 Mon Sep 17 00:00:00 2001
From: Stevan Freeborn 
Date: Fri, 28 Aug 2026 15:37:16 -0500
Subject: [PATCH 2/2] posts: add headings

---
 .../atproto-personal-data-server-setup/index.md  | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md b/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md
index a7765d5..16ae713 100644
--- a/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md
+++ b/src/Blog/wwwroot/posts/atproto-personal-data-server-setup/index.md
@@ -12,6 +12,8 @@ I've spent a good amount of my adult life making things on the internet. It star
 
 However, the internet of today isn't the same as it was back then and I imagine that will continue to be the case as time goes on. Platforms come, many go, and some stay and even those that stay change and evolve over time losing and increasing relevance depending on whatever else is going on in the world. A pain point for me as someone who has a regular life with a day job, kids, and a wife has always been that I've found it quite a bit exhausting to always have to be maintaining the different identities I have across platforms like [Twitter](https://x.com/stevanfreeborn), [Facebook](https://www.facebook.com/stevanreece), [Instagram](https://www.instagram.com/stevan.freeborn/), [YouTube](https://youtube.stevanfreeborn.com), [Twitch](https://twitch.stevanfreeborn.com), etc. Not to mention it is a pain that anything I share on one of those only exists there and anyone who follows me on one of those only follows me there. The social web and let's be honest for the most part today the social web is pretty much a bunch of siloed, walled gardens that sit next to each other. From a content creation perspective as well as just from a general user perspective this sucks. If I ever want to stop using one platform it means I stop getting the content from the people I enjoy following and the small subset who enjoy following me don't get any of my content either. Granted I know this isn't quite the way content gets distributed to folks on these platforms today, but I think you get my point. Our identities and our data on these apps exist only and exclusively to those apps.
 
+## What is a Personal Data Server (PDS)?
+
 It was because of this reason I got really excited about the [At protocol](https://atproto.com/) when I learned about it. I signed up for [Bluesky](https://bsky.app/) likely for a lot of the same reasons everyone else did. Twitter became some strange, lesser form of its former self and if you liked that style of social media Bluesky seemed to present a great alternative experience. At the time though I knew nothing about the underlying technology or how absolutely kickass the whole vision of it was. See the idea behind the At protocol is basically that the social web should be like the original web was - open, decentralized, interoperable. Users should be able to establish an identity on the network and then own and control the content they publish on that network. I'm a fairly new beginner when it comes to all things atproto and many smarter people have done a better job writing about what the At protocol is, how it works, and how you can try to conceptually think about it so I'll just link to those folks below.
 
 - [https://atproto.com/guides/understanding-atproto](https://atproto.com/guides/understanding-atproto)
@@ -22,6 +24,8 @@ The point of this post though is to talk through a recent project I did related
 
 The [Personal Data Server](https://atproto.com/specs/account) is a part of the [At protocol specification](https://atproto.com/specs/atp) which means anyone can build their own implementation of it and then anyone is free to host those implementations and users are free to pick and choose where they specifically choose to host their data on one of these PDSs. You can even host your own on your own hardware as I've chosen to do and how I did it is what I want to share with you. This likely won't serve as a great step by step tutorial given the topology of my home lab probably is unique to me, but maybe some of what I share can help you and at the very least pique your interest into learning more about the At protocol and getting involved with it.
 
+## Choosing a PDS Implementation
+
 The first step in setting up a PDS is deciding on which implementation you are going to use. There are actually quite a few floating around in the wild, but the vast majority from what I looked at seem to be more of toy or hobby projects rather than anything serious that you'd actually want to deploy and run in production. There are though some options and I'll just share the ones I considered below:
 
 - [Bluesky PDS](https://github.com/bluesky-social/pds)
@@ -30,6 +34,8 @@ The first step in setting up a PDS is deciding on which implementation you are g
 
 Ultimately I chose to stick with what looks to be the oldest, most used, and probably best supported and maintained - which to no surprise - is Bluesky's own implementation. I know it is a pretty boring choice, but when it comes to picking technologies that I am actually going to trust to support my own personal needs for the foreseeable future boring and reliable sound wonderfully attractive to me. Not to mention it never hurts to be using something a lot of other people are also using and which likely means there is a lot of freely available helpful information about out on the web...because you know the web is awesome like that. Kind of illustrates the point why you'd want the social web to be similar.
 
+## Deployment Architecture & Reverse Proxy Setup
+
 With a PDS implementation selected it is now time to figure out the plan for deployment. This is where things are going to get uber specific to me so let me just give you the lay of the land a bit for myself when it comes to self-hosting things like this. I like to use VPSs either hosted in my homelab or in someone's cloud. I like to proxy traffic from the outside world to my servers through [Cloudflare](https://cloudflare.com). I like to use [Nginx](https://nginx.org/) as a webserver. And whenever possible I like to run things in containers on the host. I don't think any of that is edgy or really notable, but those technologies are ubiquitous, well-supported, and don't have much of a cost to them at all.
 
 I don't want to get into the details too much on the DNS and networking side of things here, but I do want to highlight what steps I took in preparation just to make sure I had things properly configured to make sure that traffic could reach my server. I started by making sure that there was a DNS record entry for the domain I want the PDS to be available at pointing to the machine where the PDS container will be running. Then I made sure I had an nginx configuration setup to properly route traffic received at the machine for this domain to the PDS which will be running in a container. Below is an example of what that config looks like:
@@ -75,6 +81,8 @@ server {
 
 Pretty standard typical Nginx reverse proxy stuff. Seriously I don't mean to skip over anything here just everyone's exact deployment environment is likely going to be different especially when we get into the self-hosting world that I don't want to belabor any of it more than what is necessary. If you have questions you can always hit me up on the atmosphere here. 
 
+## Running PDS in Docker
+
 The [Bluesky PDS](https://github.com/bluesky-social/pds) implementation already comes containerized and if you are starting with a fresh machine they've pretty much done all the heavy lifting for you with great install and setup [script](https://github.com/bluesky-social/pds#installing-on-ubuntu-200422042404-and-debian-111213) you can use to get up and running in no time aside from any potential networking or DNS management you might need to do on your own. In my case though I'm not deploying to a fresh machine. The machine I'm using is a shared host that I use for several other things and is already setup to handle traffic proxied through Cloudflare and has Nginx already running on it as a reverse proxy so using the out-of-the-box setup that Bluesky provides didn't work for me. The changes though I had to make were really minimal.
 
 I basically stole the necessary services configurations for their official docker compose file and created one for myself that looks like this:
@@ -168,6 +176,8 @@ curl https:///xrpc/_health
 wsdump "wss:///xrpc/com.atproto.sync.subscribeRepos?cursor=0"
 ```
 
+## Creating Your Account & Domain Handle
+
 If all those check out you can be pretty confident you now have your very own PDS that you can use for all your things atproto related. However first you'll need to establish an account on the PDS, perform the needful to claim the handle you want, and actually start using that account and identity to do things on the atmosphere.
 
 Lucky for us the pds container contains all the tools you need for the job, specifically this CLI tool called [`goat`](https://github.com/bluesky-social/goat). This is a tool that enables you to do all the necessary bits of administration you'll need to do for creating/updating accounts, creating invite codes, etc. In this case we can keep it pretty simple and get our first account created like so:
@@ -196,8 +206,14 @@ docker exec pds goat did resolve-handle --handle .open.social
 
 If that was successful you can be confident you've got an account that is hosted on your PDS and whose data will be stored on your PDS, but whose identity can be used all around the atmosphere. Easiest way to test is just by signing in to your account using [Bluesky](https://bsky.app). You'll need to make sure that you specifically set the hosting provider to your pds using the domain you configured to reach it at.
 
+## Operations: Email Relay & Backups
+
 Couple of things I want to touch on related to this set up. The first is related to allowing my PDS to send emails. The PDS implementation supports this by supplying the necessary information as the following environment variables: `PDS_EMAIL_SMTP_URL`, `PDS_EMAIL_FROM_ADDRESS`, and `PDS_CONTACT_EMAIL_ADDRESS`. The underlying host I deployed my PDS to is already configured to send emails using a relay service so I just set up a local account for the PDS to use for this purpose, but you can obviously choose the solution that best fits your setup and needs. The second is that I opted to mount a TrueNAS dataset to the host machine and use a dead simple shell script and cron job to regularly back up the locations that the PDS is storing data in as specified by these environment variables: `PDS_DATA_DIRECTORY` and `PDS_BLOBSTORE_DISK_LOCATION`. I think this is an important consideration given that you are now 100% in control and thus responsible for the safety and retention of the data you publish to the atmosphere as it all ends up back here on your PDS. I can just hear Uncle Ben now...happy to share more specifics about these two things if you have questions. Reach out to me [here](https://bsky.app/profile/stevanfreeborn.com).
 
+## Migrating an Existing Account
+
 Last thing I want to touch on before wrapping up is on account migration because so far we've only really gone through the necessary steps for establishing a new PDS with a new account, but chances are if you are already on Bluesky you'll want to also migrate that existing account to this new PDS. Originally I thought this was going to be a topic for a whole separate blog post which it definitely is if you want to go the manual route. Lucky for us though the manual route isn't the only option anymore. There is this really wonderful tool called [PDS MOOver](https://pdsmoover.com/) created by a gentleman named [Bailey Townsend](https://bsky.app/profile/pds.dad) that will do all the work for you and if I had to guess with far more consideration for everything that can go wrong than you'll be able to muster yourself. The tool also has support for maintaining a backup of your PDS data for you as well which can help alleviate some of the pressure you may have felt from my comments above regarding being responsible for keeping your data safe. I'm using it myself. Again if you run into any troubles yourself using the tool feel free to reach out to me [here](https://bsky.app/profile/stevanfreeborn.com) and I'll be happy to try and steer you in the right direction.
 
+## Conclusion
+
 Alright I've taken up more than enough of your time today with my atproto excitement and retelling, but I hope I've sparked your interest even a little about what atproto has to offer both users and content creators and maybe even enough to get you to start getting involved with it yourself. I know things can look pretty grim right now for the general state of the internet, but to me atproto presents a really exciting future for what could be and I'd like to try to do my part to help make it so by using it, talking about it, and sharing it with others.
-- 
2.54.0