-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
129 lines (115 loc) · 4.32 KB
/
docker-compose.yml
File metadata and controls
129 lines (115 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
services:
# ── AVA core application ──────────────────────────────────────────────────
ava:
build: .
container_name: ava
restart: unless-stopped
# Port only accessible within Docker network (via Caddy), not from internet
expose:
- "8000"
environment:
# Twilio Voice
- TWILIO_ACCOUNT_SID=${TWILIO_ACCOUNT_SID}
- TWILIO_AUTH_TOKEN=${TWILIO_AUTH_TOKEN}
- TWILIO_PHONE_NUMBER=${TWILIO_PHONE_NUMBER}
# Signal – self-hosted, no external API
- SIGNAL_CLI_URL=http://signal-cli:8080
- SIGNAL_SENDER_NUMBER=${SIGNAL_SENDER_NUMBER} # bot number registered in signal-cli
- SIGNAL_RECIPIENT=${SIGNAL_RECIPIENT} # your personal Signal number
# OpenAI
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_MODEL=${OPENAI_MODEL:-gpt-4o}
# ElevenLabs TTS (optional – falls back to OpenAI TTS then Twilio Polly)
- ELEVENLABS_API_KEY=${ELEVENLABS_API_KEY:-}
- ELEVENLABS_VOICE_ID=${ELEVENLABS_VOICE_ID:-WAhoMTNdLdMoq1j3wf3I}
- ELEVENLABS_MODEL=${ELEVENLABS_MODEL:-eleven_multilingual_v2}
# OpenAI TTS fallback voice
- OPENAI_TTS_VOICE=${OPENAI_TTS_VOICE:-nova}
# STT & language
- DEFAULT_STT_LANG=${DEFAULT_STT_LANG:-en-US}
- SIGNAL_LANG=${SIGNAL_LANG:-en}
# Customise AVA's behaviour without code changes
- OWNER_CONTEXT=${OWNER_CONTEXT:-}
# Public HTTPS URL Twilio uses to fetch TTS audio files
- PUBLIC_URL=${PUBLIC_URL}
volumes:
- ./data:/data # place contacts.json here
- tts_cache:/tmp/tts_cache
depends_on:
signal-cli:
condition: service_started
networks:
- ava-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 5s
retries: 3
# ── signal-cli REST API ───────────────────────────────────────────────────
# Self-hosted Signal gateway. No Signal API key needed – connects directly
# to Signal servers using the registered phone number.
# https://github.com/bbernhard/signal-cli-rest-api
signal-cli:
image: bbernhard/signal-cli-rest-api:latest
container_name: ava-signal-cli
restart: unless-stopped
environment:
- MODE=native # native mode = lower latency
- AUTO_RECEIVE_SCHEDULE=0/1 * * * * # pull messages every minute (AVA polls every 3 s anyway)
volumes:
- signal_data:/home/.local/share/signal-cli
ports:
- "127.0.0.1:8080:8080" # internal only – never expose to internet
networks:
- ava-net
# ── Cloudflare Tunnel ─────────────────────────────────────────────────────
# Exposes AVA to the internet via Cloudflare's network without opening ports.
# Create a tunnel at https://one.dash.cloudflare.com → Networks → Tunnels
# and paste the token into CLOUDFLARE_TUNNEL_TOKEN in .env
#
# Start with: docker compose --profile tunnel up -d
cloudflared:
image: cloudflare/cloudflared:latest
container_name: ava-cloudflared
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
networks:
- ava-net
depends_on:
- ava
profiles:
- tunnel
# ── Caddy – automatic HTTPS ───────────────────────────────────────────────
# Twilio requires HTTPS webhooks.
# Caddy auto-provisions a Let's Encrypt certificate for your domain.
#
# Start with: docker compose --profile caddy up -d
caddy:
image: caddy:2-alpine
container_name: ava-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=${DOMAIN:-localhost}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- ava-net
depends_on:
- ava
profiles:
- caddy
volumes:
tts_cache:
signal_data:
caddy_data:
caddy_config:
networks:
ava-net:
driver: bridge