weavesignal/deploy/compose/.env.example
The WeaveSignal contributors 466b32ab6a WeaveSignal 1.0.0 — release one
The first public release. What it does: https://weavesignal.top; what changed: CHANGELOG.md.
2026-11-04 12:15:42 +00:00

88 lines
3.9 KiB
Shell

# SPDX-License-Identifier: AGPL-3.0-only
# SPDX-FileCopyrightText: 2026 The WeaveSignal contributors
# Copy to .env and fill in. .env holds secrets and is ignored by git.
# `weavesignal-control sample-config` makes a station identifier.
STATION_ID=00000000-0000-0000-0000-000000000000
STATION_NAME=Kettle FM
ROOM=studio
# How a caller asks for their call to be taken down: an email address or a link. Call-in stays
# closed until it is set (ADR-0124).
CONSENT_CONTACT=
# The image the desk and the control plane run (`just server-image` builds it).
SERVER_IMAGE=forgejo.weavesignal.top/weavesignal/weavesignal-server:1.0.0
LIVEKIT_API_KEY=weavesignal
# At least 32 characters.
LIVEKIT_API_SECRET=
LISTENERS_SOURCE_PASSWORD=
POSTGRES_PASSWORD=
# Leave empty to keep the admin routes off.
CONTROL_ADMIN_TOKEN=
# Keys the hash of chatters' email addresses (ADR-0125); at least 32 characters, e.g.
# `openssl rand -hex 32`. The chat will not start without it. Keep it with the database's backups:
# a different key finds none of the existing chat accounts.
CHAT_EMAIL_KEY=
# Keys the hash of staff email addresses and sign-in codes (ADR-0127), the same way; needed when
# MAIL_MODE is on.
CONTROL_EMAIL_KEY=
# Keys API tokens and webhook secrets (ADR-0195, ADR-0202): at least 32 characters, `openssl rand
# -hex 32`; weavesignal.sh makes one. Keep it with the backups: a different key revokes every token.
# Unset, the control plane derives one from CONTROL_ADMIN_TOKEN, and rotating that revokes them.
CONTROL_TOKEN_KEY=
# The chat's and the staff's sign-in codes: "off" until the station can send email ("command" pipes each to
# /usr/sbin/sendmail -t -i in the image's PATH; see weavesignal-chat sample-config).
MAIL_MODE=off
MAIL_FROM=chat@station.example
# Listing. Both are off until the station goes public. SEARCH_LISTING lets search engines list the
# public address (ADR-0133); DIRECTORY_LISTING makes the stream ask internet radio directories to
# list it (ADR-0129).
SEARCH_LISTING=false
DIRECTORY_LISTING=false
# The MP3 compatibility stream (ADR-0002): one extra stream, LAME-encoded, on the listener port
# under its own mount, for directories and smart speakers that do not take Opus. Off by default;
# the reverse proxy must publish the mount to reach anyone off this machine.
COMPAT_STREAM=false
COMPAT_MOUNT=programme.mp3
COMPAT_BITRATE=128
# The listener process's cushion of playout's feed, in seconds (ADR-0182); raise it to 1-2 on a busy host
# if listeners hear the fallback for moments while playout is on air.
FEED_BUFFER_S=0.5
# Playout's processing chain (ADR-0044): a slow gain control towards a loudness target, then the
# limiter. Set PROCESSING=false to take the gain control out (the limiter stays).
PROCESSING=true
PROCESSING_TARGET_LUFS=-16
PROCESSING_MAX_GAIN_DB=6
# Video (ADR-0009): cameras, the vision mixer, AV1 to HLS for the player. Off by default.
VIDEO=false
# Ports (ADR-0075): the defaults; any free port may be used instead.
CONTROL_PORT=7310
CHAT_PORT=7311
LISTENERS_PORT=7312
SRT_INGEST_PORT=7313
PLAYOUT_FEED_PORT=7315
DESK_FEED_PORT=7317
LIVEKIT_HTTP_PORT=7880
LIVEKIT_MEDIA_PORT=7882
# The public route (opt-in; see public.yaml). `weavesignal.sh --public station.example` writes
# these, derived addresses included, and runs the bundle with public.yaml; by hand, add public.yaml
# to the compose command and set what it reads. Left unset, the bundle stays on loopback.
# PUBLIC_DOMAIN=station.example
# PUBLIC_TLS=acme # or internal: Caddy's own CA (a private network, a test)
# ACME_EMAIL=
# PROXY_HTTPS_PORT=443 # a certificate authority reaches 443 and 80 only
# PROXY_HTTP_PORT=80
# TURN_TLS_PORT=5349 # LiveKit's TURN over TLS (ADR-0080); 15349 where 5349 is taken
# TURN_UDP_PORT=0 # 0 is off
# LIVEKIT_TCP_PORT=0 # ICE over TCP; 0 is off
# NODE_IP= # LiveKit's public address; empty, found by STUN
# TURN_ALLOW_CIDRS= # for a private NODE_IP: 10.0.0.5/32