generated at
PDSの環境変数
注意: この記事の内容は古くなっているため最新のPDS環境の構築には使えません


コンテナはatprotoのトップディレクトリで docker build -f packages/pds/Dockerfile . でbuildできる

定義可能な環境変数
env
ENV: Nullable, dotenv.config({ path: `./.${env}.env` })で使う PORT: Nullable, Nullだと2583, dockerコンテナビルド時は3000 // deprecated SIGNING_KEY_ID: REPO_SIGNIN_KEYとPLC_ROTATION_KEYに分離した, RECOVERY_KEY_ID: did, "did:"で始まらない場合はKMSでkeypairを作ってそのkeyIdを指定する DB_CREDS_JSON: username, password, host, portのJSON DB_MIGRATE_CREDS_JSON: username, password, host, portのJSON DB_SCHEMA: Nullable, postgresQLのスキーマ名 SMTP_HOST: smtpのホスト名 SMTP_USERNAME: smtpのユーザー名 SMTP_PASSWORD: smtpのパスワード S3_BUCKET_NAME: S3のバケット名 CF_DISTRIBUTION_ID: Cloudfrontのdistribution id,Cloudfrontは画像の配信に使用 DEBUG_MODE: Nullable, "1"だとdebugModeがtrue, それ以外でfalse PDS_VERSION: Nullable, Nullのとき'0.0.0' PUBLIC_URL: Nullable, Nullのときundefined, HOSTNAME: Nullable, Nullのとき'localhost', 'localhost'のときは強制的にhttp仕様になる TLS: Nullable, '1'だとhttps JWT_SECRET: Nullable, Nullのとき'jwt_secret', jwt.signとjwt.verifyで使用 DID_PLC_URL: Nullable, Nullのとき'http://localhost:2582', plc.ClientやDidResolverで使用, PLCサーバーのURL SERVER_DID: 必須。鯖缶did?, plcサーバーにcreateDidして事前に作成する必要あり RECOVERY_KEY: Nullable?, did, わからん ADMIN_PASSWORD: Nullable, NULLだと"admin" INVITE_REQUIRED: Nullable, "true" or false, "true"以外でfalse, アカウント作成時にinvite codeが必要か PRIVACY_POLICY_URL: Nullable, プラポリのURL, 相対パス("/"で始まる)で指定時はpublicUrl + privacyPolicyUrl TERMS_OF_SERVICE_URL: Nullable, 規約のURL, 相対パス("/"で始まる)で指定時はpublicUrl + termsOfServiceUrl DATABASE_LOC: Nullable, SQLite利用時のDBのLocation, 優先度はdbPostgresUrl > databaseLocation(SQLite) > Memory BLOBSTORE_LOC: Nullable, 画像の保存場所, NullのときはMemoryBlobStore BLOBSTORE_TMP: Nullable, 画像のtmp保存場所, Nullのときはos.tmpdir() AVAILABLE_USER_DOMAINS: Nullable, ","区切りで複数定義できる, ユーザーが利用可能なドメイン? // deprecated IMG_URI_SALT: Nullable, NULLだとデフォルトのハッシュ値, ImageUriBuilderで使用 // deprecated IMG_URI_KEY: Nullable, NULLだとデフォルトのハッシュ値, ImageUriBuilderで使用 // deprecated IMG_URI_ENDPOINT: Nullable, 画像ファイルのURL, Nullだと `${config.publicUrl}/image` // deprecated BLOB_CACHE_LOC: Nullable, 画像をキャッシュするLocation, Nullだとos.tmpdir() APP_URL_PASSWORD_RESET: Nullable, NULLだと'app://password-reset' EMAIL_SMTP_URL: Nullable, NULLだとundefined EMAIL_NO_REPLY_ADDRESS: Nullable, NULLだと'noreply@blueskyweb.xyz' DB_POSTGRES_URL: DBのURL, 優先度はdbPostgresUrl > databaseLocation(SQLite) > Memory DB_POSTGRES_SCHEMA: Nullable, postgresQLのスキーマ名 MAX_SUBSCRIPTION_BUFFER: Nullable, NULLだと500, eventsの最大バッファリング数? REPO_BACKFILL_LIMIT_MS: Nullable, NULLだと24時間, コネクション再開時にrepoのイベントをいつまで追うか? LOG_SYSTEMS: Nullable, ","区切りで複数定義できる LOG_ENABLED: "true" LOG_LEVEL: Nullable, NULLだと'info' LOG_DESTINATION: logの出力先(file) ATP_BUILD_SHALLOW: Nullable, よくわからん ------------------------------------------------------------------------------------------------------------- APP_VIEW_REPO_PROVIDER: Nullable, PDS公式Viewer? nullでundefined, E.g. ws://abc.com:4000 PLC_ROTATION_KEY_ID: KMSからkeypairをloadするためのkeyId REPO_SIGNING_KEY: SINGIN_KEYの本体(hex) (詳細: https://github.com/bluesky-social/atproto/pull/635) ------------------------------------------------------------------------------------------------------------- USER_INVITE_INTERVAL: Nullable, 多分既存ユーザーにinvite codeを渡す期間。nullでnull ------------------------------------------------------------------------------------------------------------- DB_POOL_SIZE: Nullable, PostgreSQLのコネクションプールサイズ, nullでundefined // deprecated HIVE_API_KEY: nullable, HiveLabeler用のAPIKEY, nullでundefined // deprecated LABELER_DID: nullable, ラベリング担当者のDID, nullで'did:example:labeler' ------------------------------------------------------------------------------------------------------------- MODERATOR_PASSWORD: nullable, モデレーターのパスワード, nullでundefined DB_POOL_MAX_USES: nullable, PostgreSQLの最大コネクションプールサイズ, nullでundefined DB_POOL_IDLE_TIMEOUT_MS: nullable, PostgreSQLのコネクションプールのタイムアウト時間(ms), nullでundefined ------------------------------------------------------------------------------------------------------------- DID_CACHE_STALE_TTL: nullable, nullでHOUR DID_CACHE_MAX_TTL: nullable, nullでDAY BSKY_APP_VIEW_ENDPOINT: 必須, AppViewのUrl ------------------------------------------------------------------------------------------------------------- FEED_PUBLISHER_DID: Nullable, カスタムフィード提供者のDID, nullで{}, 詳細は記事末尾の「makeAlgos」を参照 // deprecated FEED_GEN_DID: Required, describeFeedGeneratorでのみ使う。現状は'did:example:feedGen'でよさそう ------------------------------------------------------------------------------------------------------------- SEQUENCER_LEADER_LOCK_ID: Nullable, uniqueLockIdの指定に使う?nullでundefined ------------------------------------------------------------------------------------------------------------- CRAWLERS_TO_NOTIFY: 「,」区切りのString(Array), Nullable, 収集してもらうBGSのURL? USER_INVITE_EPOCH: Nullable. nullで0, 招待コードを発行する基準日(userCreatedAtと比較して大きい方とDate.now()を比較したものがepochLifeSpanになり、招待コード発行数はepochLifeSpan / userInviteIntervalとなる) ------------------------------------------------------------------------------------------------------------ DB_TX_LOCK_NONCE: テスト環境でのみ使用 // deprecated BSKY_APP_VIEW_PROXY: Nullable, Boolean, defaultでfalse HANDLE_RESOLVE_NAMESERVERS: Nullable, String( "," 区切りのArray), 予備のPLCサーバーのURL? TRIAGE_PASSWORD: Nullable, String, nullでundefined, Adminのロールの一つであるtriage権限のパスワード UNACCEPTABLE_WORDS_B64: String(Base64), ","区切りのArray, nullでundefined, handleの禁止ワード FALSE_POSITIVE_WORDS_B64: String(Base64), ","区切りのArray, nullでundefined, handleの禁止ワードのうちの例外(誤検知ワード) SEQUENCER_LEADER_ENABLED: String(Booelean) , Nullable, "0"か"false"以外のときにtrue, それ以外でundefined, 各インスタンスはデフォルトでSEQUENCER LEADERだがOFFにすることもできるとのこと BSKY_APP_VIEW_MODERATION: String(Boolean), Nullable, defaultでfalse, AppViewでのモデレーションを有効にするか? BSKY_APP_VIEW_CDN_URL_PATTERN: string, Nullable, defaultでundefined, AppViewのCDNのURL?、dev-envでは'http://cdn.appview.com/%s/%s/%s' ------------------------------------------------------------------------------------------------------------ RATE_LIMITS_ENABLED: String(Boolean), rate limitの有無。defaultでfalse RATE_LIMIT_BYPASS_KEY: String, Nullable, defaultでundefined, rate limitを回避してリクエストする際のkey, "x-ratelimit-bypass" ヘッダーに入力する REDIS_SCRATCH_ADDRESS: String, Nullable, defaultでundefined, RedisのHost Address, Rate Limitを使うために必要 REDIS_SCRATCH_PASSWORD: String, Nullable, defaultでundefined, RedisのPassword BSKY_APP_VIEW_DID: 必須, AppViewのDID

