Panora

An API to add an integration catalog to your SaaS product in minutes (alternative to Merge.dev).

Directory Structure

    • .env
    • docker-compose.yml

docker-compose.yml

# this docker compose is for development purposes.
# use it to build locally instead of pulling pre-build images from cloud
 
name: panora
version: '3.8'
 
services:
  postgres:
    image: postgres:16.1
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports: 
      - '5432:5432'
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}']
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - ./pg_data:/var/lib/postgresql/data
      - ./packages/api/scripts/init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./packages/api/scripts/automatic_timestamps.sql:/docker-entrypoint-initdb.d/automatic_timestamps.sql
      - ./packages/api/scripts/seed.sql:/docker-entrypoint-initdb.d/seed.sql
    networks:
      - backend
 
  api:
    build:
      context: ./
      dockerfile: ./packages/api/Dockerfile
    environment:
      ENV: ${ENV}
      DOPPLER_TOKEN: ${DOPPLER_TOKEN_API}
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}?ssl=false
      DISTRIBUTION: ${DISTRIBUTION}
      WEBHOOK_INGRESS: ${WEBHOOK_INGRESS}
      REDIRECT_TUNNEL_INGRESS: "https://panora-contributors-redirect.rachid-7e5.workers.dev/http://localhost:3000"
      JWT_SECRET: ${JWT_SECRET}
      SENTRY_ENABLED: ${SENTRY_ENABLED}
      SENTRY_DSN: ${SENTRY_DSN}
      REDIS_HOST: ${REDIS_HOST}
      REDIS_USER: ${REDIS_USER}
      REDIS_PASS: ${REDIS_PASS}
      BACKEND_PORT: ${BACKEND_PORT}
      WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_DOMAIN}
      REDIS_DB: ${REDIS_DB}
      ENCRYPT_CRYPTO_SECRET_KEY: ${ENCRYPT_CRYPTO_SECRET_KEY}
      HUBSPOT_CRM_CLOUD_CLIENT_ID: ${HUBSPOT_CRM_CLOUD_CLIENT_ID}
      HUBSPOT_CRM_CLOUD_CLIENT_SECRET: ${HUBSPOT_CRM_CLOUD_CLIENT_SECRET}
      ATTIO_CRM_CLOUD_CLIENT_ID: ${ATTIO_CRM_CLOUD_CLIENT_ID}
      ATTIO_CRM_CLOUD_CLIENT_SECRET: ${ATTIO_CRM_CLOUD_CLIENT_SECRET}
      ZOHO_CRM_CLOUD_CLIENT_ID: ${ZOHO_CRM_CLOUD_CLIENT_ID}
      ZOHO_CRM_CLOUD_CLIENT_SECRET: ${ZOHO_CRM_CLOUD_CLIENT_SECRET}
      PIPEDRIVE_CRM_CLOUD_CLIENT_ID: ${PIPEDRIVE_CRM_CLOUD_CLIENT_ID}
      PIPEDRIVE_CRM_CLOUD_CLIENT_SECRET: ${PIPEDRIVE_CRM_CLOUD_CLIENT_SECRET}
      ZENDESK_CRM_CLOUD_CLIENT_ID: ${ZENDESK_CRM_CLOUD_CLIENT_ID}
      ZENDESK_CRM_CLOUD_CLIENT_SECRET: ${ZENDESK_CRM_CLOUD_CLIENT_SECRET}
      PANORA_BASE_API_URL: ${PANORA_BASE_API_URL}
      ZENDESK_TICKETING_CLOUD_CLIENT_ID: ${ZENDESK_TICKETING_CLOUD_CLIENT_ID}
      ZENDESK_TICKETING_CLOUD_CLIENT_SECRET: ${ZENDESK_TICKETING_CLOUD_CLIENT_SECRET}
      ZENDESK_TICKETING_CLOUD_SUBDOMAIN: ${ZENDESK_TICKETING_CLOUD_SUBDOMAIN}
      FRONT_TICKETING_CLOUD_CLIENT_ID: ${FRONT_TICKETING_CLOUD_CLIENT_ID}
      FRONT_TICKETING_CLOUD_CLIENT_SECRET: ${FRONT_TICKETING_CLOUD_CLIENT_SECRET}
      CLICKUP_TICKETING_CLOUD_CLIENT_ID: ${CLICKUP_TICKETING_CLOUD_CLIENT_ID}
      CLICKUP_TICKETING_CLOUD_CLIENT_SECRET: ${CLICKUP_TICKETING_CLOUD_CLIENT_SECRET}
      GITHUB_TICKETING_CLOUD_CLIENT_ID: ${GITHUB_TICKETING_CLOUD_CLIENT_ID}
      GITHUB_TICKETING_CLOUD_CLIENT_SECRET: ${GITHUB_TICKETING_CLOUD_CLIENT_SECRET}
      GITLAB_TICKETING_CLOUD_CLIENT_ID: ${GITLAB_TICKETING_CLOUD_CLIENT_ID}
      GITLAB_TICKETING_CLOUD_CLIENT_SECRET: ${GITLAB_TICKETING_CLOUD_CLIENT_SECRET}
      GORGIAS_TICKETING_CLOUD_CLIENT_ID: ${GORGIAS_TICKETING_CLOUD_CLIENT_ID}
      GORGIAS_TICKETING_CLOUD_CLIENT_SECRET: ${GORGIAS_TICKETING_CLOUD_CLIENT_SECRET}
      GORGIAS_TICKETING_CLOUD_SUBDOMAIN: ${GORGIAS_TICKETING_CLOUD_SUBDOMAIN}
      JIRA_TICKETING_CLOUD_CLIENT_ID: ${JIRA_TICKETING_CLOUD_CLIENT_ID}
      JIRA_TICKETING_CLOUD_CLIENT_SECRET: ${JIRA_TICKETING_CLOUD_CLIENT_SECRET}
      JIRA_SERVICEMGMT_TICKETING_CLOUD_CLIENT_ID: ${JIRA_SERVICEMGMT_TICKETING_CLOUD_CLIENT_ID}
      JIRA_SERVICEMGMT_TICKETING_CLOUD_CLIENT_SECRET: ${JIRA_SERVICEMGMT_TICKETING_CLOUD_CLIENT_SECRET}
      LINEAR_TICKETING_CLOUD_CLIENT_ID: ${LINEAR_TICKETING_CLOUD_CLIENT_ID}
      LINEAR_TICKETING_CLOUD_CLIENT_SECRET: ${LINEAR_TICKETING_CLOUD_CLIENT_SECRET}
      ACCELO_CRM_CLOUD_CLIENT_ID: ${ACCELO_CRM_CLOUD_CLIENT_ID}
      ACCELO_CRM_CLOUD_CLIENT_SECRET: ${ACCELO_CRM_CLOUD_CLIENT_SECRET}
      ACCELO_CRM_CLOUD_SUBDOMAIN: ${ACCELO_CRM_CLOUD_SUBDOMAIN}
      CAPSULE_CRM_CLOUD_CLIENT_ID: ${CAPSULE_CRM_CLOUD_CLIENT_ID}
      CAPSULE_CRM_CLOUD_CLIENT_SECRET: ${CAPSULE_CRM_CLOUD_CLIENT_SECRET}
      CLOSE_CRM_CLOUD_CLIENT_ID: ${CLOSE_CRM_CLOUD_CLIENT_ID}
      CLOSE_CRM_CLOUD_CLIENT_SECRET: ${CLOSE_CRM_CLOUD_CLIENT_SECRET}
      COPPER_CRM_CLOUD_CLIENT_ID: ${COPPER_CRM_CLOUD_CLIENT_ID}
      COPPER_CRM_CLOUD_CLIENT_SECRET: ${COPPER_CRM_CLOUD_CLIENT_SECRET}
      KEAP_CRM_CLOUD_CLIENT_ID: ${KEAP_CRM_CLOUD_CLIENT_ID}
      KEAP_CRM_CLOUD_CLIENT_SECRET: ${KEAP_CRM_CLOUD_CLIENT_SECRET}
      TEAMLEADER_CRM_CLOUD_CLIENT_ID: ${TEAMLEADER_CRM_CLOUD_CLIENT_ID}
      TEAMLEADER_CRM_CLOUD_CLIENT_SECRET: ${TEAMLEADER_CRM_CLOUD_CLIENT_SECRET}
      TEAMWORK_CRM_CLOUD_CLIENT_ID: ${TEAMWORK_CRM_CLOUD_CLIENT_ID}
      TEAMWORK_CRM_CLOUD_CLIENT_SECRET: ${TEAMWORK_CRM_CLOUD_CLIENT_SECRET}
      AHA_TICKETING_CLOUD_CLIENT_ID: ${AHA_TICKETING_CLOUD_CLIENT_ID}
      AHA_TICKETING_CLOUD_CLIENT_SECRET: ${AHA_TICKETING_CLOUD_CLIENT_SECRET}
      AHA_TICKETING_CLOUD_SUBDOMAIN: ${AHA_TICKETING_CLOUD_SUBDOMAIN}
      WRIKE_TICKETING_CLOUD_CLIENT_ID: ${WRIKE_TICKETING_CLOUD_CLIENT_ID}
      WRIKE_TICKETING_CLOUD_CLIENT_SECRET: ${WRIKE_TICKETING_CLOUD_CLIENT_SECRET}
      ASANA_TICKETING_CLOUD_CLIENT_ID: ${ASANA_TICKETING_CLOUD_CLIENT_ID}
      ASANA_TICKETING_CLOUD_CLIENT_SECRET: ${ASANA_TICKETING_CLOUD_CLIENT_SECRET}
      PENNYLANE_ACCOUNTING_CLOUD_CLIENT_ID: ${PENNYLANE_ACCOUNTING_CLOUD_CLIENT_ID}
      PENNYLANE_ACCOUNTING_CLOUD_CLIENT_SECRET: ${PENNYLANE_ACCOUNTING_CLOUD_CLIENT_SECRET}
      FRESHBOOKS_ACCOUNTING_CLOUD_CLIENT_ID: ${FRESHBOOKS_ACCOUNTING_CLOUD_CLIENT_ID}
      FRESHBOOKS_ACCOUNTING_CLOUD_CLIENT_SECRET: ${FRESHBOOKS_ACCOUNTING_CLOUD_CLIENT_SECRET}
      FREEAGENT_ACCOUNTING_CLOUD_CLIENT_ID: ${FREEAGENT_ACCOUNTING_CLOUD_CLIENT_ID}
      FREEAGENT_ACCOUNTING_CLOUD_CLIENT_SECRET: ${FREEAGENT_ACCOUNTING_CLOUD_CLIENT_SECRET}
      SAGE_ACCOUNTING_CLOUD_CLIENT_ID: ${SAGE_ACCOUNTING_CLOUD_CLIENT_ID}
      SAGE_ACCOUNTING_CLOUD_CLIENT_SECRET: ${SAGE_ACCOUNTING_CLOUD_CLIENT_SECRET}
      MONEYBIRD_ACCOUNTING_CLOUD_CLIENT_ID: ${MONEYBIRD_ACCOUNTING_CLOUD_CLIENT_ID}
      MONEYBIRD_ACCOUNTING_CLOUD_CLIENT_SECRET: ${MONEYBIRD_ACCOUNTING_CLOUD_CLIENT_SECRET}
      QUICKBOOKS_ACCOUNTING_CLOUD_CLIENT_ID: ${QUICKBOOKS_ACCOUNTING_CLOUD_CLIENT_ID}
      QUICKBOOKS_ACCOUNTING_CLOUD_CLIENT_SECRET: ${QUICKBOOKS_ACCOUNTING_CLOUD_CLIENT_SECRET}
      WAVE_FINANCIAL_ACCOUNTING_CLOUD_CLIENT_ID: ${WAVE_FINANCIAL_ACCOUNTING_CLOUD_CLIENT_ID}
      WAVE_FINANCIAL_ACCOUNTING_CLOUD_CLIENT_SECRET: ${WAVE_FINANCIAL_ACCOUNTING_CLOUD_CLIENT_SECRET}
      GETRESPONSE_MARKETINGAUTOMATION_CLOUD_CLIENT_ID: ${GETRESPONSE_MARKETINGAUTOMATION_CLOUD_CLIENT_ID}
      GETRESPONSE_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET: ${GETRESPONSE_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET}
      MAILCHIMP_MARKETINGAUTOMATION_CLOUD_CLIENT_ID: ${MAILCHIMP_MARKETINGAUTOMATION_CLOUD_CLIENT_ID}
      MAILCHIMP_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET: ${MAILCHIMP_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET}
      PODIUM_MARKETINGAUTOMATION_CLOUD_CLIENT_ID: ${PODIUM_MARKETINGAUTOMATION_CLOUD_CLIENT_ID}
      PODIUM_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET: ${PODIUM_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET}
      DEEL_HRIS_CLOUD_CLIENT_ID: ${DEEL_HRIS_CLOUD_CLIENT_ID}
      DEEL_HRIS_CLOUD_CLIENT_SECRET: ${DEEL_HRIS_CLOUD_CLIENT_SECRET}
      XERO_ACCOUNTING_CLOUD_CLIENT_ID: ${XERO_ACCOUNTING_CLOUD_CLIENT_ID}
      XERO_ACCOUNTING_CLOUD_CLIENT_SECRET: ${XERO_ACCOUNTING_CLOUD_CLIENT_ID}
      RIPPLING_HRIS_CLOUD_CLIENT_ID: ${RIPPLING_HRIS_CLOUD_CLIENT_ID}
      RIPPLING_HRIS_CLOUD_CLIENT_SECRET: ${RIPPLING_HRIS_CLOUD_CLIENT_SECRET}
      GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID: ${GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID}
      GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET: ${GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET}
      ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID: ${ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID}
      ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET: ${ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET}
      SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_ID: ${SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_ID}
      SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_SECRET: ${SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_SECRET}
      DROPBOX_FILESTORAGE_CLOUD_CLIENT_ID: ${DROPBOX_FILESTORAGE_CLOUD_CLIENT_ID}
      DROPBOX_FILESTORAGE_CLOUD_CLIENT_SECRET: ${DROPBOX_FILESTORAGE_CLOUD_CLIENT_SECRET}
      BOX_FILESTORAGE_CLOUD_CLIENT_ID: ${BOX_FILESTORAGE_CLOUD_CLIENT_ID}
      BOX_FILESTORAGE_CLOUD_CLIENT_SECRET: ${BOX_FILESTORAGE_CLOUD_CLIENT_SECRET}
      KEAP_MARKETINGAUTOMATION_CLOUD_CLIENT_ID: ${KEAP_MARKETINGAUTOMATION_CLOUD_CLIENT_ID}
      KEAP_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET: ${KEAP_MARKETINGAUTOMATION_CLOUD_CLIENT_SECRET}
      GUSTO_HRIS_CLOUD_CLIENT_ID: ${GUSTO_HRIS_CLOUD_CLIENT_ID}
      GUSTO_HRIS_CLOUD_CLIENT_SECRET: ${GUSTO_HRIS_CLOUD_CLIENT_SECRET}
      GREENHOUSE_ATS_CLOUD_CLIENT_ID: ${GREENHOUSE_ATS_CLOUD_CLIENT_ID}
      GREENHOUSE_ATS_CLOUD_CLIENT_SECRET: ${GREENHOUSE_ATS_CLOUD_CLIENT_SECRET}
      JOBADDER_ATS_CLOUD_CLIENT_ID: ${JOBADDER_ATS_CLOUD_CLIENT_ID}
      JOBADDER_ATS_CLOUD_CLIENT_SECRET: ${JOBADDER_ATS_CLOUD_CLIENT_SECRET}
      LEVER_ATS_CLOUD_CLIENT_ID: ${LEVER_ATS_CLOUD_CLIENT_ID}
      LEVER_ATS_CLOUD_CLIENT_SECRET: ${LEVER_ATS_CLOUD_CLIENT_SECRET}
      FACTORIAL_HRIS_CLOUD_CLIENT_ID: ${FACTORIAL_ATS_CLOUD_CLIENT_ID}
      FACTORIAL_HRIS_CLOUD_CLIENT_SECRET: ${FACTORIAL_ATS_CLOUD_CLIENT_SECRET}
      PAYFIT_HRIS_CLOUD_CLIENT_ID: ${PAYFIT_HRIS_CLOUD_CLIENT_ID}
      PAYFIT_HRIS_CLOUD_CLIENT_SECRET: ${PAYFIT_HRIS_CLOUD_CLIENT_SECRET}
      NOTION_PRODUCTIVITY_CLOUD_CLIENT_ID: ${NOTION_PRODUCTIVITY_CLOUD_CLIENT_ID}
      NOTION_PRODUCTIVITY_CLOUD_CLIENT_SECRET: ${NOTION_PRODUCTIVITY_CLOUD_CLIENT_SECRET}
      SLACK_PRODUCTIVITY_CLOUD_CLIENT_ID: ${SLACK_PRODUCTIVITY_CLOUD_CLIENT_ID}
      SLACK_PRODUCTIVITY_CLOUD_CLIENT_SECRET: ${SLACK_PRODUCTIVITY_CLOUD_CLIENT_SECRET}
      NAMELY_HRIS_CLOUD_CLIENT_ID: ${NAMELY_HRIS_CLOUD_CLIENT_ID}
      NAMELY_HRIS_CLOUD_CLIENT_SECRET: ${NAMELY_HRIS_CLOUD_CLIENT_SECRET}
      NAMELY_HRIS_CLOUD_SUBDOMAIN: ${NAMELY_HRIS_CLOUD_SUBDOMAIN}
      KLAVIYO_TICKETING_CLOUD_CLIENT_ID: ${KLAVIYO_TICKETING_CLOUD_CLIENT_ID}
      KLAVIYO_TICKETING_CLOUD_CLIENT_SECRET: ${KLAVIYO_TICKETING_CLOUD_CLIENT_SECRET}
      HELPSCOUT_TICKETING_CLOUD_CLIENT_ID: ${HELPSCOUT_TICKETING_CLOUD_CLIENT_ID}
      HELPSCOUT_TICKETING_CLOUD_CLIENT_SECRET: ${HELPSCOUT_TICKETING_CLOUD_CLIENT_SECRET}
      IRONCLAD_TICKETING_CLOUD_CLIENT_ID: ${IRONCLAD_TICKETING_CLOUD_CLIENT_ID}
      IRONCLAD_TICKETING_CLOUD_CLIENT_SECRET: ${IRONCLAD_TICKETING_CLOUD_CLIENT_SECRET}
      SHOPIFY_ECOMMERCE_CLOUD_CLIENT_ID: ${SHOPIFY_ECOMMERCE_CLOUD_CLIENT_ID}
      SHOPIFY_ECOMMERCE_CLOUD_CLIENT_SECRET: ${SHOPIFY_ECOMMERCE_CLOUD_CLIENT_SECRET}
      SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_ID: ${SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_ID}
      SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_SECRET: ${SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_SECRET}
      EBAY_ECOMMERCE_CLOUD_CLIENT_ID: ${EBAY_ECOMMERCE_CLOUD_CLIENT_ID}
      EBAY_ECOMMERCE_CLOUD_CLIENT_SECRET: ${EBAY_ECOMMERCE_CLOUD_CLIENT_SECRET}
      EBAY_ECOMMERCE_CLOUD_RUVALUE: ${EBAY_ECOMMERCE_CLOUD_RUVALUE}
      FAIRE_ECOMMERCE_CLOUD_CLIENT_ID: ${FAIRE_ECOMMERCE_CLOUD_CLIENT_ID}
      FAIRE_ECOMMERCE_CLOUD_CLIENT_SECRET: ${FAIRE_ECOMMERCE_CLOUD_CLIENT_SECRET}
      WEBFLOW_ECOMMERCE_CLOUD_CLIENT_ID: ${WEBFLOW_ECOMMERCE_CLOUD_CLIENT_ID}
      WEBFLOW_ECOMMERCE_CLOUD_CLIENT_SECRET: ${WEBFLOW_ECOMMERCE_CLOUD_CLIENT_SECRET}
      AMAZON_ECOMMERCE_CLOUD_CLIENT_ID: ${AMAZON_ECOMMERCE_CLOUD_CLIENT_ID}
      AMAZON_ECOMMERCE_CLOUD_CLIENT_SECRET: ${AMAZON_ECOMMERCE_CLOUD_CLIENT_SECRET}
      AMAZON_ECOMMERCE_CLOUD_APPLICATION_ID: ${AMAZON_ECOMMERCE_CLOUD_APPLICATION_ID}
      EMAIL_SENDING_ADDRESS: ${EMAIL_SENDING_ADDRESS}
      SMTP_HOST: ${SMTP_HOST}
      SMTP_PORT: ${SMTP_PORT}
      SMTP_USER: ${SMTP_USER}
      SMTP_PASSWORD: ${SMTP_PASSWORD}
      MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_ID: ${MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_ID}
      MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_SECRET: ${MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_SECRET}
      SNYK_CYBERSECURITY_CLOUD_CLIENT_ID: ${SNYK_CYBERSECURITY_CLOUD_CLIENT_ID}
      SNYK_CYBERSECURITY_CLOUD_CLIENT_SECRET: ${SNYK_CYBERSECURITY_CLOUD_CLIENT_SECRET}
      CROWDSTRIKE_CYBERSECURITY_CLOUD_CLIENT_ID: ${CROWDSTRIKE_CYBERSECURITY_CLOUD_CLIENT_ID}
      CROWDSTRIKE_CYBERSECURITY_CLOUD_CLIENT_SECRET: ${CROWDSTRIKE_CYBERSECURITY_CLOUD_CLIENT_SECRET}
      POSTHOG_HOST: "https://us.i.posthog.com"
      POSTHOG_KEY:  "phc_WhWJfNPOHAuWVdyTacGxrPa9JW54scnofA9KVEjFcFw"
      PH_TELEMETRY: "TRUE"
      SALESFORCE_CRM_CLOUD_CLIENT_ID: ${SALESFORCE_CRM_CLOUD_CLIENT_ID}
      SALESFORCE_CRM_CLOUD_CLIENT_SECRET: ${SALESFORCE_CRM_CLOUD_CLIENT_SECRET}
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      JINA_API_KEY: ${JINA_API_KEY}
      COHERE_API_KEY: ${COHERE_API_KEY}
      AWS_S3_REGION: ${AWS_S3_REGION}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      UNSTRUCTURED_API_KEY: ${UNSTRUCTURED_API_KEY}
      UNSTRUCTURED_API_URL: ${UNSTRUCTURED_API_URL} 
      PINECONE_API_KEY: ${PINECONE_API_KEY}
      PINECONE_INDEX_NAME: ${PINECONE_INDEX_NAME}
      QDRANT_BASE_URL: ${QDRANT_BASE_URL}
      QDRANT_API_KEY: ${QDRANT_API_KEY}
      QDRANT_COLLECTION_NAME: ${QDRANT_COLLECTION_NAME}
      CHROMADB_URL: ${CHROMADB_URL}
      CHROMADB_COLLECTION_NAME: ${CHROMADB_COLLECTION_NAME}
      WEAVIATE_URL: ${WEAVIATE_URL}
      WEAVIATE_API_KEY: ${WEAVIATE_API_KEY}
      WEAVIATE_CLASS_NAME: ${WEAVIATE_CLASS_NAME}
      TURBOPUFFER_API_KEY: ${TURBOPUFFER_API_KEY}
      MILVUS_ADDRESS: ${MILVUS_ADDRESS}
      MILVUS_COLLECTION_NAME: ${MILVUS_COLLECTION_NAME}
      
    restart: unless-stopped
    ports:
      - 3000:3000
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - backend
    #healthcheck:
      #test: ["CMD-SHELL", "curl", "-f", "http://localhost:3000/health"]
      #start_period: 60s
      #interval: 10s
      #timeout: 1s
      #retries: 50
 
  redis:
    image: valkey/valkey:7.2-alpine
    container_name: 'Redis'
    command: valkey-server --requirepass ${REDIS_PASS}
    ports:
      - '${REDIS_PORT}:${REDIS_PORT}'
    volumes:
      - ./redis-data:/data
    networks:
      - backend
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
      
  webapp-next:
    build:
      dockerfile: ./apps/webapp/Dockerfile
      context: ./
      args:
        NEXT_PUBLIC_POSTHOG_KEY: "phc_WhWJfNPOHAuWVdyTacGxrPa9JW54scnofA9KVEjFcFw"
        NEXT_PUBLIC_POSTHOG_HOST: "https://us.i.posthog.com"
        NEXT_PUBLIC_DISTRIBUTION: ${DISTRIBUTION}
        NEXT_PUBLIC_BACKEND_DOMAIN: ${NEXT_PUBLIC_BACKEND_DOMAIN}
        NEXT_PUBLIC_MAGIC_LINK_DOMAIN: ${NEXT_PUBLIC_MAGIC_LINK_DOMAIN}
        NEXT_PUBLIC_WEBAPP_DOMAIN: ${NEXT_PUBLIC_WEBAPP_DOMAIN}
        NEXT_PUBLIC_REDIRECT_WEBHOOK_INGRESS: ${REDIRECT_TUNNEL_INGRESS}  
    restart: unless-stopped
    ports:
      - 80:8090
    #depends_on:
      #api:
        #condition: service_healthy
    networks:
      - backend
      - frontend
 
  magic-link-frontend:
    build:
      dockerfile: ./apps/magic-link/Dockerfile
      context: ./
      args:
        VITE_BACKEND_DOMAIN: ${NEXT_PUBLIC_BACKEND_DOMAIN}
        VITE_WEBAPP_DOMAIN: ${NEXT_PUBLIC_WEBAPP_DOMAIN}
    restart: always 
    ports:
      - 81:80
    #depends_on:
      #api:
        #condition: service_healthy
    networks:
      - backend
      - frontend
  
