Skip to content
OpenPostDocs
OpenPostDocs

Configuration

Configure URLs, storage, provider apps, and optional self-hosted services.

The Docker Compose example reads .env when the container starts. Keep deployment settings there or in your secret store. OpenPost also has Settings → Instance → Configuration for settings it can store encrypted in its database. Environment values, including _FILE secrets, take precedence over matching database settings. Recreate the container with docker compose up -d --force-recreate openpost after changing .env. A plain restart keeps the previous environment.

Public addresses

SettingWhat to enter
OPENPOST_APP_URLThe public origin users open, such as https://post.example.com. OAuth callbacks derive from this value.
OPENPOST_PUBLIC_URLThe public origin used for server links and Telegram's webhook. Usually the same as the app URL.
OPENPOST_MEDIA_URLA public URL for media, such as https://post.example.com/media, or the default /media path when the public origin serves media.

Use HTTPS for a public instance and make sure your proxy forwards API and media requests. Set these URLs before registering provider callbacks. Changing the app URL later can require updating callback URLs in provider portals and reconnecting accounts. Provider integrations lists the callback for each provider.

Storage

The Compose setup stores SQLite at /data/db/openpost.db and media at /data/media. Both paths sit under the persistent ./data bind mount. Do not put only the database on persistent storage; published media and draft attachments live in the media directory.

For PostgreSQL, set OPENPOST_DATABASE_DRIVER=postgres and OPENPOST_DATABASE_URL to the connection string. For S3-compatible storage, set OPENPOST_STORAGE_DRIVER=s3, OPENPOST_S3_ENDPOINT, OPENPOST_S3_REGION, OPENPOST_S3_BUCKET, OPENPOST_S3_ACCESS_KEY_ID, OPENPOST_S3_SECRET_ACCESS_KEY, and OPENPOST_S3_PUBLIC_BASE_URL. Set OPENPOST_S3_FORCE_PATH_STYLE=true only if your object store needs it. These are deployment choices; moving an existing instance's data needs a planned migration, not just a setting change.

Back up the database, media, Compose file, and secrets as one restore set.

Provider apps

For OAuth platforms, create an app in the provider's portal, register the exact callback, and save supported credentials in Instance → Configuration → Provider apps or OPENPOST_PROVIDER_APPS. Telegram bot credentials use OPENPOST_PROVIDER_APPS; the current Instance form does not accept them. Environment-defined apps are read-only in Settings and take precedence over database entries. Recreate the container after changing environment configuration.

ProviderSetup requirement
XOAuth callback registered in the X developer app
LinkedInLinkedIn app with the required products and permissions
Threads, Facebook, InstagramMeta app with the required product, account type, and permissions
TikTokApp configured for the chosen posting product, review may be required
YouTubeGoogle OAuth client with YouTube API enabled
MastodonAutomatic registration on a public server or a fixed app per server
BlueskyNo provider app; each user creates an app password
DiscordIncoming webhook URL for a fixed channel
TelegramInstance bot credentials, public HTTPS webhook, and administrator readiness records
PinterestDeveloper app, Standard access, and administrator readiness records

Provider rules and app review can change. Start with one account and test one post before adding more providers.

Telegram, Pinterest, and Discord bot mode need the additional administrator readiness workflow before normal use. Discord webhooks do not need it.

Useful controls

Set OPENPOST_DISABLE_REGISTRATIONS=true after creating the first administrator if only invited people should join. Set up mail before enabling OPENPOST_EMAIL_VERIFICATION_REQUIRED=true. Keep OPENPOST_JWT_SECRET and OPENPOST_ENCRYPTION_KEY private and stable: changing the encryption key without its previous key material can make saved provider credentials unreadable. Use OPENPOST_EXTRA_CORS_ORIGINS only for other origins that need browser API access; normal same-origin use needs no entry.

On this page