diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 0000000..1724e69 --- /dev/null +++ b/.cursorignore @@ -0,0 +1,2 @@ +# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv) +!.env.example diff --git a/.env.example b/.env.example index 4db0cfe..e91f378 100644 --- a/.env.example +++ b/.env.example @@ -67,6 +67,16 @@ DASHBOARD_PASSWORD= POOLER_TENANT_ID=1000 +############ +# [required] +# Neo4j username and password +# Replace "neo4j" with your chosen username and "password" with your chosen password. +# Keep the "/" as a separator between the two. +############ + +NEO4J_AUTH_USERNAME= +NEO4J_AUTH_PASSWORD= + ############ # [required] # Langfuse credentials @@ -104,6 +114,7 @@ FLOWISE_HOSTNAME=flowise.yourdomain.com SUPABASE_HOSTNAME=supabase.yourdomain.com LANGFUSE_HOSTNAME=langfuse.yourdomain.com SEARXNG_HOSTNAME=searxng.yourdomain.com +NEO4J_HOSTNAME=neo4j.yourdomain.com GRAFANA_HOSTNAME=grafana.yourdomain.com PROMETHEUS_HOSTNAME=prometheus.yourdomain.com LETTA_HOSTNAME=letta.yourdomain.com @@ -184,7 +195,7 @@ MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify" ## Email auth ENABLE_EMAIL_SIGNUP=true -ENABLE_EMAIL_AUTOCONFIRM=false +ENABLE_EMAIL_AUTOCONFIRM=true SMTP_ADMIN_EMAIL=admin@example.com SMTP_HOST=supabase-mail SMTP_PORT=2500 diff --git a/.gitignore b/.gitignore index df1df15..6593127 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,10 @@ .env .env.bak .env.test -volumes/ +neo4j/ +searxng/settings.yml +searxng/uwsgi* +shared-backup/ shared/ supabase/ -searxng/uwsgi.ini -searxng/settings.yml \ No newline at end of file +volumes/ \ No newline at end of file diff --git a/Caddyfile b/Caddyfile index dc8b221..e7fa8d0 100644 --- a/Caddyfile +++ b/Caddyfile @@ -56,6 +56,11 @@ reverse_proxy prometheus:9090 } +# Neo4j +{$NEO4J_HOSTNAME} { + reverse_proxy neo4j:7474 +} + # SearXNG {$SEARXNG_HOSTNAME} { basic_auth { diff --git a/README.md b/README.md index e6d478d..a9d16ea 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ The installer also makes the following powerful open-source tools **available fo ✅ [**Weaviate**](https://weaviate.io/) - An open-source AI-native vector database with a focus on scalability and ease of use. It can be used for RAG, hybrid search, and more. +✅ [**Neo4j**](https://neo4j.com/) - A graph database management system that allows you to model, store, and query data as a network of nodes and relationships. It's particularly well-suited for complex, interconnected data often found in AI applications, such as knowledge graphs. + ✅ [**Ollama**](https://ollama.com/) - Run Llama 3, Mistral, Gemma, and other large language models locally. ✅ [**Prometheus**](https://prometheus.io/) - An open-source monitoring and alerting toolkit to keep an eye on system health. @@ -117,6 +119,7 @@ The services will be available at the following addresses (replace `yourdomain.c - **Langfuse:** `langfuse.yourdomain.com` - **Letta:** `letta.yourdomain.com` - **Weaviate:** `weaviate.yourdomain.com` +- **Neo4j:** `neo4j.yourdomain.com` - **Grafana:** `grafana.yourdomain.com` - **SearXNG:** `searxng.yourdomain.com` - **Prometheus:** `prometheus.yourdomain.com` diff --git a/docker-compose.yml b/docker-compose.yml index dcd0b4c..abf0c30 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -147,6 +147,19 @@ services: expose: - "6333" + neo4j: + image: neo4j:latest + container_name: neo4j + profiles: ["neo4j"] + restart: unless-stopped + volumes: + - ./neo4j/logs:/logs + - ./neo4j/config:/config + - ./neo4j/data:/data + - ./neo4j/plugins:/plugins + environment: + - NEO4J_AUTH=${NEO4J_AUTH_USERNAME}/${NEO4J_AUTH_PASSWORD} + caddy: container_name: caddy image: docker.io/library/caddy:2-alpine @@ -165,6 +178,7 @@ services: - SUPABASE_HOSTNAME=${SUPABASE_HOSTNAME} - SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME} - LANGFUSE_HOSTNAME=${LANGFUSE_HOSTNAME} + - NEO4J_HOSTNAME=${NEO4J_HOSTNAME} - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-internal} - PROMETHEUS_HOSTNAME=${PROMETHEUS_HOSTNAME} - GRAFANA_HOSTNAME=${GRAFANA_HOSTNAME} diff --git a/scripts/03_generate_secrets.sh b/scripts/03_generate_secrets.sh index 4187f72..cbe1ef3 100755 --- a/scripts/03_generate_secrets.sh +++ b/scripts/03_generate_secrets.sh @@ -47,6 +47,7 @@ declare -A VARS_TO_GENERATE=( ["LANGFUSE_INIT_PROJECT_SECRET_KEY"]="langfuse_sk:32" ["WEAVIATE_PASSWORD"]="password:32" # Password for Caddy basic auth ["WEAVIATE_API_KEY"]="secret:48" # API Key for Weaviate service (36 bytes -> 48 chars base64) + ["NEO4J_AUTH_PASSWORD"]="password:32" # Added Neo4j password ) # Check if .env file already exists @@ -332,6 +333,7 @@ generated_values["LANGFUSE_INIT_USER_EMAIL"]="$USER_EMAIL" generated_values["N8N_WORKER_COUNT"]="$N8N_WORKER_COUNT" generated_values["N8N_WORKFLOWS_IMPORTED_EVER"]="$N8N_WORKFLOWS_IMPORTED_EVER_VALUE" generated_values["WEAVIATE_USERNAME"]="$USER_EMAIL" # Set Weaviate username for Caddy +generated_values["NEO4J_AUTH_USERNAME"]="$USER_EMAIL" # Set Neo4j username if [[ -n "$OPENAI_API_KEY" ]]; then generated_values["OPENAI_API_KEY"]="$OPENAI_API_KEY" fi @@ -354,6 +356,7 @@ found_vars["LANGFUSE_INIT_USER_EMAIL"]=0 found_vars["N8N_WORKER_COUNT"]=0 found_vars["N8N_WORKFLOWS_IMPORTED_EVER"]=0 found_vars["WEAVIATE_USERNAME"]=0 +found_vars["NEO4J_AUTH_USERNAME"]=0 # Read template, substitute domain, generate initial values while IFS= read -r line || [[ -n "$line" ]]; do @@ -399,7 +402,7 @@ while IFS= read -r line || [[ -n "$line" ]]; do # This 'else' block is for lines from template not covered by existing values or VARS_TO_GENERATE. # Check if it is one of the user input vars - these are handled by found_vars later if not in template. is_user_input_var=0 # Reset for each line - user_input_vars=("FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "OPENAI_API_KEY" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "N8N_WORKFLOWS_IMPORTED_EVER" "WEAVIATE_USERNAME") + user_input_vars=("FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "OPENAI_API_KEY" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "N8N_WORKFLOWS_IMPORTED_EVER" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME") for uivar in "${user_input_vars[@]}"; do if [[ "$varName" == "$uivar" ]]; then is_user_input_var=1 @@ -487,7 +490,7 @@ else fi # Add any custom variables that weren't found in the template -for var in "FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "OPENAI_API_KEY" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "N8N_WORKFLOWS_IMPORTED_EVER" "WEAVIATE_USERNAME"; do +for var in "FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "OPENAI_API_KEY" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "N8N_WORKFLOWS_IMPORTED_EVER" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME"; do if [[ ${found_vars["$var"]} -eq 0 && -v generated_values["$var"] ]]; then # Before appending, check if it's already in TMP_ENV_FILE to avoid duplicates if ! grep -q -E "^${var}=" "$TMP_ENV_FILE"; then