networks:
  frontend:
  backend:

.env

# ================================================
# API Backend
# ================================================
ENV=dev
DISTRIBUTION=selfhost # selfhost or managed
PANORA_BASE_API_URL=http://localhost:3000
JWT_SECRET=secret_jwt
ENCRYPT_CRYPTO_SECRET_KEY="0123456789abcdef0123456789abcdef"
 
# Only used when DISTRIBUTION=managed
SENTRY_DSN=
SENTRY_ENABLED=FALSE
 
POSTHOG_HOST=<ph_instance_address>
POSTHOG_KEY=<ph_instance_key>
PH_TELEMETRY= #FALSE or TRUE
 
# ================================================
# REDIS
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_USER=default
REDIS_PASS=A3vniod98Zbuvn9u5
 
#REDIS_TLS=
 
# ================================================
# Tip: use mailtrap.io for local development
EMAIL_SENDING_ADDRESS=hello@panora.dev
 
SMTP_HOST=
SMTP_PORT=
SMTP_USER=
SMTP_PASSWORD=
# ================================================
# Database
# ================================================
POSTGRES_USER=my_user
POSTGRES_DB=panora_db
POSTGRES_HOST=postgres
POSTGRES_PASSWORD=my_password
 
# Endpoint on which realtime webhooks are sent to 
WEBHOOK_INGRESS=YOUR_ENDPOINT_URL_TO_RECEIVE_PANORA_WEBHOOKS
 
