add appflowy (#6492)

This commit is contained in:
Andras Bacsai 2025-12-17 15:48:07 +01:00 committed by GitHub
commit cf9077df2a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 371 additions and 0 deletions

12
public/svgs/appflowy.svg Normal file
View file

@ -0,0 +1,12 @@
<svg width="352" height="351" viewBox="0 0 352 351" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M351.694 211.848C341.593 266.47 297.512 314.204 246.499 341.01C240.117 344.355 237.564 346.269 230.367 346.732H333.912C336.243 346.805 338.566 346.41 340.741 345.57C342.917 344.73 344.902 343.462 346.579 341.84C348.255 340.219 349.589 338.278 350.502 336.132C351.415 333.985 351.888 331.678 351.892 329.346V211.848H351.694Z" fill="#F7931E" />
<path d="M238.823 343.613C236.728 343.767 234.625 343.767 232.529 343.613H238.823Z" fill="#FFCE00" />
<path d="M135.699 106.437C134.136 107.713 132.574 108.902 130.967 110.024C104.756 128.466 24.7373 188.283 6.62514 162.534C-11.1349 137.269 7.57146 65.591 53.6331 31.1053C54.5134 30.401 55.3937 29.7848 56.296 29.1466C106.319 -5.99935 143.732 -1.1357 161.822 24.6351C178.812 48.7993 159.797 86.6741 135.699 106.437Z" fill="#8427E0" />
<path d="M331.277 161.796C306.519 179.182 267.455 158.891 248.111 134.023C247.319 133.011 246.57 131.976 245.91 130.964C227.49 104.731 167.674 24.7118 193.422 6.62164C219.171 -11.4685 293.094 8.29421 326.81 56.2925C327.558 57.3489 328.284 58.4933 329.01 59.4396C361.691 108.01 356.542 144.08 331.277 161.796Z" fill="#00B5FF" />
<path d="M298.158 319.655C297.278 320.337 296.42 320.975 295.561 321.569C245.538 356.781 208.126 351.83 190.036 326.103C173.068 301.895 192.038 264.086 216.136 244.301C217.677 243.003 219.284 241.792 220.89 240.67C247.101 222.25 327.12 162.455 345.21 188.182C362.97 213.447 344.264 285.169 298.158 319.655Z" fill="#FFBD00" />
<path d="M158.493 344.09C132.745 362.158 58.8216 342.418 25.1062 294.419C24.402 293.451 23.7638 292.483 23.1036 291.514C-9.79756 242.922 -4.6038 206.653 20.6167 188.915C45.3531 171.529 84.4383 191.798 103.761 216.689C104.553 217.701 105.301 218.714 105.962 219.748C124.47 245.981 184.264 326 158.493 344.09Z" fill="#E3006D" />
<path d="M135.695 106.437C99.9326 122.15 24.0948 154.853 12.695 128.642C3.14372 106.635 20.8377 61.5636 53.6509 31.1053C54.5312 30.401 55.4115 29.7848 56.3138 29.1466C106.315 -5.99935 143.727 -1.1357 161.818 24.6351C178.807 48.7993 159.793 86.6742 135.695 106.437Z" fill="#9327FF" />
<path d="M331.29 161.778C306.531 179.164 267.468 158.873 248.124 134.004C232.036 97.3179 201.402 24.7152 227.04 13.6014C250.148 3.58802 298.543 23.5048 328.935 59.421C361.704 107.992 356.554 144.062 331.29 161.778Z" fill="#00C8FF" />
<path d="M298.158 319.642C297.278 320.324 296.42 320.963 295.561 321.557C245.538 356.769 208.126 351.817 190.036 326.09C173.068 301.882 192.038 264.073 216.136 244.289C251.877 228.553 327.758 195.872 339.158 222.061C348.709 244.09 331.015 289.162 298.158 319.642Z" fill="#FFCE00" />
<path d="M124.838 337.114C101.818 347.105 53.556 327.276 23.1417 291.514C-9.80345 242.922 -4.60969 206.653 20.6108 188.915C45.3472 171.53 84.4324 191.798 103.755 216.689C119.864 253.397 150.477 325.978 124.838 337.114Z" fill="#FB006D" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,359 @@
# documentation: https://docs.appflowy.io/docs/documentation/appflowy-cloud
# slogan: AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data.
# tags: appflowy,notion,open-source,productivity,notes,ai,self-hosted
# logo: svgs/appflowy.svg
# category: productivity
# port: 80
services:
nginx:
image: nginx:1.29.2
environment:
- SERVICE_URL_ADMIN
volumes:
- type: bind
source: ./nginx/nginx.conf
target: /etc/nginx/nginx.conf
read_only: true
content: |
# Please do not directly edit this file.
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
resolver 127.0.0.11 valid=10s;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
client_max_body_size 10M;
underscores_in_headers on;
# Backend services
set $appflowy_cloud_backend "http://appflowy_cloud:8000";
set $gotrue_backend "http://gotrue:9999";
set $admin_frontend_backend "http://admin_frontend:3000";
# GoTrue Authentication Service
location /gotrue/ {
proxy_pass $gotrue_backend;
rewrite ^/gotrue(/.*)$ $1 break;
# Allow headers like redirect_to to be handed over to the gotrue
# for correct redirecting
proxy_set_header Host $http_host;
proxy_pass_request_headers on;
}
# WebSocket endpoint - handle both /ws and /ws/v2
location /ws {
proxy_pass $appflowy_cloud_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400s;
}
# API endpoints
location /api {
proxy_pass $appflowy_cloud_backend;
proxy_set_header X-Request-Id $request_id;
proxy_set_header Host $http_host;
# Special handling for publish endpoint
location ~* ^/api/workspace/([a-zA-Z0-9_-]+)/publish$ {
proxy_pass $appflowy_cloud_backend;
proxy_request_buffering off;
client_max_body_size 256M;
}
# Chat endpoint (streaming)
location /api/chat {
proxy_pass $appflowy_cloud_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding on;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 600s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
}
# Import endpoint
location /api/import {
proxy_pass $appflowy_cloud_backend;
proxy_set_header X-Request-Id $request_id;
proxy_set_header Host $http_host;
proxy_read_timeout 600s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_request_buffering off;
proxy_buffering off;
proxy_cache off;
client_max_body_size 2G;
}
}
# Admin Frontend
# Optional Module, comment this section if you did not deploy admin_frontend in docker-compose.yml
location /console {
proxy_pass $admin_frontend_backend;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 60s;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
}
# Redirect root path to /console
location = / {
return 301 /console;
}
# Health check endpoint
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
}
depends_on:
- appflowy_cloud
- gotrue
- admin_frontend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
appflowy_web:
environment:
- SERVICE_URL_APPFLOWYWEB
- APPFLOWY_BASE_URL=${SERVICE_URL_ADMIN}
- APPFLOWY_GOTRUE_BASE_URL=${SERVICE_URL_ADMIN}/gotrue
- APPFLOWY_WS_BASE_URL=${SERVICE_URL_ADMIN}/ws/v2
image: appflowyinc/appflowy_web:0.9.132
depends_on:
- appflowy_cloud
appflowy_cloud:
image: appflowyinc/appflowy_cloud:0.9.149
environment:
- RUST_LOG=${RUST_LOG:-info}
- APPFLOWY_BASE_URL=${SERVICE_URL_ADMIN}
- APPFLOWY_ENVIRONMENT=production
- APPFLOWY_DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-appflowy}
- APPFLOWY_REDIS_URI=redis://redis:6379
- APPFLOWY_GOTRUE_JWT_SECRET=${SERVICE_PASSWORD_JWT}
- APPFLOWY_GOTRUE_BASE_URL=http://gotrue:9999
- APPFLOWY_S3_CREATE_BUCKET=${APPFLOWY_S3_CREATE_BUCKET:-true}
- APPFLOWY_S3_USE_MINIO=true
- APPFLOWY_S3_MINIO_URL=http://minio:9000
- APPFLOWY_S3_ACCESS_KEY=${SERVICE_USER_MINIO}
- APPFLOWY_S3_SECRET_KEY=${SERVICE_PASSWORD_MINIO}
- APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET:-appflowy}
- APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION:-us-east-1}
- APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST:-smtp.gmail.com}
- APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT:-587}
- APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME:-notify@appflowy.io}
- APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL:-notify@appflowy.io}
- APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD:-email_sender_password}
- APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND:-none}
- APPFLOWY_ACCESS_CONTROL=true
- APPFLOWY_DATABASE_MAX_CONNECTIONS=40
- AI_SERVER_HOST=ai
- AI_SERVER_PORT=5001
- AI_OPENAI_API_KEY=${AI_OPENAI_API_KEY:-}
- APPFLOWY_WEB_URL=${SERVICE_URL_APPFLOWYWEB}
healthcheck:
test: "curl --fail http://127.0.0.1:8000/api/health || exit 1"
interval: 5s
timeout: 5s
retries: 12
depends_on:
gotrue:
condition: service_healthy
postgres:
condition: service_healthy
redis:
condition: service_started
gotrue:
image: appflowyinc/gotrue:0.9.149
environment:
- GOTRUE_API_HOST=0.0.0.0
- GOTRUE_API_PORT=9999
- PORT=9999
- GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL:-admin@example.com}
- GOTRUE_ADMIN_PASSWORD=${SERVICE_PASSWORD_ADMIN}
- GOTRUE_DISABLE_SIGNUP=false
- GOTRUE_SITE_URL=appflowy-flutter://
- GOTRUE_URI_ALLOW_LIST=**
- GOTRUE_JWT_SECRET=${SERVICE_PASSWORD_JWT}
- GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP:-7200}
- GOTRUE_DB_DRIVER=postgres
- API_EXTERNAL_URL=${SERVICE_URL_ADMIN}/gotrue
- DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-appflowy}?search_path=auth
- GOTRUE_SMTP_HOST=${GOTRUE_SMTP_HOST}
- GOTRUE_SMTP_PORT=${GOTRUE_SMTP_PORT:-587}
- GOTRUE_SMTP_USER=${GOTRUE_SMTP_USER}
- GOTRUE_SMTP_PASS=${GOTRUE_SMTP_PASS}
- GOTRUE_MAILER_URLPATHS_CONFIRMATION=/verify
- GOTRUE_MAILER_URLPATHS_INVITE=/verify
- GOTRUE_MAILER_URLPATHS_RECOVERY=/verify
- GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=/verify
- GOTRUE_SMTP_ADMIN_EMAIL=${GOTRUE_SMTP_ADMIN_EMAIL}
- GOTRUE_SMTP_MAX_FREQUENCY=1ns
- GOTRUE_RATE_LIMIT_EMAIL_SENT=100
- GOTRUE_MAILER_AUTOCONFIRM=true
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: "curl --fail http://127.0.0.1:9999/health || exit 1"
interval: 5s
timeout: 5s
retries: 12
admin_frontend:
image: appflowyinc/admin_frontend:0.9.149
environment:
- APPFLOWY_GOTRUE_BASE_URL=${SERVICE_URL_ADMIN}/gotrue
- APPFLOWY_BASE_URL=${SERVICE_URL_ADMIN}
depends_on:
gotrue:
condition: service_healthy
appflowy_cloud:
condition: service_started
ai:
image: appflowyinc/appflowy_ai:0.9.149
environment:
- OPENAI_API_KEY=${AI_OPENAI_API_KEY:-}
- AI_SERVER_PORT=5001
- DEFAULT_AI_MODEL=gpt-4.1-mini # Make sure the model is available in your OpenAI account
- DEFAULT_AI_COMPLETION_MODEL=gpt-4.1-mini # Make sure the model is available in your OpenAI account
- AI_APPFLOWY_HOST=${SERVICE_URL_APPFLOWYWEB}
- APPFLOWY_GOTRUE_JWT_SECRET=${SERVICE_PASSWORD_JWT}
- AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}
- AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT}
- AZURE_OPENAI_API_VERSION=${AZURE_OPENAI_API_VERSION}
- APPFLOWY_S3_ACCESS_KEY=${SERVICE_USER_MINIO}
- APPFLOWY_S3_SECRET_KEY=${SERVICE_PASSWORD_MINIO}
- APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET:-appflowy}
- APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION:-us-east-1}
- AI_DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-appflowy}
- AI_REDIS_URL=redis://redis:6379
- AI_USE_MINIO=true
- AI_MINIO_URL=http://minio:9000
depends_on:
postgres:
condition: service_healthy
appflowy_worker:
image: appflowyinc/appflowy_worker:0.9.149
environment:
- RUST_LOG=info
- APPFLOWY_ENVIRONMENT=production
- APPFLOWY_WORKER_ENVIRONMENT=production
- APPFLOWY_WORKER_REDIS_URL=redis://redis:6379
- APPFLOWY_WORKER_DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-appflowy}
- APPFLOWY_WORKER_DATABASE_NAME=${POSTGRES_DB:-appflowy}
- APPFLOWY_WORKER_IMPORT_TICK_INTERVAL=30
- APPFLOWY_S3_USE_MINIO=true
- APPFLOWY_S3_MINIO_URL=http://minio:9000
- APPFLOWY_S3_ACCESS_KEY=${SERVICE_USER_MINIO}
- APPFLOWY_S3_SECRET_KEY=${SERVICE_PASSWORD_MINIO}
- APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET:-appflowy}
- APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION:-us-east-1}
- APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST:-smtp.gmail.com}
- APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT:-587}
- APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME:-notify@appflowy.io}
- APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL:-notify@appflowy.io}
- APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD:-email_sender_password}
- APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND:-none}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
environment:
- MINIO_ROOT_USER=${SERVICE_USER_MINIO}
- MINIO_ROOT_PASSWORD=${SERVICE_PASSWORD_MINIO}
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
volumes:
# Coolify will manage this named volume for persistent object storage.
- minio_data:/data
postgres:
image: pgvector/pgvector:pg16
environment:
- POSTGRES_USER=${SERVICE_USER_POSTGRES}
- POSTGRES_DB=${POSTGRES_DB:-appflowy}
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
- POSTGRES_HOST=postgres
volumes:
# Coolify will manage this named volume for persistent database storage.
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready", "-U", "${SERVICE_USER_POSTGRES}", "-d", "${POSTGRES_DB:-appflowy}" ]
interval: 5s
timeout: 5s
retries: 12
redis:
image: redis:8.2.2-alpine3.22
volumes:
- "redis_data:/data"
healthcheck:
test:
- CMD-SHELL
- "redis-cli -h localhost -p 6379 ping"
interval: 5s
timeout: 5s
retries: 3