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