# Mandatory only when DISTRIBUTION=selfhost
# 1. Execute cp ngrok.yml.example ngrok.yml
# 2. Uncomment ngrok service in docker-compose{.dev, .source}.yml
# Endpoint (an Ngrok tunnel domain) when you have to test your OAuth App and needs a redirectUri that redirects to your localhost
# (useful for contributors that might need to test their oAuth flow)
REDIRECT_TUNNEL_INGRESS=NGROK_DOMAIN
 
 
# Each Provider is of form PROVIDER_VERTICAL_SOFTWAREMODE_ATTRIBUTE
# check (https://docs.panora.dev/open-source/contributors)
# OAuth : ATTRIBUTE c [CLIENT_ID, CLIENT_SECRET] & {SUBDOMAIN} (some providers might need a subdomain)
# ================================================
# Credentials of Integration Providers
# ================================================
# CRM
# Hubspot
HUBSPOT_CRM_CLOUD_CLIENT_ID=
HUBSPOT_CRM_CLOUD_CLIENT_SECRET=
# Zoho
ZOHO_CRM_CLOUD_CLIENT_ID= 
ZOHO_CRM_CLOUD_CLIENT_SECRET=
# Pipedrive
PIPEDRIVE_CRM_CLOUD_CLIENT_ID=
PIPEDRIVE_CRM_CLOUD_CLIENT_SECRET=
# Zendesk
ZENDESK_CRM_CLOUD_CLIENT_ID=
ZENDESK_CRM_CLOUD_CLIENT_SECRET=
# Attio
ATTIO_CRM_CLOUD_CLIENT_ID=
ATTIO_CRM_CLOUD_CLIENT_SECRET=
# Close
CLOSE_CRM_CLOUD_CLIENT_ID=
CLOSE_CRM_CLOUD_CLIENT_SECRET=
# Microsft Dynamics Sales
MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_ID=
MICROSOFTDYNAMICSSALES_CRM_CLOUD_CLIENT_SECRET=
 
