Skip to main content
Version: 0.9.1

PinePods Environment Variables Guide

Complete reference for all PinePods configuration options

Below are all the environment variables supported by PinePods. These should be configured in your docker-compose.yml file or .env file.

Core Application Settings​

VariableDefault ValueRequiredDescription
SEARCH_API_URL-YesURL of the search API. Use https://search.pinepods.online/api/search, or your own search service if you run one
PEOPLE_API_URL-YesURL of the people/person lookup API. Use https://people.pinepods.online
HOSTNAME-YesThe URL where you will access the app (e.g., https://pods.example.com). Used for RSS feed sharing and callbacks
SERVER_URL(falls back to HOSTNAME)NoExplicit public URL for building absolute RSS feed links. Checked before HOSTNAME; set it if your container platform overrides HOSTNAME (see note below)
DEFAULT_LANGUAGEenNoLanguage the web app uses until a user picks their own. A language code such as en, de, fr, pt-BR or zh-Hans
RSS links showing your container name instead of your domain?

PinePods builds absolute RSS feed URLs (<link>, <guid>, <enclosure>) from HOSTNAME. Some container runtimes — rootless Podman under a systemd unit is a known case — set their own HOSTNAME (the container/pod name), which can override the value you passed in. If your feed's episode links look like pinepods-pod/api/data/stream/... instead of your real domain, set SERVER_URL to your public URL (the same value you'd give HOSTNAME). PinePods checks SERVER_URL first, and unlike HOSTNAME, nothing in the container platform can silently overwrite it.

Database Configuration​

VariableDefault ValueRequiredDescription
DB_TYPE-YesDatabase type: postgresql or mariadb (mysql also works)
DB_HOST-YesDatabase host address. A path starting with / (e.g., /var/run/postgresql) connects through a Unix socket in that directory
DB_PORT-YesDatabase port: usually 5432 for PostgreSQL, 3306 for MariaDB/MySQL
DB_USER-YesDatabase username
DB_PASSWORD-YesDatabase password
DB_NAME-YesDatabase name, usually pinepods_database
DB_WAIT_TIMEOUT300NoSeconds to wait at startup for the database to accept connections before giving up. 0 waits forever. Raise it if your database starts slowly (first boot, slow hosts)

PostgreSQL over TLS or with client certificates​

PinePods connects to PostgreSQL with the standard PostgreSQL client settings, so a server that requires TLS or a client certificate (mTLS) needs no PinePods-specific options. Mount the certificate files into the container and set:

VariableDescription
PGSSLMODEdisable, allow, prefer (default), require, verify-ca or verify-full. Use verify-full to check both the server's certificate and its hostname
PGSSLROOTCERTPath to the CA certificate that signed the server's certificate
PGSSLCERTPath to the client certificate, for servers that require one
PGSSLKEYPath to the client certificate's private key
services:
pinepods:
environment:
PGSSLMODE: verify-full
PGSSLROOTCERT: /certs/postgres/ca.crt
PGSSLCERT: /certs/postgres/client.crt
PGSSLKEY: /certs/postgres/client.key
volumes:
- /home/user/pinepods/postgres-certs:/certs/postgres:ro

These apply to every connection PinePods makes: the startup database setup, the app itself, and backups and restores.

Private key permissions

PostgreSQL clients refuse a private key that other users can read. Make the key file chmod 600 and owned by the user PinePods runs as: the PUID/PGID you set, or root if you didn't set them. With verify-full, DB_HOST must match a name in the server's certificate.

Redis/Valkey Configuration​

PinePods requires Valkey (or Redis). Set either a connection URL or a host and port. Every VALKEY_* variable can also be spelled REDIS_*; when both are set, VALKEY_* wins.

