<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Павел Гастелло</title>
<link>https://blog.pavel.ga/</link>
<description>Заметки о том, о сём</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>Заметки о том, о сём</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Установка Bluesky PDS на Synology</title>
<guid isPermaLink="false">2</guid>
<link>https://blog.pavel.ga/all/ustanovka-bluesky-pds-na-synology/</link>
<pubDate>Sun, 15 Feb 2026 18:44:33 +0300</pubDate>
<author></author>
<comments>https://blog.pavel.ga/all/ustanovka-bluesky-pds-na-synology/</comments>
<description>
&lt;h2&gt;Пролог&lt;/h2&gt;
&lt;p&gt;Что такое Bluesky? Это децентрализованная социальная сеть для микроблогинга, созданная как альтернатива X (ex-Twitter). Bluesky PDS (Personal Data Server) — персональный сервер данных, личный «узел» в сети Bluesky на базе AT Protocol. Он хранит посты, подписки и профили пользователей, позволяя им контролировать свои данные и взаимодействовать с другими серверами сети.&lt;/p&gt;
&lt;p&gt;Не хочется размусоливать тему зачем нужно размещать у себя «полудецентрализованный» Bluesky, вместо замечательных и многообразных &lt;a href="https://github.com/emilebosch/awesome-fediverse"&gt;fediverse проектов&lt;/a&gt;. Для меня лично это экономия ресурсов на не так уж и мощном NAS, плюс наличие интересных мне аккаунтов типа &lt;a href="https://bsky.app/profile/ericmigi.com"&gt;Eric Migicovsky&lt;/a&gt; или крупных брендов таких как &lt;a href="https://bsky.app/profile/xbox.com"&gt;Xbox&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Подготовка&lt;/h2&gt;
&lt;p&gt;Будем исходить из того, что у нас уже есть зарегистрированное доменное имя, PDS мы будем размещать на субдомене &lt;tt&gt;social.example.com&lt;/tt&gt;, а псевдонимом Bluesky у нас будет корневое имя домена &lt;tt&gt;example.com&lt;/tt&gt;. В настройках у регистратора домена нужно прописать эти A записи:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Name&lt;/td&gt;
&lt;td style="text-align: left"&gt;Type&lt;/td&gt;
&lt;td style="text-align: left"&gt;TTL&lt;/td&gt;
&lt;td style="text-align: left"&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;social.example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
При желании в качестве псевдонима и(или) при регистрации нескольких пользователей можно использовать субдомены. Таблица в таком случае будет выглядить примерно так:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Name&lt;/td&gt;
&lt;td style="text-align: left"&gt;Type&lt;/td&gt;
&lt;td style="text-align: left"&gt;TTL&lt;/td&gt;
&lt;td style="text-align: left"&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;social.example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;username1.example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;username2.example.com&lt;/td&gt;
&lt;td style="text-align: right"&gt;A&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;12.34.56.78&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Страницу управления доменом не закрываем, после установки она нам ещё пригодится.&lt;/p&gt;
&lt;p&gt;Переходим к Synology. В &lt;b&gt;Настройки — Безопасность — Сертификат&lt;/b&gt; для всего вышеописанного получаем &lt;a href="https://kb.synology.com/ru-ru/DSM/help/DSM/AdminCenter/connection_certificate?version=7#b_11"&gt;сертификат Let’s Encrypt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Предположим, что папка общего доступа с именем &lt;b&gt;docker&lt;/b&gt; у нас уже существует. В ней создаём ещё одну и называем её &lt;b&gt;bluesky&lt;/b&gt;.&lt;br /&gt;
Дальше идём в &lt;b&gt;Панель управления — Портал для входа — Дополнительно — Обратный прокси — Создать&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Источник&lt;/b&gt;&lt;br /&gt;
Имя обратного прокси — &lt;i&gt;Bluesky&lt;/i&gt;&lt;br /&gt;
Протокол — &lt;i&gt;HTTPS&lt;/i&gt;&lt;br /&gt;
Имя хоста — &lt;i&gt;social.example.com&lt;/i&gt;&lt;br /&gt;
Порт — &lt;i&gt;443&lt;/i&gt;&lt;br /&gt;
Включить HSTS — &lt;i&gt;Включить&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Место назначения&lt;/b&gt;&lt;br /&gt;
Протокол — &lt;i&gt;HTTP&lt;/i&gt;&lt;br /&gt;
Имя хоста — &lt;i&gt;127.0.0.1&lt;/i&gt;&lt;br /&gt;
Порт — &lt;i&gt;3000&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Во вкладке &lt;b&gt;Пользовательский заголовок&lt;/b&gt; нужно добавить WebSocket. Всё тоже самое проделываем ещё и с корневым доменом (либо субдоменами, если пользователей несколько).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bafista.ru/kak-vklyuchit-ssh-na-synology-nas/"&gt;Запускаем службу SSH, если она отключена и подключаемся к Synology&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Скачиваем образ Bluesky-PDS.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sudo docker pull ghcr.io/bluesky-social/pds:latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Поочерёдно вводим команды, записывая результаты в блокнот.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="shell"&gt;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)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Установка&lt;/h2&gt;
&lt;p&gt;В &lt;b&gt;Container Manager&lt;/b&gt; на вкладке &lt;b&gt;Образ&lt;/b&gt; находим &lt;i&gt;ghcr.io/bluesky-social/pds&lt;/i&gt; и запускаем его. Имя контейнера произвольно, я выбрал &lt;i&gt;bluesky-pds&lt;/i&gt;. Жмём &lt;b&gt;Далее&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Локальный порт — &lt;i&gt;3000&lt;/i&gt;. Добавляем ранее созданную папку, с привязкой к /&lt;i&gt;pds&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Переменные добавляем по этому списку. Здесь менять ничего не надо. Если только значение &lt;tt&gt;PDS_BLOB_UPLOAD_LIMIT&lt;/tt&gt;, это лимит загрузки в байтах. Здесь он ограничен 100МБ.&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_DATA_DIRECTORY&lt;/td&gt;
&lt;td style="text-align: left"&gt;/pds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_BLOBSTORE_DISK_LOCATION&lt;/td&gt;
&lt;td style="text-align: left"&gt;/pds/blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_BLOB_UPLOAD_LIMIT&lt;/td&gt;
&lt;td style="text-align: left"&gt;104857600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_DID_PLC_URL&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;a href="https://plc.directory"&gt;https://plc.directory&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_BSKY_APP_VIEW_URL&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;a href="https://api.bsky.app"&gt;https://api.bsky.app&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_BSKY_APP_VIEW_DID&lt;/td&gt;
&lt;td style="text-align: left"&gt;did:web:api.bsky.app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_REPORT_SERVICE_URL&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;a href="https://mod.bsky.app"&gt;https://mod.bsky.app&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_REPORT_SERVICE_DID&lt;/td&gt;
&lt;td style="text-align: left"&gt;did:plc:ar7c4by46qjdydhdevvrndac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_CRAWLERS&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;a href="https://bsky.network"&gt;https://bsky.network&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;LOG_ENABLED&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
А вот здесь первые три параметра переносим из блокнота, четвёртый — наше имя домена узла Bluesky PDS (не аккаунта).&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_JWT_SECRET&lt;/td&gt;
&lt;td style="text-align: left"&gt;см. блокнот&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_ADMIN_PASSWORD&lt;/td&gt;
&lt;td style="text-align: left"&gt;см. блокнот&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX&lt;/td&gt;
&lt;td style="text-align: left"&gt;см. блокнот&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_HOSTNAME&lt;/td&gt;
&lt;td style="text-align: left"&gt;social.example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
Последние два ниже отвечают за отправку Email, подробнее почитать можно на &lt;a href="https://github.com/bluesky-social/pds?tab=readme-ov-file#setting-up-smtp"&gt;GitHub&lt;/a&gt;. Не сказал бы, что это обязательные переменные, так как ничего кроме подтверждения почты аккаунта полезного они не делают. Писем с действиями учётных записей к сожалению, по крайней мере, пока нет. В любом случае, через копию контейнера эти переменные можно добавить и потом.&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_EMAIL_SMTP_URL&lt;/td&gt;
&lt;td style="text-align: left"&gt;smtps://login:password@smtp.mailserver.com:465/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;PDS_EMAIL_FROM_ADDRESS&lt;/td&gt;
&lt;td&gt;bluesky@mailserver.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Запускаем!&lt;/p&gt;
&lt;h2&gt;Полировка&lt;/h2&gt;
&lt;p&gt;Создаём аккаунт&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="shell"&gt;sudo docker exec &amp;lt;имя контейнера&amp;gt; goat pds admin account create --admin-password &amp;lt;PDS_ADMIN_PASSWORD&amp;gt; --handle username.example.com --email email@mail.com --password new-password&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;где:&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;—admin-password&lt;/td&gt;
&lt;td&gt;PDS_ADMIN_PASSWORD из блокнота&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;—handle&lt;/td&gt;
&lt;td&gt;псевдоним&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;—email&lt;/td&gt;
&lt;td&gt;действующий почтовый ящик&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;—password&lt;/td&gt;
&lt;td&gt;пароль от аккаунта&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
При желании можно создать инвайт-код для регистрации аккаунтов, но уже из приложения&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="shell"&gt;sudo docker exec &amp;lt;имя контейнера&amp;gt; goat pds admin --admin-password &amp;lt;PDS_ADMIN_PASSWORD&amp;gt; create-invites&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И финальный штрих. Логинимся в приложение или на &lt;a href="https://bsky.app"&gt;bsky.app&lt;/a&gt; если был первый вариант, регистрируемся с инвайтом если второй. Заходим в &lt;b&gt;Настройки — Учётная запись — Псевдоним — У меня есть собственный домен&lt;/b&gt;. Там будут настройки для DNS. Если псевдоним будет корневым доменом, то у регистратора прописываем, что-то типа того:&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Name&lt;/td&gt;
&lt;td style="text-align: left"&gt;Type&lt;/td&gt;
&lt;td style="text-align: left"&gt;TTL&lt;/td&gt;
&lt;td style="text-align: left"&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_atproto.&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;«did=did:plc:pLq8mLPrDdSy2hfpnwshcmz4»&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
А если субдоменом(ами), то как-то так&lt;br /&gt;
&lt;tt&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Name&lt;/td&gt;
&lt;td style="text-align: left"&gt;Type&lt;/td&gt;
&lt;td style="text-align: left"&gt;TTL&lt;/td&gt;
&lt;td style="text-align: left"&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_atproto.username1&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;«did=did:plc:LLsdgL7Y3BSW73gVvzRQ5Crp»&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_atproto.username2&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;«did=did:plc:V4e3Amj4Zu8BvPB3hXw236GU»&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/tt&gt;&lt;br /&gt;
Вот собственно и всё.&lt;/p&gt;
&lt;p class="lead"&gt;И не забудь &lt;a href="https://bsky.app/profile/jahait.bsky.su"&gt;подписаться на меня&lt;/a&gt;, username!&lt;/p&gt;
</description>
</item>


</channel>
</rss>