Files
selfphoneng/docker-compose.yml
iamdoubz 692dd59552
ci / check (push) Successful in 1m0s
ci / images (push) Successful in 32s
contacts: Contrack as the robust contacts (C3), picked in Settings or the setup wizard
Spec 11 §4: contacts.provider and contacts.contrack (local address only, company token
write-only), each person's own token (users.contrack_token_enc, migration 0010) in My settings,
books read from Contrack with a 5-minute cache, Add to contacts and accepted shares created in
Contrack, the company account on desk phones. Setup wizard step 8 Contacts. deploy/contrack
(2.0.2, pinned), Caddy/nginx blocks, decision 0003, admin guide Contacts. Tested against a fake
and a real Contrack 2.0.2 (contrack-live.test.ts).
2026-10-23 15:23:49 -05:00

94 lines
3.1 KiB
YAML

# SPDX-License-Identifier: AGPL-3.0-or-later
name: selfphoneng
# Container logs (docker compose logs): 3 files of 10 MB each, then the oldest goes.
x-logging: &logging
driver: json-file
options: { max-size: 10m, max-file: '3' }
x-shared-volumes: &shared-volumes
- ./data/asterisk-generated:/etc/asterisk/selfphoneng
- ./data/voicemail:/var/spool/asterisk/voicemail
- ./data/recordings:/var/spool/asterisk/monitor
- ./data/sounds-custom:/var/lib/asterisk/sounds/custom
- ./data/moh:/var/lib/asterisk/moh
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
logging: *logging
environment:
POSTGRES_DB: selfphoneng
POSTGRES_USER: selfphoneng
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set in .env}
volumes:
- ./data/postgres:/var/lib/postgresql # PG 18 images keep data in /var/lib/postgresql/18/docker; mount the parent, NOT .../data
ports:
- '127.0.0.1:${POSTGRES_PORT:-5433}:5432'
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U selfphoneng -d selfphoneng']
interval: 5s
retries: 20
asterisk:
build:
context: ./asterisk
args:
ASTERISK_UID: ${APP_UID:-1000}
ASTERISK_GID: ${APP_GID:-1000}
restart: unless-stopped
logging: *logging
network_mode: host
environment:
AMI_SECRET: ${AMI_SECRET:?set in .env}
TZ: ${TZ:-America/Chicago}
volumes:
- ./data/asterisk-generated:/etc/asterisk/selfphoneng
- ./data/voicemail:/var/spool/asterisk/voicemail
- ./data/recordings:/var/spool/asterisk/monitor
- ./data/sounds-custom:/var/lib/asterisk/sounds/custom
- ./data/moh:/var/lib/asterisk/moh
- ./data/astdb:/var/lib/asterisk/db
- ./data/asterisk-logs:/var/log/asterisk
- ./data/tls:/var/lib/selfphoneng/tls:ro # SIP TLS cert (M11-T2): fullchain.pem + privkey.pem
api:
build:
context: .
dockerfile: apps/api/Dockerfile
restart: unless-stopped
logging: *logging
network_mode: host
user: '${APP_UID:-1000}:${APP_GID:-1000}'
depends_on:
postgres: { condition: service_healthy }
asterisk: { condition: service_started }
env_file: .env
environment:
DATABASE_URL: postgres://selfphoneng:${POSTGRES_PASSWORD}@127.0.0.1:${POSTGRES_PORT:-5433}/selfphoneng
AMI_HOST: 127.0.0.1
AMI_PORT: '5038'
AMI_USERNAME: selfphoneng
volumes:
- ./data/asterisk-generated:/etc/asterisk/selfphoneng
- ./data/voicemail:/var/spool/asterisk/voicemail
- ./data/recordings:/var/spool/asterisk/monitor
- ./data/sounds-custom:/var/lib/asterisk/sounds/custom
- ./data/moh:/var/lib/asterisk/moh
- ./data/backups:/var/lib/selfphoneng/backups
- ./data/tls:/var/lib/selfphoneng/tls:ro
caddy:
image: caddy:2
profiles: ['caddy']
restart: unless-stopped
logging: *logging
network_mode: host
environment:
PUBLIC_HOSTNAME: ${PUBLIC_HOSTNAME:?set in .env}
CONTRACK_HOSTNAME: ${CONTRACK_HOSTNAME:-} # deploy/caddy/Caddyfile, when Contrack runs
volumes:
- ./deploy/caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- ./data/caddy:/data