diff --git a/.gitignore b/.gitignore
index 361c034b..d88d1f18 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
.venv
/.env
/neodb.env
-/compose.override.yml
/typings
# Byte-compiled / optimized / DLL files
diff --git a/common/templates/_footer.html b/common/templates/_footer.html
index bef464a1..fc043465 100644
--- a/common/templates/_footer.html
+++ b/common/templates/_footer.html
@@ -48,3 +48,25 @@
}, 0);
});
+
+
diff --git a/compose.override.yml b/compose.override.yml
new file mode 100644
index 00000000..4b2f954f
--- /dev/null
+++ b/compose.override.yml
@@ -0,0 +1,321 @@
+# NEODB Docker Compose File
+#
+# Note: may not be secure for production usage, use at your own risk
+#
+# The following env variable are expected from .env or command line
+# - NEODB_SECRET_KEY
+# - NEODB_SITE_DOMAIN
+# - NEODB_SITE_NAME
+# - NEODB_DATA
+
+x-shared:
+ neodb-service: &neodb-service
+ build: .
+ image: ${NEODB_IMAGE:-neodb/neodb:latest}
+ environment:
+ NEODB_DEBUG:
+ NEODB_SECRET_KEY:
+ NEODB_SITE_NAME:
+ NEODB_SITE_DOMAIN:
+ NEODB_SITE_INTRO:
+ NEODB_SITE_HEAD:
+ NEODB_SITE_LOGO:
+ NEODB_SITE_ICON:
+ NEODB_USER_ICON:
+ NEODB_SITE_COLOR:
+ NEODB_SITE_LINKS:
+ NEODB_SITE_DESCRIPTION:
+ NEODB_ALTERNATIVE_DOMAINS:
+ NEODB_PREFERRED_LANGUAGES:
+ NEODB_INVITE_ONLY:
+ NEODB_LOGIN_MASTODON_WHITELIST:
+ NEODB_MASTODON_CLIENT_SCOPE:
+ NEODB_DISABLE_DEFAULT_RELAY:
+ NEODB_DISABLE_CRON_JOBS:
+ NEODB_SEARCH_PEERS:
+ NEODB_SEARCH_SITES:
+ NEODB_MIN_MARKS_FOR_DISCOVER:
+ NEODB_DISCOVER_UPDATE_INTERVAL:
+ NEODB_DISCOVER_FILTER_LANGUAGE:
+ NEODB_DISCOVER_SHOW_LOCAL_ONLY:
+ NEODB_DISCOVER_SHOW_POPULAR_POSTS:
+ NEODB_SENTRY_DSN:
+ TAKAHE_SENTRY_DSN:
+ NEODB_SENTRY_SAMPLE_RATE:
+ NEODB_DB_URL: ${NEODB_DB_URL:-postgres://neodb:aubergine@neodb-db/neodb}
+ TAKAHE_DB_URL: ${TAKAHE_DB_URL:-postgres://takahe:aubergine@takahe-db/takahe}
+ NEODB_REDIS_URL: ${NEODB_REDIS_URL:-redis://redis:6379/0}
+ NEODB_SEARCH_URL: ${NEODB_SEARCH_URL:-typesense://user:eggplant@typesense:8108/catalog}
+ NEODB_EMAIL_URL:
+ NEODB_EMAIL_FROM: no-reply@${NEODB_SITE_DOMAIN}
+ NEODB_ENABLE_LOCAL_ONLY:
+ NEODB_ENABLE_LOGIN_BLUESKY:
+ NEODB_ENABLE_LOGIN_THREADS:
+ NEODB_EXTRA_APPS:
+ NEODB_FANOUT_LIMIT_DAYS:
+ TAKAHE_FANOUT_LIMIT_DAYS:
+ NEODB_DOWNLOADER_PROXY_LIST:
+ NEODB_DOWNLOADER_BACKUP_PROXY:
+ NEODB_DOWNLOADER_SAVE_DIR:
+ NEODB_MEDIA_ROOT: /www/m
+ NEODB_VENV: /neodb-venv
+ TAKAHE_ENVIRONMENT: ${ENVIRONMENT:-production}
+ TAKAHE_SECRET_KEY: ${NEODB_SECRET_KEY}
+ TAKAHE_MAIN_DOMAIN: ${NEODB_SITE_DOMAIN}
+ TAKAHE_MEDIA_URL: https://${NEODB_SITE_DOMAIN}/media/
+ TAKAHE_EMAIL_FROM: no-reply@${NEODB_SITE_DOMAIN}
+ TAKAHE_DATABASE_SERVER: ${TAKAHE_DATABASE_SERVER:-postgres://takahe:aubergine@takahe-db/takahe}
+ TAKAHE_CACHES_DEFAULT: ${TAKAHE_CACHES_DEFAULT:-redis://redis:6379/0}
+ TAKAHE_MEDIA_BACKEND: local://www/media/
+ TAKAHE_MEDIA_ROOT: /www/media
+ TAKAHE_USE_PROXY_HEADERS: true
+ TAKAHE_STATOR_CONCURRENCY: ${TAKAHE_STATOR_CONCURRENCY:-4}
+ TAKAHE_STATOR_CONCURRENCY_PER_MODEL: ${TAKAHE_STATOR_CONCURRENCY_PER_MODEL:-2}
+ TAKAHE_VAPID_PUBLIC_KEY:
+ TAKAHE_VAPID_PRIVATE_KEY:
+ TAKAHE_DEBUG: ${NEODB_DEBUG:-False}
+ TAKAHE_VENV: /takahe-venv
+ THREADS_APP_ID:
+ THREADS_APP_SECRET:
+ SPOTIFY_API_KEY:
+ TMDB_API_V3_KEY:
+ GOOGLE_API_KEY:
+ DISCOGS_API_KEY:
+ IGDB_API_CLIENT_ID:
+ IGDB_API_CLIENT_SECRET:
+ DISCORD_WEBHOOKS:
+ SLACK_API_TOKEN:
+ SSL_ONLY:
+ restart: "unless-stopped"
+ volumes:
+ - ${NEODB_DATA:-../data}/neodb-media:/www/m
+ - ${NEODB_DATA:-../data}/takahe-media:/www/media
+ - ${NEODB_DATA:-../data}/takahe-cache:/www/cache
+ - ${NEODB_DATA:-../data}/www-root:/www/root
+ - ./custom/edition.custom.html:/neodb/catalog/templates/edition.html
+ depends_on:
+ - redis
+ - neodb-db
+ - typesense
+ - takahe-db
+ profiles:
+ - production
+
+ dev-neodb-service: &dev-neodb-service
+ <<: *neodb-service
+ # environment:
+ # NEODB_DEBUG: True
+ volumes:
+ - ${NEODB_DATA:-../data}/www-root:/www/root
+ - ${NEODB_DATA:-../data}/neodb-media:/www/m
+ - ${NEODB_DATA:-../data}/takahe-media:/www/media
+ - ${NEODB_DATA:-../data}/takahe-cache:/www/cache
+ - ${NEODB_DATA:-../data}/nginx-log:/var/log/nginx
+ - ${NEODB_SRC:-.}:/neodb
+ - ${TAKAHE_SRC:-./neodb-takahe}:/takahe
+ profiles:
+ - dev
+
+services:
+ redis:
+ image: redis:alpine
+ command: redis-server --save 60 1 --loglevel warning
+ volumes:
+ - ${NEODB_DATA:-../data}/redis:/data
+
+ typesense:
+ image: typesense/typesense:${TYPESENSE_VERSION:-0.25.2}
+ restart: "on-failure"
+ # healthcheck:
+ # test: ['CMD', 'curl', '-vf', 'http://127.0.0.1:8108/health']
+ # ports:
+ # - "18108:8108"
+ environment:
+ GLOG_minloglevel: 2
+ volumes:
+ - ${NEODB_DATA:-../data}/typesense:/data
+ command: "--data-dir /data --api-key=eggplant"
+
+ neodb-db:
+ image: postgres:${POSTGRES_VERSION:-14-alpine}
+ healthcheck:
+ test: ["CMD", "pg_isready", "-U", "neodb"]
+ volumes:
+ - ${NEODB_DATA:-../data}/neodb-db:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_DB=neodb
+ - POSTGRES_USER=neodb
+ - POSTGRES_PASSWORD=aubergine
+
+ takahe-db:
+ image: postgres:${POSTGRES_VERSION:-14-alpine}
+ healthcheck:
+ test: ["CMD", "pg_isready", "-U", "takahe"]
+ volumes:
+ - ${NEODB_DATA:-../data}/takahe-db:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_DB=takahe
+ - POSTGRES_USER=takahe
+ - POSTGRES_PASSWORD=aubergine
+
+ migration:
+ <<: *neodb-service
+ restart: "no"
+ command: /bin/neodb-init
+ depends_on:
+ neodb-db:
+ condition: service_healthy
+ typesense:
+ condition: service_started
+ redis:
+ condition: service_started
+ takahe-db:
+ condition: service_healthy
+
+ neodb-web:
+ <<: *neodb-service
+ command: ${NEODB_VENV:-/neodb-venv}/bin/gunicorn boofilsic.wsgi -w ${NEODB_WEB_WORKER_NUM:-8} --preload --max-requests 2000 --timeout 60 -b 0.0.0.0:8000
+ healthcheck:
+ test:
+ [
+ "CMD",
+ "wget",
+ "-qO/tmp/test",
+ "--header",
+ "X-Forwarded-Proto: https",
+ "http://127.0.0.1:8000/nodeinfo/2.0/",
+ ]
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ neodb-web-api:
+ <<: *neodb-service
+ command: ${NEODB_VENV:-/neodb-venv}/bin/gunicorn boofilsic.wsgi -w ${NEODB_API_WORKER_NUM:-4} --preload --max-requests 2000 --timeout 30 -b 0.0.0.0:8000
+ healthcheck:
+ test:
+ [
+ "CMD",
+ "wget",
+ "-qO/tmp/test",
+ "--header",
+ "X-Forwarded-Proto: https",
+ "http://127.0.0.1:8000/nodeinfo/2.0/",
+ ]
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ neodb-worker:
+ <<: *neodb-service
+ command: neodb-manage rqworker --with-scheduler import export mastodon fetch crawl ap cron
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ neodb-worker-extra:
+ <<: *neodb-service
+ command: neodb-manage rqworker-pool --num-workers ${NEODB_RQ_WORKER_NUM:-4} mastodon fetch crawl ap
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ takahe-web:
+ <<: *neodb-service
+ command: ${TAKAHE_VENV:-/takahe-venv}/bin/gunicorn --chdir /takahe takahe.wsgi -w ${TAKAHE_WEB_WORKER_NUM:-8} --max-requests 2000 --timeout 60 --preload -b 0.0.0.0:8000
+ healthcheck:
+ test:
+ [
+ "CMD",
+ "wget",
+ "-qO/tmp/test",
+ "--header",
+ "X-Forwarded-Proto: https",
+ "http://127.0.0.1:8000/api/v1/instance",
+ ]
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ takahe-stator:
+ <<: *neodb-service
+ command: takahe-manage runstator
+ stop_signal: SIGINT
+ depends_on:
+ migration:
+ condition: service_completed_successfully
+
+ nginx:
+ <<: *neodb-service
+ user: "root:root"
+ command: nginx-start
+ environment:
+ NEODB_WEB_SERVER: neodb-web:8000
+ NEODB_API_SERVER: neodb-web-api:8000
+ TAKAHE_WEB_SERVER: takahe-web:8000
+ NGINX_CONF: /neodb/misc/nginx.conf.d/neodb.conf
+ depends_on:
+ takahe-web:
+ condition: service_started
+ neodb-web:
+ condition: service_started
+ ports:
+ - "${NEODB_PORT:-8000}:8000"
+
+ shell:
+ <<: *neodb-service
+ command: bash
+ profiles: ["tools"]
+
+ root:
+ <<: *neodb-service
+ command: bash
+ profiles: ["tools"]
+ user: "root:root"
+
+ dev-neodb-web:
+ <<: *dev-neodb-service
+ command: neodb-manage runserver 0.0.0.0:8000
+ stop_signal: SIGINT
+
+ dev-neodb-worker:
+ <<: *dev-neodb-service
+ # command: neodb-manage rqworker-pool --num-workers 4 import export mastodon fetch crawl ap cron
+ command: neodb-manage rqworker --with-scheduler import export mastodon fetch crawl crawl ap cron
+
+ dev-takahe-web:
+ <<: *dev-neodb-service
+ command: takahe-manage runserver 0.0.0.0:8000
+ stop_signal: SIGINT
+
+ dev-takahe-stator:
+ <<: *dev-neodb-service
+ command: takahe-manage runstator
+ stop_signal: SIGINT
+
+ dev-nginx:
+ <<: *dev-neodb-service
+ user: "root:root"
+ command: nginx-start
+ environment:
+ NEODB_WEB_SERVER: dev-neodb-web:8000
+ TAKAHE_WEB_SERVER: dev-takahe-web:8000
+ NGINX_CONF: /neodb/misc/nginx.conf.d/neodb-dev.conf
+ depends_on:
+ dev-takahe-web:
+ condition: service_started
+ dev-neodb-web:
+ condition: service_started
+ ports:
+ - "${NEODB_PORT:-8000}:8000"
+
+ dev-shell:
+ <<: *dev-neodb-service
+ command: bash
+ profiles: ["tools"]
+
+ dev-root:
+ <<: *dev-neodb-service
+ command: bash
+ profiles: ["tools"]
+ user: "root:root"
diff --git a/compose.yml b/compose.yml
index 4b2f954f..80096559 100644
--- a/compose.yml
+++ b/compose.yml
@@ -92,7 +92,6 @@ x-shared:
- ${NEODB_DATA:-../data}/takahe-media:/www/media
- ${NEODB_DATA:-../data}/takahe-cache:/www/cache
- ${NEODB_DATA:-../data}/www-root:/www/root
- - ./custom/edition.custom.html:/neodb/catalog/templates/edition.html
depends_on:
- redis
- neodb-db