a love letter to tangled (android, iOS, and a search API)
1services:
2 postgres:
3 image: pgvector/pgvector:pg17
4 restart: unless-stopped
5 environment:
6 POSTGRES_USER: ${POSTGRES_USER:-twisted}
7 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-twisted}
8 POSTGRES_DB: ${POSTGRES_DB:-twisted}
9 volumes:
10 - twisted-postgres:/var/lib/postgresql/data
11 healthcheck:
12 test:
13 [
14 "CMD-SHELL",
15 "pg_isready -h localhost -p 5432 -U ${POSTGRES_USER:-twisted} -d ${POSTGRES_DB:-twisted}",
16 ]
17 interval: 10s
18 timeout: 5s
19 retries: 5
20 expose:
21 - "5432"
22
23 migrate:
24 image: ${TWISTER_IMAGE:-twisted-api:latest}
25 command: ["twister", "migrate"]
26 restart: "no"
27 environment:
28 DATABASE_URL: ${DATABASE_URL:-postgresql://${POSTGRES_USER:-twisted}:${POSTGRES_PASSWORD:-twisted}@postgres:5432/${POSTGRES_DB:-twisted}?sslmode=disable}
29 LOG_LEVEL: ${LOG_LEVEL:-info}
30 LOG_FORMAT: ${LOG_FORMAT:-json}
31 depends_on:
32 postgres:
33 condition: service_healthy
34
35 api:
36 image: ${TWISTER_IMAGE:-twisted-api:latest}
37 build:
38 context: ./packages/api
39 dockerfile: Dockerfile
40 command: ["twister", "api"]
41 restart: unless-stopped
42 environment:
43 DATABASE_URL: ${DATABASE_URL:-postgresql://${POSTGRES_USER:-twisted}:${POSTGRES_PASSWORD:-twisted}@postgres:5432/${POSTGRES_DB:-twisted}?sslmode=disable}
44 HTTP_BIND_ADDR: ${HTTP_BIND_ADDR:-:8080}
45 LOG_LEVEL: ${LOG_LEVEL:-info}
46 LOG_FORMAT: ${LOG_FORMAT:-json}
47 SEARCH_DEFAULT_LIMIT: ${SEARCH_DEFAULT_LIMIT:-20}
48 SEARCH_MAX_LIMIT: ${SEARCH_MAX_LIMIT:-100}
49 SEARCH_DEFAULT_MODE: ${SEARCH_DEFAULT_MODE:-keyword}
50 READ_THROUGH_MODE: ${READ_THROUGH_MODE:-missing}
51 READ_THROUGH_COLLECTIONS: ${READ_THROUGH_COLLECTIONS:-}
52 READ_THROUGH_MAX_ATTEMPTS: ${READ_THROUGH_MAX_ATTEMPTS:-5}
53 INDEXED_COLLECTIONS: ${INDEXED_COLLECTIONS:-}
54 ENABLE_ADMIN_ENDPOINTS: ${ENABLE_ADMIN_ENDPOINTS:-false}
55 ADMIN_AUTH_TOKEN: ${ADMIN_AUTH_TOKEN:-}
56 OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID:-}
57 OAUTH_REDIRECT_URIS: ${OAUTH_REDIRECT_URIS:-}
58 depends_on:
59 migrate:
60 condition: service_completed_successfully
61 expose:
62 - "8080"
63
64 indexer:
65 image: ${TWISTER_IMAGE:-twisted-api:latest}
66 command: ["twister", "indexer"]
67 restart: unless-stopped
68 environment:
69 DATABASE_URL: ${DATABASE_URL:-postgresql://${POSTGRES_USER:-twisted}:${POSTGRES_PASSWORD:-twisted}@postgres:5432/${POSTGRES_DB:-twisted}?sslmode=disable}
70 INDEXER_HEALTH_ADDR: ${INDEXER_HEALTH_ADDR:-:9090}
71 LOG_LEVEL: ${LOG_LEVEL:-info}
72 LOG_FORMAT: ${LOG_FORMAT:-json}
73 TAP_URL: ${TAP_URL:-ws://tap:2480/channel}
74 TAP_AUTH_PASSWORD: ${TAP_AUTH_PASSWORD:?TAP_AUTH_PASSWORD is required}
75 INDEXED_COLLECTIONS: ${INDEXED_COLLECTIONS:?INDEXED_COLLECTIONS is required}
76 ENABLE_INGEST_ENRICHMENT: ${ENABLE_INGEST_ENRICHMENT:-true}
77 depends_on:
78 migrate:
79 condition: service_completed_successfully
80 tap:
81 condition: service_started
82 expose:
83 - "9090"
84
85 tap:
86 image: ghcr.io/bluesky-social/indigo/tap:sha-4f47add43060c27e8a37d9d76482ecddf001fcd8
87 restart: unless-stopped
88 environment:
89 TAP_BIND: :2480
90 TAP_DATABASE_URL: ${TAP_DATABASE_URL:-sqlite:///data/tap.db}
91 TAP_ADMIN_PASSWORD: ${TAP_AUTH_PASSWORD:?TAP_AUTH_PASSWORD is required}
92 TAP_LOG_LEVEL: ${TAP_LOG_LEVEL:-info}
93 TAP_COLLECTION_FILTERS: ${TAP_COLLECTION_FILTERS:-}
94 volumes:
95 - tap-data:/data
96 expose:
97 - "2480"
98
99 llama-embeddings:
100 image: ghcr.io/ggml-org/llama.cpp:server
101 restart: unless-stopped
102 environment:
103 HF_HOME: /models/hf-cache
104 LLAMA_CACHE: /models
105 command:
106 - --hf-repo
107 - ${LLAMA_MODEL_REPO:-nomic-ai/nomic-embed-text-v1.5-GGUF}
108 - --hf-file
109 - ${LLAMA_MODEL_FILE:-nomic-embed-text-v1.5.Q8_0.gguf}
110 - --embeddings
111 - --pooling
112 - mean
113 - --ctx-size
114 - ${LLAMA_CONTEXT_SIZE:-2048}
115 - --host
116 - 0.0.0.0
117 - --port
118 - "8080"
119 volumes:
120 - twisted-llama:/models
121 expose:
122 - "8080"
123
124volumes:
125 twisted-postgres:
126 tap-data:
127 twisted-llama: