{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Павел Гастелло: заметки с тегом bluesky",
    "_rss_description": "Пишу, что думаю. Не думаю, что пишу.",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.pavel.ga\/tags\/bluesky\/",
    "feed_url": "https:\/\/blog.pavel.ga\/tags\/bluesky\/json\/",
    "icon": "https:\/\/blog.pavel.ga\/pictures\/userpic\/userpic@2x.jpg?1771169906",
    "authors": [
        {
            "name": "Павел Гастелло",
            "url": "https:\/\/blog.pavel.ga\/",
            "avatar": "https:\/\/blog.pavel.ga\/pictures\/userpic\/userpic@2x.jpg?1771169906"
        }
    ],
    "items": [
        {
            "id": "2",
            "url": "https:\/\/blog.pavel.ga\/all\/ustanovka-bluesky-pds-na-synology\/",
            "title": "Установка Bluesky PDS на Synology",
            "content_html": "<h2>Пролог<\/h2>\n<p>Что такое <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Bluesky\">Bluesky<\/a>? Это децентрализованная социальная сеть для микроблогинга, созданная как альтернатива X (ex-Twitter). Bluesky PDS (Personal Data Server) — персональный сервер данных, личный «узел» в сети Bluesky на базе AT Protocol. Он хранит посты, подписки и профили пользователей, позволяя им контролировать свои данные и взаимодействовать с другими серверами сети.<\/p>\n<p>Не хочется размусоливать тему зачем нужно размещать у себя «полудецентрализованный» Bluesky, вместо замечательных и многообразных <a href=\"https:\/\/github.com\/emilebosch\/awesome-fediverse\">fediverse проектов<\/a>. Для меня лично это экономия ресурсов на не так уж и мощном NAS, плюс наличие интересных мне аккаунтов типа <a href=\"https:\/\/bsky.app\/profile\/ericmigi.com\">Eric Migicovsky<\/a> или крупных брендов таких как <a href=\"https:\/\/bsky.app\/profile\/xbox.com\">Xbox<\/a>.<\/p>\n<h2>Подготовка<\/h2>\n<p>Будем исходить из того, что у нас уже есть зарегистрированное доменное имя, PDS мы будем размещать на субдомене <tt>social.example.com<\/tt>, а псевдонимом Bluesky у нас будет корневое имя домена <tt>example.com<\/tt>. В настройках у регистратора домена нужно прописать эти A записи:<\/p>\n<p><tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">Name<\/td>\n<td style=\"text-align: left\">Type<\/td>\n<td style=\"text-align: left\">TTL<\/td>\n<td style=\"text-align: left\">Value<\/td>\n<\/tr>\n<tr>\n<td>example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<tr>\n<td>social.example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nПри желании в качестве псевдонима и(или) при регистрации нескольких пользователей можно использовать субдомены. Таблица в таком случае будет выглядить примерно так:<\/p>\n<p><tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">Name<\/td>\n<td style=\"text-align: left\">Type<\/td>\n<td style=\"text-align: left\">TTL<\/td>\n<td style=\"text-align: left\">Value<\/td>\n<\/tr>\n<tr>\n<td>example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<tr>\n<td>social.example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<tr>\n<td>username1.example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<tr>\n<td>username2.example.com<\/td>\n<td style=\"text-align: right\">A<\/td>\n<td>600<\/td>\n<td>12.34.56.78<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><\/p>\n<p>Страницу управления доменом не закрываем, после установки она нам ещё пригодится.<\/p>\n<p>Переходим к Synology. В <b>Настройки — Безопасность — Сертификат<\/b> для всего вышеописанного получаем <a href=\"https:\/\/kb.synology.com\/ru-ru\/DSM\/help\/DSM\/AdminCenter\/connection_certificate?version=7#b_11\">сертификат Let’s Encrypt<\/a>.<\/p>\n<p>Предположим, что папка общего доступа с именем <b>docker<\/b> у нас уже существует. В ней создаём ещё одну и называем её <b>bluesky<\/b>.<br \/>\nДальше идём в <b>Панель управления — Портал для входа — Дополнительно — Обратный прокси — Создать<\/b><\/p>\n<p>\t<b>Источник<\/b><br \/>\n\tИмя обратного прокси — <i>Bluesky<\/i><br \/>\n\tПротокол — <i>HTTPS<\/i><br \/>\n\tИмя хоста — <i>social.example.com<\/i><br \/>\n\tПорт — <i>443<\/i><br \/>\n\tВключить HSTS — <i>Включить<\/i><\/p>\n<p>\t<b>Место назначения<\/b><br \/>\n\tПротокол — <i>HTTP<\/i><br \/>\n\tИмя хоста — <i>127.0.0.1<\/i><br \/>\n\tПорт — <i>3000<\/i><\/p>\n<p>Во вкладке <b>Пользовательский заголовок<\/b> нужно добавить WebSocket. Всё тоже самое проделываем ещё и с корневым доменом (либо субдоменами, если пользователей несколько).<\/p>\n<p><a href=\"https:\/\/bafista.ru\/kak-vklyuchit-ssh-na-synology-nas\/\">Запускаем службу SSH, если она отключена и подключаемся к Synology<\/a><\/p>\n<p>Скачиваем образ Bluesky-PDS.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">sudo docker pull ghcr.io\/bluesky-social\/pds:latest<\/code><\/pre><p>Поочерёдно вводим команды, записывая результаты в блокнот.<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">echo PDS_ADMIN_PASSWORD: $(openssl rand --hex 16)\n\necho PDS_JWT_SECRET: $(openssl rand --hex 16)\n\necho 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)<\/code><\/pre><h2>Установка<\/h2>\n<p>В <b>Container Manager<\/b> на вкладке <b>Образ<\/b> находим <i>ghcr.io\/bluesky-social\/pds<\/i> и запускаем его. Имя контейнера произвольно, я выбрал <i>bluesky-pds<\/i>. Жмём <b>Далее<\/b>.<\/p>\n<p>Локальный порт — <i>3000<\/i>. Добавляем ранее созданную папку, с привязкой к \/<i>pds<\/i><\/p>\n<p>Переменные добавляем по этому списку. Здесь менять ничего не надо. Если только значение <tt>PDS_BLOB_UPLOAD_LIMIT<\/tt>, это лимит загрузки в байтах. Здесь он ограничен 100МБ.<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">PDS_DATA_DIRECTORY<\/td>\n<td style=\"text-align: left\">\/pds<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_BLOBSTORE_DISK_LOCATION<\/td>\n<td style=\"text-align: left\">\/pds\/blocks<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_BLOB_UPLOAD_LIMIT<\/td>\n<td style=\"text-align: left\">104857600<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_DID_PLC_URL<\/td>\n<td style=\"text-align: left\"><a href=\"https:\/\/plc.directory\">https:\/\/plc.directory<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_BSKY_APP_VIEW_URL<\/td>\n<td style=\"text-align: left\"><a href=\"https:\/\/api.bsky.app\">https:\/\/api.bsky.app<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_BSKY_APP_VIEW_DID<\/td>\n<td style=\"text-align: left\">did:web:api.bsky.app<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_REPORT_SERVICE_URL<\/td>\n<td style=\"text-align: left\"><a href=\"https:\/\/mod.bsky.app\">https:\/\/mod.bsky.app<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_REPORT_SERVICE_DID<\/td>\n<td style=\"text-align: left\">did:plc:ar7c4by46qjdydhdevvrndac<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_CRAWLERS<\/td>\n<td style=\"text-align: left\"><a href=\"https:\/\/bsky.network\">https:\/\/bsky.network<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">LOG_ENABLED<\/td>\n<td style=\"text-align: left\">false<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nА вот здесь первые три параметра переносим из блокнота, четвёртый — наше имя домена узла Bluesky PDS (не аккаунта).<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">PDS_JWT_SECRET<\/td>\n<td style=\"text-align: left\">см. блокнот<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_ADMIN_PASSWORD<\/td>\n<td style=\"text-align: left\">см. блокнот<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX<\/td>\n<td style=\"text-align: left\">см. блокнот<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_HOSTNAME<\/td>\n<td style=\"text-align: left\">social.example.com<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nПоследние два ниже отвечают за отправку Email, подробнее почитать можно на <a href=\"https:\/\/github.com\/bluesky-social\/pds?tab=readme-ov-file#setting-up-smtp\">GitHub<\/a>. Не сказал бы, что это обязательные переменные, так как ничего кроме подтверждения почты аккаунта полезного они не делают. Писем с действиями учётных записей к сожалению, по крайней мере, пока нет. В любом случае, через копию контейнера эти переменные можно добавить и потом.<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">PDS_EMAIL_SMTP_URL<\/td>\n<td style=\"text-align: left\">smtps:\/\/login:password@smtp.mailserver.com:465\/<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">PDS_EMAIL_FROM_ADDRESS<\/td>\n<td>bluesky@mailserver.com<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><\/p>\n<p>Запускаем!<\/p>\n<h2>Полировка<\/h2>\n<p>Создаём аккаунт<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">sudo docker exec &lt;имя контейнера&gt; goat pds admin account create --admin-password &lt;PDS_ADMIN_PASSWORD&gt; --handle username.example.com --email email@mail.com --password new-password<\/code><\/pre><p>где:<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td>—admin-password<\/td>\n<td>PDS_ADMIN_PASSWORD из блокнота<\/td>\n<\/tr>\n<tr>\n<td>—handle<\/td>\n<td>псевдоним<\/td>\n<\/tr>\n<tr>\n<td>—email<\/td>\n<td>действующий почтовый ящик<\/td>\n<\/tr>\n<tr>\n<td>—password<\/td>\n<td>пароль от аккаунта<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nПри желании можно создать инвайт-код для регистрации аккаунтов, но уже из приложения<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">sudo docker exec &lt;имя контейнера&gt; goat pds admin --admin-password &lt;PDS_ADMIN_PASSWORD&gt; create-invites<\/code><\/pre><p>И финальный штрих. Логинимся в приложение или на <a href=\"https:\/\/bsky.app\">bsky.app<\/a> если был первый вариант, регистрируемся с инвайтом если второй. Заходим в <b>Настройки — Учётная запись — Псевдоним — У меня есть собственный домен<\/b>. Там будут настройки для DNS. Если псевдоним будет корневым доменом, то у регистратора прописываем, что-то типа того:<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">Name<\/td>\n<td style=\"text-align: left\">Type<\/td>\n<td style=\"text-align: left\">TTL<\/td>\n<td style=\"text-align: left\">Value<\/td>\n<\/tr>\n<tr>\n<td>_atproto.<\/td>\n<td>TEXT<\/td>\n<td>600<\/td>\n<td>«did=did:plc:pLq8mLPrDdSy2hfpnwshcmz4»<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nА если субдоменом(ами), то как-то так<br \/>\n<tt><\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: left\">Name<\/td>\n<td style=\"text-align: left\">Type<\/td>\n<td style=\"text-align: left\">TTL<\/td>\n<td style=\"text-align: left\">Value<\/td>\n<\/tr>\n<tr>\n<td>_atproto.username1<\/td>\n<td>TEXT<\/td>\n<td>600<\/td>\n<td>«did=did:plc:LLsdgL7Y3BSW73gVvzRQ5Crp»<\/td>\n<\/tr>\n<tr>\n<td>_atproto.username2<\/td>\n<td>TEXT<\/td>\n<td>600<\/td>\n<td>«did=did:plc:V4e3Amj4Zu8BvPB3hXw236GU»<\/td>\n<\/tr>\n<\/table>\n<p><\/tt><br \/>\nВот собственно и всё.<\/p>\n<p class=\"lead\">И не забудь <a href=\"https:\/\/bsky.app\/profile\/jahait.bsky.su\">подписаться на меня<\/a>, username!<\/p>\n",
            "summary": "Что такое Bluesky? Это децентрализованная социальная сеть для микроблогинга, созданная как альтернатива X",
            "date_published": "2026-02-15T18:44:33+03:00",
            "date_modified": "2026-03-15T01:22:23+03:00",
            "tags": [
                "bluesky",
                "docker",
                "synology"
            ],
            "_date_published_rfc2822": "Sun, 15 Feb 2026 18:44:33 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4199,
    "_e2_ua_string": "Aegea 11.5 (v4199)"
}