# ================================================
# Ticketing
# ================================================
# Zendesk
ZENDESK_TICKETING_CLOUD_CLIENT_ID=
ZENDESK_TICKETING_CLOUD_CLIENT_SECRET= 
ZENDESK_TICKETING_CLOUD_SUBDOMAIN=
# Jira
JIRA_TICKETING_CLOUD_CLIENT_ID=
JIRA_TICKETING_CLOUD_CLIENT_SECRET=
# Front
FRONT_TICKETING_CLOUD_CLIENT_ID=
FRONT_TICKETING_CLOUD_CLIENT_SECRET=
# Gitlab
GITLAB_TICKETING_CLOUD_CLIENT_ID=
GITLAB_TICKETING_CLOUD_CLIENT_SECRET=
# Github
GITHUB_TICKETING_CLOUD_CLIENT_ID=
GITHUB_TICKETING_CLOUD_CLIENT_SECRET=
# Linear
LINEAR_TICKETING_CLOUD_CLIENT_ID=
LINEAR_TICKETING_CLOUD_CLIENT_SECRET=
 
# ================================================
# File Storage
# ================================================
# Box
BOX_FILESTORAGE_CLOUD_CLIENT_ID=
BOX_FILESTORAGE_CLOUD_CLIENT_SECRET=
# Onedrive
ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID=
ONEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET=
# dropbox 
DROPBOX_FILESTORAGE_CLOUD_CLIENT_ID=
DROPBOX_FILESTORAGE_CLOUD_CLIENT_SECRET=
 