ローカルで動作させる際はenvを以下のように設定している
.dev.env
DB_POSTGRES_URL="postgres://bsky:yksb@localhost/pds_dev" DEBUG_MODE=1 LOG_ENABLED="true" LOG_LEVEL=debug LOG_DESTINATION=1 AVAILABLE_USER_DOMAINS=".test,.dev.bsky.dev"

serverDidとは
公式リポジトリで聞いたところ、現在は使用していない値とのこと。後々サーバーのアドレスや認証に役立てるつもりらしい
> But we're planning on services in the network each having a DID. It helps with addressing & authorization.
> You can set it to a temporary value, for instance did:example:temporary until the value starts to be used

PLCサーバーも立てる場合(必要なし)
PLCサーバーの環境変数
.env
PLC_BUILD_SHALLOW: "true"のときtrue, わからん PLC_VERSION:バージョン DB_CREDS_JSON: username, password, host, portのJSON DB_MIGRATE_CREDS_JSON: username, password, host, portのJSON DB_SCHEMA: Nullable, postgresQLのスキーマ名, nullでundefined DATABASE_URL: Nullable, postgresqlのURL, nullだとDBがモックになる PORT: Nullable, plcサーバーのport, nullだと2582, コンテナビルド時は3000 ENV: Nullable, dotenv.config({ path: `./.${env}.env` })で使う LOG_ENABLED: "true" LOG_LEVEL: Nullable, NULLだと'info' LOG_DESTINATION: logの出力先(file)

dev環境だとこうなる
.env
DATABASE_URL="postgres://bsky:yksb@localhost/plc_dev" DEBUG_MODE=1 LOG_ENABLED="true" LOG_LEVEL=debug LOG_DESTINATION=1

invite code作成
packages/pds/src/api/com/atproto/account/createInviteCode.tsを読む

makeAlgos
These are custom algorithms that will be mounted directly onto an AppView
Feel free to remove, update to your own, or serve the following logic at a record that you control
これらは、AppViewに直接実装されるカスタムアルゴリズムです。
以下のロジックは、自由に削除したり、独自のものに更新したり、コントロールするレコードで提供することができます。
packages/pds/src/feed-gen/index.ts
const coll = ids.AppBskyFeedGenerator // These are custom algorithms that will be mounted directly onto an AppView // Feel free to remove, update to your own, or serve the following logic at a record that you control export const makeAlgos = (did: string): MountedAlgos => ({ [AtUri.make(did, coll, 'with-friends').toString()]: withFriends, [AtUri.make(did, coll, 'bsky-team').toString()]: bskyTeam, [AtUri.make(did, coll, 'whats-hot').toString()]: whatsHot, [AtUri.make(did, coll, 'hot-classic').toString()]: hotClassic, })