Пролог
Что такое Bluesky? Это децентрализованная социальная сеть для микроблогинга, созданная как альтернатива X (ex-Twitter). Bluesky PDS (Personal Data Server) — персональный сервер данных, личный «узел» в сети Bluesky на базе AT Protocol. Он хранит посты, подписки и профили пользователей, позволяя им контролировать свои данные и взаимодействовать с другими серверами сети.
Не хочется размусоливать тему зачем нужно размещать у себя «полудецентрализованный» Bluesky, вместо замечательных и многообразных fediverse проектов. Для меня лично это экономия ресурсов на не так уж и мощном NAS, плюс наличие интересных мне аккаунтов типа Eric Migicovsky или крупных брендов таких как Xbox.
Подготовка
Будем исходить из того, что у нас уже есть зарегистрированное доменное имя, PDS мы будем размещать на субдомене social.example.com, а псевдонимом Bluesky у нас будет корневое имя домена example.com. В настройках у регистратора домена нужно прописать эти A записи:
| Name | Type | TTL | Value |
| example.com | A | 600 | 12.34.56.78 |
| social.example.com | A | 600 | 12.34.56.78 |
При желании в качестве псевдонима и(или) при регистрации нескольких пользователей можно использовать субдомены. Таблица в таком случае будет выглядить примерно так:
| Name | Type | TTL | Value |
| example.com | A | 600 | 12.34.56.78 |
| social.example.com | A | 600 | 12.34.56.78 |
| username1.example.com | A | 600 | 12.34.56.78 |
| username2.example.com | A | 600 | 12.34.56.78 |
Страницу управления доменом не закрываем, после установки она нам ещё пригодится.
Переходим к Synology. В Настройки — Безопасность — Сертификат для всего вышеописанного получаем сертификат Let’s Encrypt.
Предположим, что папка общего доступа с именем docker у нас уже существует. В ней создаём ещё одну и называем её bluesky.
Дальше идём в Панель управления — Портал для входа — Дополнительно — Обратный прокси — Создать
Источник
Имя обратного прокси — Bluesky
Протокол — HTTPS
Имя хоста — social.example.com
Порт — 443
Включить HSTS — Включить
Место назначения
Протокол — HTTP
Имя хоста — 127.0.0.1
Порт — 3000
Во вкладке Пользовательский заголовок нужно добавить WebSocket. Всё тоже самое проделываем ещё и с корневым доменом (либо субдоменами, если пользователей несколько).
Запускаем службу SSH, если она отключена и подключаемся к Synology
Скачиваем образ Bluesky-PDS.
sudo docker pull ghcr.io/bluesky-social/pds:latestПоочерёдно вводим команды, записывая результаты в блокнот.
echo PDS_ADMIN_PASSWORD: $(openssl rand --hex 16)
echo PDS_JWT_SECRET: $(openssl rand --hex 16)
echo 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)Установка
В Container Manager на вкладке Образ находим ghcr.io/bluesky-social/pds и запускаем его. Имя контейнера произвольно, я выбрал bluesky-pds. Жмём Далее.
Локальный порт — 3000. Добавляем ранее созданную папку, с привязкой к /pds
Переменные добавляем по этому списку. Здесь менять ничего не надо. Если только значение PDS_BLOB_UPLOAD_LIMIT, это лимит загрузки в байтах. Здесь он ограничен 100МБ.
| PDS_DATA_DIRECTORY | /pds |
| PDS_BLOBSTORE_DISK_LOCATION | /pds/blocks |
| PDS_BLOB_UPLOAD_LIMIT | 104857600 |
| 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 | false |
А вот здесь первые три параметра переносим из блокнота, четвёртый — наше имя домена узла Bluesky PDS (не аккаунта).
| PDS_JWT_SECRET | см. блокнот |
| PDS_ADMIN_PASSWORD | см. блокнот |
| PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX | см. блокнот |
| PDS_HOSTNAME | social.example.com |
Последние два ниже отвечают за отправку Email, подробнее почитать можно на GitHub. Не сказал бы, что это обязательные переменные, так как ничего кроме подтверждения почты аккаунта полезного они не делают. Писем с действиями учётных записей к сожалению, по крайней мере, пока нет. В любом случае, через копию контейнера эти переменные можно добавить и потом.
| PDS_EMAIL_SMTP_URL | smtps://login:password@smtp.mailserver.com:465/ |
| PDS_EMAIL_FROM_ADDRESS | bluesky@mailserver.com |
Запускаем!
Полировка
Создаём аккаунт
sudo docker exec <имя контейнера> goat pds admin account create --admin-password <PDS_ADMIN_PASSWORD> --handle username.example.com --email email@mail.com --password new-passwordгде:
| —admin-password | PDS_ADMIN_PASSWORD из блокнота |
| —handle | псевдоним |
| действующий почтовый ящик | |
| —password | пароль от аккаунта |
При желании можно создать инвайт-код для регистрации аккаунтов, но уже из приложения
sudo docker exec <имя контейнера> goat pds admin --admin-password <PDS_ADMIN_PASSWORD> create-invitesИ финальный штрих. Логинимся в приложение или на bsky.app если был первый вариант, регистрируемся с инвайтом если второй. Заходим в Настройки — Учётная запись — Псевдоним — У меня есть собственный домен. Там будут настройки для DNS. Если псевдоним будет корневым доменом, то у регистратора прописываем, что-то типа того:
| Name | Type | TTL | Value |
| _atproto. | TEXT | 600 | «did=did:plc:pLq8mLPrDdSy2hfpnwshcmz4» |
А если субдоменом(ами), то как-то так
| Name | Type | TTL | Value |
| _atproto.username1 | TEXT | 600 | «did=did:plc:LLsdgL7Y3BSW73gVvzRQ5Crp» |
| _atproto.username2 | TEXT | 600 | «did=did:plc:V4e3Amj4Zu8BvPB3hXw236GU» |
Вот собственно и всё.
И не забудь подписаться на меня, username!