# Google Drive
GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_ID=
GOOGLEDRIVE_FILESTORAGE_CLOUD_CLIENT_SECRET=
 
# Google Drive
SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_ID=
SHAREPOINT_FILESTORAGE_CLOUD_CLIENT_SECRET=
 
# Google Drive
DROPBOX_FILESTORAGE_CLOUD_CLIENT_ID=
DROPBOX_FILESTORAGE_CLOUD_CLIENT_SECRET=
 
# ================================================
# HRIS
# ================================================
# Deel
DEEL_HRIS_CLOUD_CLIENT_ID=
DEEL_HRIS_CLOUD_CLIENT_SECRET=
# Sage
SAGE_HRIS_CLOUD_CLIENT_ID=
SAGE_HRIS_CLOUD_CLIENT_SECRET=
# Gusto
GUSTO_HRIS_CLOUD_CLIENT_ID=
GUSTO_HRIS_CLOUD_CLIENT_SECRET=
 
 
# ================================================
# ECOMMERCE
# ================================================
# Shopify
SHOPIFY_ECOMMERCE_CLOUD_CLIENT_ID=
SHOPIFY_ECOMMERCE_CLOUD_CLIENT_SECRET=
# Webflow
WEBFLOW_ECOMMERCE_CLOUD_CLIENT_ID=
WEBFLOW_ECOMMERCE_CLOUD_CLIENT_SECRET=
# Amazon
AMAZON_ECOMMERCE_CLOUD_CLIENT_ID=
AMAZON_ECOMMERCE_CLOUD_CLIENT_SECRET=
# Woo Commerce
WOOCOMMERCE_ECOMMERCE_CLOUD_CLIENT_ID=
WOOCOMMERCE_ECOMMERCE_CLOUD_CLIENT_SECRET=
# Squarespace
SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_ID=
SQUARESPACE_ECOMMERCE_CLOUD_CLIENT_SECRET=
 
 
 