VariableDefault ValueRequiredDescription
VALKEY_URL-NoComplete connection URL, e.g. redis://user:password@valkey:6379/0. When set, it's used instead of the variables below
VALKEY_HOSTvalkeyYes (without VALKEY_URL)Valkey/Redis host
VALKEY_PORT6379Yes (without VALKEY_URL)Valkey/Redis port
VALKEY_PASSWORD-NoPassword, if your Valkey/Redis server requires one
VALKEY_USERNAME-NoUsername, if your server uses named users (ACLs)
VALKEY_DATABASE0NoDatabase number to use

OIDC (OpenID Connect) Configuration​

OIDC is turned on when OIDC_PROVIDER_NAME, OIDC_CLIENT_ID and OIDC_CLIENT_SECRET are set, along with either OIDC_DISCOVERY_URL or all three of the authorization, token and user info URLs. See the OIDC setup guide.

VariableDefault ValueRequiredDescription
OIDC_PROVIDER_NAME-OIDC SetupDisplay name for the OIDC provider
OIDC_CLIENT_ID-OIDC SetupOIDC client ID from your provider
OIDC_CLIENT_SECRET-OIDC SetupOIDC client secret from your provider
OIDC_DISCOVERY_URL-OIDC SetupYour provider's discovery URL (.../.well-known/openid-configuration). Can replace the three endpoint URLs below
OIDC_AUTHORIZATION_URL-OIDC SetupOIDC authorization endpoint URL
OIDC_TOKEN_URL-OIDC SetupOIDC token endpoint URL
OIDC_USER_INFO_URL-OIDC SetupOIDC user info endpoint URL
OIDC_BUTTON_TEXTLogin with OIDCNoText displayed on the OIDC login button
OIDC_SCOPEopenid email profileNoSpace-separated list of OIDC scopes
OIDC_BUTTON_COLOR#000000NoBackground color of the OIDC login button
OIDC_BUTTON_TEXT_COLOR#FFFFFFNoText color of the OIDC login button
OIDC_ICON_SVG-NoSVG icon code for the OIDC button
OIDC_NAME_CLAIM-NoOIDC claim field for user's display name
OIDC_EMAIL_CLAIM-NoOIDC claim field for user's email
OIDC_USERNAME_CLAIM-NoOIDC claim field for username
OIDC_ROLES_CLAIM-NoOIDC claim field for user roles
OIDC_USER_ROLE-NoRole value that grants regular user access
OIDC_ADMIN_ROLE-NoRole value that grants administrator access
OIDC_DISABLE_STANDARD_LOGINfalseNoSet to true to disable username/password login entirely

Initial Admin Account Setup​

These are only used the first time PinePods sets up a new database, and only when all four are set. Otherwise the web app asks you to create the first admin account when you first open it.

VariableDefault ValueRequiredDescription
USERNAME-NoInitial admin username
PASSWORD-NoInitial admin password
FULLNAME-NoInitial admin full name
EMAIL-NoInitial admin email address

Feed Refreshing, Podping and Podcast People​

How these work is explained in Feed updates, feed problems and Podping.

VariableDefault ValueRequiredDescription
PINEPODS_REFRESH_MAX_INTERVAL24hNoThe longest any podcast waits between refreshes. Minutes (90) or a number with s, m, h or d (6h). See when feeds are refreshed
PINEPODS_REFRESH_CRON-NoDeprecated. Only read when PINEPODS_REFRESH_MAX_INTERVAL isn't set; the gap between its runs becomes the maximum interval
PINEPODS_PODPING_URLthe search service (SEARCH_API_URL without /api/search)NoWhere Podping announcements are read from. See Podping
PINEPODS_PODPING_INTERVAL60NoSeconds between Podping reads
PEOPLE_SYNC_ENABLEDtrueNoSet to false to stop the background sync of host and guest credits from PodPeopleDB. Credits from the feeds themselves still work

Podcast Sync (gpodder)​

How these work is explained in the Podcast Sync Guide.

