From a08c7ffbcbaee2bd22233b6c769bf134c4446f90 Mon Sep 17 00:00:00 2001 From: poprhythm Date: Fri, 6 Mar 2026 03:46:45 +0000 Subject: [PATCH] Add inbox-zero service (Gmail AI assistant, Ollama backend) --- inbox-zero/docker-compose.yaml | 132 +++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 inbox-zero/docker-compose.yaml diff --git a/inbox-zero/docker-compose.yaml b/inbox-zero/docker-compose.yaml new file mode 100644 index 0000000..39fcc23 --- /dev/null +++ b/inbox-zero/docker-compose.yaml @@ -0,0 +1,132 @@ +services: + db: + image: postgres:16 + restart: unless-stopped + environment: + - POSTGRES_USER=inboxzero + - POSTGRES_DB=inboxzero + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U inboxzero'] + interval: 10s + timeout: 5s + retries: 5 + volumes: + - /srv/inbox-zero/postgres:/var/lib/postgresql/data + networks: + - inbox-zero-network + + redis: + image: redis:7 + restart: unless-stopped + volumes: + - /srv/inbox-zero/redis:/data + networks: + - inbox-zero-network + + serverless-redis-http: + image: hiett/serverless-redis-http:latest + restart: unless-stopped + environment: + SRH_MODE: env + SRH_TOKEN: ${UPSTASH_REDIS_TOKEN} + SRH_CONNECTION_STRING: "redis://redis:6379" + depends_on: + - redis + networks: + - inbox-zero-network + + web: + image: ghcr.io/elie222/inbox-zero:latest + pull_policy: always + restart: unless-stopped + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + environment: + NEXT_PUBLIC_BASE_URL: ${NEXT_PUBLIC_BASE_URL} + NEXT_PUBLIC_BYPASS_PREMIUM_CHECKS: "true" + NEXT_PUBLIC_EMAIL_SEND_ENABLED: "true" + DATABASE_URL: postgresql://inboxzero:${POSTGRES_PASSWORD}@db:5432/inboxzero?schema=public + DIRECT_URL: postgresql://inboxzero:${POSTGRES_PASSWORD}@db:5432/inboxzero?schema=public + UPSTASH_REDIS_URL: http://serverless-redis-http:80 + UPSTASH_REDIS_TOKEN: ${UPSTASH_REDIS_TOKEN} + INTERNAL_API_URL: http://web:3000 + AUTH_SECRET: ${AUTH_SECRET} + EMAIL_ENCRYPT_SECRET: ${EMAIL_ENCRYPT_SECRET} + EMAIL_ENCRYPT_SALT: ${EMAIL_ENCRYPT_SALT} + GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID} + GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET} + GOOGLE_PUBSUB_TOPIC_NAME: ${GOOGLE_PUBSUB_TOPIC_NAME} + GOOGLE_PUBSUB_VERIFICATION_TOKEN: ${GOOGLE_PUBSUB_VERIFICATION_TOKEN} + CRON_SECRET: ${CRON_SECRET} + INTERNAL_API_KEY: ${INTERNAL_API_KEY} + API_KEY_SALT: ${API_KEY_SALT} + # Ollama AI provider + DEFAULT_LLM_PROVIDER: ollama + DEFAULT_LLM_MODEL: ${OLLAMA_MODEL} + ECONOMY_LLM_PROVIDER: ollama + ECONOMY_LLM_MODEL: ${OLLAMA_MODEL} + OLLAMA_BASE_URL: http://ollama:11434 + networks: + - inbox-zero-network + - npm-network + + cron: + image: alpine:latest + restart: unless-stopped + command: > + sh -c " + apk add --no-cache curl && + ( + while true; do + curl -s -X GET 'http://web:3000/api/cron/scheduled-actions' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 900 + done + ) & + ( + while true; do + curl -s -X GET 'http://web:3000/api/cron/automation-jobs' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 900 + done + ) & + ( + while true; do + curl -s -X GET 'http://web:3000/api/follow-up-reminders' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 3600 + done + ) & + ( + while true; do + curl -s -X GET 'http://web:3000/api/resend/digest/all' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 1800 + done + ) & + ( + while true; do + curl -s -X GET 'http://web:3000/api/meeting-briefs' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 900 + done + ) & + ( + while true; do + curl -s -X GET 'http://web:3000/api/watch/all' -H \"Authorization: Bearer $${CRON_SECRET}\" || true + sleep 21600 + done + ) & + wait + " + environment: + CRON_SECRET: ${CRON_SECRET} + depends_on: + - web + networks: + - inbox-zero-network + +networks: + inbox-zero-network: + driver: bridge + npm-network: + external: true