# ================================================
# Webapp settings
# Must be set in the perspective of the end user browser
 
NEXT_PUBLIC_BACKEND_DOMAIN=http://localhost:3000
NEXT_PUBLIC_MAGIC_LINK_DOMAIN=http://localhost:81
NEXT_PUBLIC_WEBAPP_DOMAIN=http://localhost
NEXT_PUBLIC_DISTRIBUTION=selfhost # selfhost or managed
 
 
 
# VEC DBs
## pinecone
PINECONE_API_KEY=
PINECONE_INDEX_NAME=
## qdrant
QDRANT_BASE_URL=
QDRANT_API_KEY=
QDRANT_COLLECTION_NAME=
## chroma
CHROMADB_URL=
CHROMADB_COLLECTION_NAME=
## weaviate
WEAVIATE_URL=
WEAVIATE_API_KEY=
WEAVIATE_CLASS_NAME=
# turbopuffer
TURBOPUFFER_API_KEY=
# milvus
MILVUS_ADDRESS=
MILVUS_COLLECTION_NAME=
 
# EMBEDDINGS 
JINA_API_KEY=
COHERE_API_KEY=
OPENAI_API_KEY=
 
# ================================================
# Minio (s3 file storage for documents) 
# ================================================
MINIO_ROOT_USER=myaccesskey13
MINIO_ROOT_PASSWORD=mysecretkey12
 
UNSTRUCTURED_API_KEY=
UNSTRUCTURED_API_URL=

Resources

Website: https://panora.dev/

GitHub: https://github.com/panoratech/Panora

Configuration: https://github.com/panoratech/Panora#%EF%B8%8F-try