VariableDefault ValueRequiredDescription
PINEPODS_PUBLIC_URL(worked out from the request)NoThe server URL shown for gpodder apps. Set it if your apps reach PinePods at a different address than your browser does. See the server URL
PINEPODS_SYNC_CRON0 */5 * * * *NoSchedule for syncing with external servers. Six fields, starting with seconds
PINEPODS_SYNC_PUSH_DELAY30NoSeconds to wait after the last local change before pushing it
PINEPODS_SYNC_PUSH_MAX_DELAY120NoPush no later than this many seconds after the first unsent change
PINEPODS_SYNC_LOG_RETENTION_DAYS90NoHow long changes that a newer one replaced are kept in the sync history. 0 keeps everything

AI Features​

Transcripts and ad detection run in the optional pinepods-ai container. See Setting Up the AI Container, which also lists the AI container's own variables.

VariableDefault ValueRequiredDescription
PINEPODS_AI_URL-NoAddress of the AI container, e.g. http://pinepods-ai:8100. AI features stay off while it's unset
PINEPODS_AI_TOKEN-NoShared secret sent to the AI container. Must match the AI container's PINEPODS_AI_TOKEN if you set one there

Logging & Debugging​

VariableDefault ValueRequiredDescription
DEBUG_MODEfalseNoSet to true to send the app's logs to the container output (docker logs). Otherwise they go to /var/log/pinepods/service.log inside the container
RUST_LOGinfoNoLog level for the app, e.g. debug, or per module (info,pinepods_api::services::sync=debug)

Container & System Settings​

VariableDefault ValueRequiredDescription
PUID-NoUser ID to run PinePods as, so downloaded and backup files get the right owner. Set it together with PGID; without both, PinePods runs as root
PGID-NoGroup ID to run PinePods as. Set it together with PUID
TZUTCNoContainer timezone, e.g. America/New_York
YTDLP_PATH/opt/pinepods/downloads/.bin/yt-dlpNoWhere PinePods keeps the yt-dlp copy it uses for YouTube. It lives on the downloads volume so updates to it survive container recreation. You shouldn't need to change this

Quick Setup Guides​

Essential Variables for Any Setup​

# Database (required)
DB_TYPE: postgresql # or mariadb
DB_HOST: db
DB_PORT: 5432 # or 3306 for MariaDB
DB_USER: postgres # or root for MariaDB
DB_PASSWORD: "your_secure_password"
DB_NAME: pinepods_database

# Valkey/Redis (required)
VALKEY_HOST: valkey
VALKEY_PORT: 6379

# External APIs (required)
SEARCH_API_URL: "https://search.pinepods.online/api/search"
PEOPLE_API_URL: "https://people.pinepods.online"
HOSTNAME: "https://yourdomain.com:8040"

Complete OIDC Setup Example​

# Basic OIDC Configuration
OIDC_PROVIDER_NAME: "My Company SSO"
OIDC_CLIENT_ID: "your-client-id"
OIDC_CLIENT_SECRET: "your-client-secret"
OIDC_AUTHORIZATION_URL: "https://auth.company.com/oauth2/authorize"
OIDC_TOKEN_URL: "https://auth.company.com/oauth2/token"
OIDC_USER_INFO_URL: "https://auth.company.com/oauth2/userinfo"

# Optional OIDC Customization
OIDC_BUTTON_TEXT: "Login with Company SSO"
OIDC_SCOPE: "openid email profile groups"
OIDC_BUTTON_COLOR: "#1a365d"
OIDC_BUTTON_TEXT_COLOR: "#ffffff"

# Role Mapping
OIDC_ROLES_CLAIM: "groups"
OIDC_USER_ROLE: "pinepods-users"
OIDC_ADMIN_ROLE: "pinepods-admins"

# Disable standard login (optional)
OIDC_DISABLE_STANDARD_LOGIN: true

Legend​

  • Yes: Required for basic functionality
  • OIDC Setup: Required if using OIDC authentication
  • No: Optional enhancement