From 444865113a6ead7865d0ff6a01099e29292d505e Mon Sep 17 00:00:00 2001 From: "l1.media" <31551045+traumschule@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:40:22 +0100 Subject: [PATCH 1/5] Set `CRT_MARKET_CAP_MIN_VOLUME_JOY` in `docs/operator-guide/examples/.env` (fixes #368) --- docs/operator-guide/examples/.env | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/operator-guide/examples/.env b/docs/operator-guide/examples/.env index a870c84a5..84b2392f6 100644 --- a/docs/operator-guide/examples/.env +++ b/docs/operator-guide/examples/.env @@ -70,6 +70,9 @@ SUPPORT_NEW_CATEGORIES= # switch is changed via the operator API. KILL_SWITCH_ON= +# Specify a volume threshold below which tokens are considered to have no market cap. +CRT_MARKET_CAP_MIN_VOLUME_JOY=100 + # The number of seconds that need to pass before a video view from the # same user is counted again. VIDEO_VIEW_PER_USER_TIME_LIMIT=300 From 5d490ebd35672b7f879986957fa46f209110ab69 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 22 Oct 2025 17:38:30 +0200 Subject: [PATCH 2/5] Update docs/operator-guide/examples/.env --- docs/operator-guide/examples/.env | 215 +++++++++--------------------- 1 file changed, 64 insertions(+), 151 deletions(-) diff --git a/docs/operator-guide/examples/.env b/docs/operator-guide/examples/.env index 84b2392f6..ca7be1ece 100644 --- a/docs/operator-guide/examples/.env +++ b/docs/operator-guide/examples/.env @@ -1,172 +1,85 @@ +# LOCAL DEV ENVIRONMENT +ORION_ENV=development +DEV_DISABLE_SAME_SITE=true + # Db config DB_NAME=squid DB_PASS=squid -DB_PORT=5432 - DB_ADMIN_USER=admin DB_ADMIN_PASS=admin - -# ================================================================================== -# ============================= ARCHIVE CONFIGURATION ============================== -# ================================================================================== -# postgres database port used by the archive -ARCHIVE_DB_PORT=12345 -# Port that is used by the processor to fetch batches of block -GATEWAY_PORT=8000 -# alternatively you can point to your own joystream rpc node if you have one -WS_SOURCE=wss://rpc.joystream.org:9944 -# port exposed by the explorer -EXPLORER_PORT=4444 -# Archive gateway endpoint -ARCHIVE_GATEWAY_URL=http://orion_archive_gateway:${GATEWAY_PORT}/graphql - -# Orion services ports -GRAPHQL_API_PORT=4350 -AUTH_API_PORT=4074 +DB_PORT=23798 +# Processor service host +PROCESSOR_HOST=localhost +# Processor service prometheus port PROCESSOR_PROMETHEUS_PORT=3337 - -# Express.js "trust proxy" setting -# It specifies which IP addresses are considered "trusted" to provide -# correct values in the `X-Forwarded-For` header (to avoid ip spoofing). -# `uniquelocal` means all local network addresses are trusted, ie: -# 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7 -# When using the default docker-compose setup, this is the recommended setting. -# To read more about the `trust proxy` setting, see: -# https://expressjs.com/en/guide/behind-proxies.html -TRUST_PROXY=uniquelocal - -# Enable/disable Auth API playground -OPENAPI_PLAYGROUND=true - -# DEVELOPMENT SETTINGS: -# WARNING: DO NOT USE THESE SETTINGS IN PRODUCTION! -ORION_ENV=development -DEV_DISABLE_SAME_SITE=true - -# PRODUCTION SETTINGS: -# A root domain of your Gateway, that will be used for setting the session cookie -# and CORS headers. For example, if you are serving the GraphQL API and Auth API -# under subdomains like `query.mygateway.com` and `auth.mygateway.com` and the Atlas -# frontend directly under `mygateway.com`, you should set this value to `mygateway.com`. -# ORION_ENV=production -# GATEWAY_ROOT_DOMAIN= - -# ================================================================================== -# ========================= INITIAL GATEWAY CONFIGURATION ========================== -# ================================================================================== - -# The name of Your gateway (pick a unique one!) -APP_NAME= - -# Whether videos with no category assigned should be visible on the gateway -SUPPORT_NO_CATEGORY_VIDEOS= - -# Whether the gateway should support all newly created video categories -# by default. -SUPPORT_NEW_CATEGORIES= - -# Default value of the "kill switch". If set to true, it will force the -# Atlas to start in a "maintenance mode", before the value of the kill -# switch is changed via the operator API. -KILL_SWITCH_ON= - -# Specify a volume threshold below which tokens are considered to have no market cap. +# Graphql server port +GQL_PORT=4350 +# Auth api port +AUTH_API_PORT=4074 +# RabbitMQ +RABBITMQ_PORT=5672 +RABBITMQ_URL=amqp://orion_rabbitmq + +# Archive gateway url +ARCHIVE_GATEWAY_URL=${CUSTOM_ARCHIVE_GATEWAY_URL:-http://localhost:8888/graphql} + +# ====================================================== +# ============== DEFAULT CONFIG VALUES ================= +# ====================================================== +APP_NAME=Gleev +SUPPORT_NO_CATEGORY_VIDEOS=true +SUPPORT_NEW_CATEGORIES=true CRT_MARKET_CAP_MIN_VOLUME_JOY=100 - -# The number of seconds that need to pass before a video view from the -# same user is counted again. -VIDEO_VIEW_PER_USER_TIME_LIMIT=300 - -# A secret string that will be used when authenticating as a Gateway operator. -# It's recommended to generate a random string of at least 16 characters. -# For example: `openssl rand -base64 18` -OPERATOR_SECRET= - -# Weights used for calclating the relevance score of a video. -# The relevance score affects the order in which videos are displayed -# on the homepage of Atlas. -# The first value is the "newness_weight", -# The second value is the "views_weight", -# The third value is the "comments_weight", -# The fourth value is the "reactions_weight". -# The fifth value is a list of two values: -# - joystreamCreationWeight: how much Video.createdAt date affects the `newness` score -# - ytCreationWeight: how much Video.publishedBeforeJoystream affects the `newness` score -# The sixth value is the "channel_weight". -# The relevance score is calculated as follows: -# ``` -# ( -# newness * newness_weight + -# views * views_weight + -# comments * comments_weight + -# reactions * reactions_weight -# ) * channel_weight -# ``` -# Where newness is: -# ``` -# -( -# (days since Video.createdAt * joystreamCreationWeight) + -# (days since Video.publishedBeforeJoystream * ytCreationWeight) -# ) / (joystreamCreationWeight + ytCreationWeight) -# ``` -RELEVANCE_WEIGHTS="[1, 0.03, 0.3, 0.5, [7,3], 1]" - -# After how many new video views, the relevance score of a video should -# be recalculated. +KILL_SWITCH_ON=false +# 10 seconds +VIDEO_VIEW_PER_USER_TIME_LIMIT=10 +# Operator API secret +OPERATOR_SECRET=this-is-not-so-secret-change-it +# every 10 views video relevance score will be recalculated VIDEO_RELEVANCE_VIEWS_TICK=10 - -# Maximum number of entities that can be cached in Orion processor's memory. -# If the Orion processor service is running out of memory, try decreasing -# this value. -MAX_CACHED_ENTITIES=1000 - -# A secret string used to generate a private key for signing the attestation -# that certain channels and videos were created throguh Your gateway. -# It's recommended to generate a random string of at least 16 characters. -# For example: `openssl rand -base64 18` -APP_PRIVATE_KEY= - -# After how many minutes does the session expire in case of user inactivity. -# Once the session expires, the user will need to re-authenticate. +# every time a channel is followed / unfollowed, its weight will be recalculated +CHANNEL_WEIGHT_FOLLOWS_TICK=1 +COMMENT_TIP_TIERS='{"SILVER": 100, "GOLD": 500, "DIAMOND": 1000}' +MAX_CACHED_ENTITIES=5000 +APP_PRIVATE_KEY=this-is-not-so-secret-change-it SESSION_EXPIRY_AFTER_INACTIVITY_MINUTES=60 - -# After how many hours does the session expire regardless of user activity. SESSION_MAX_DURATION_HOURS=720 +EMAIL_CONFIRMATION_ROUTE=http://localhost:4074/api/v1/confirm-email?token={token} +EMAIL_CONFIRMATION_TOKEN_EXPIRY_TIME_HOURS=24 +EMAIL_CONFIRMATION_TOKEN_RATE_LIMIT=5 +ACCOUNT_OWNERSHIP_PROOF_EXPIRY_TIME_SECONDS=300 # 5 minutes +COOKIE_SECRET=this-is-not-so-secret-change-it -# The route in Atlas used for the purpose of user e-mail confirmation. -# CURRENTLY NOT USED -EMAIL_CONFIRMATION_ROUTE=NOT_USED +# Notification related variables +APP_ROOT_DOMAIN=gleev.xyz -# The number of hours after which the e-mail confirmation link expires. -EMAIL_CONFIRMATION_TOKEN_EXPIRY_TIME_HOURS=24 +TRUST_PROXY=uniquelocal -# How many e-mail confirmation links can be sent to a user within -# `EMAIL_CONFIRMATION_TOKEN_EXPIRY_TIME_HOURS` (to prevent spamming) -EMAIL_CONFIRMATION_TOKEN_RATE_LIMIT=5 +# Sendgrid API +SENDGRID_API_KEY= +SENDGRID_FROM_EMAIL=gateway@example.com -# How many seconds have to pass since the timestamp included in a signed message -# that proves the ownership of a Joystream account/address, before the message -# is considered expired. -ACCOUNT_OWNERSHIP_PROOF_EXPIRY_TIME_SECONDS=300 # 5 minutes +# Detectlanguage +DETECTLANGUAGE_API_KEY= -# A secret string used to generate a private key for the purpose of signing cookies, -# to ensure that the cookies sent by the client application (like Atlas) have been -# indeed set by your instance of Orion and have not been tampered with. -# It's recommended to generate a random string of at least 16 characters. -# For example: `openssl rand -base64 18` -COOKIE_SECRET= +# Debug settings +SQD_DEBUG=api:* + +# playground +OPENAPI_PLAYGROUND=true # max number of attempts to deliver email notification EMAIL_NOTIFICATION_DELIVERY_MAX_ATTEMPTS=5 -# Sendgrid API -# Sendgrid configuration of api key and email address used to send transactional mails from -SENDGRID_API_KEY= -SENDGRID_FROM_EMAIL= - # Notification emails storage links -# Online path which contains the icons and logo to display in the notification e-mails -APP_ASSET_STORAGE= +APP_ASSET_STORAGE=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/logos/gleev +APP_NAME_ALT=Gleev.xyz +NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/icons + +# ===================================================================================== +# Telemetry +# ===================================================================================== -# Name of the application link displayed in the notification e-mail footer -APP_NAME_ALT= +# yes/no +TELEMETRY_ENABLED=no +TELEMETRY_ENDPOINT=http://apm-server:8200 From 20f50a636b6eb9c0ffabe6b6568fa6f5be92fbf8 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 22 Oct 2025 17:40:57 +0200 Subject: [PATCH 3/5] Update docs/operator-guide/examples/docker-compose.yml --- .../examples/docker-compose.yml | 227 ++++++++---------- 1 file changed, 99 insertions(+), 128 deletions(-) diff --git a/docs/operator-guide/examples/docker-compose.yml b/docs/operator-guide/examples/docker-compose.yml index 4963c6bb3..3fc1023a4 100644 --- a/docs/operator-guide/examples/docker-compose.yml +++ b/docs/operator-guide/examples/docker-compose.yml @@ -1,161 +1,132 @@ -version: '3.4' services: - # PostgerSQL database for Orion - orion-db: + orion_db: + container_name: orion_db + hostname: orion_db image: postgres:14 - container_name: orion-db restart: unless-stopped - env_file: - - .env environment: - POSTGRES_PASSWORD: ${DB_PASS} - POSTGRES_DB: ${DB_NAME} + POSTGRES_DB: squid + POSTGRES_PASSWORD: squid + logging: + driver: 'local' + options: + max-size: '200m' + max-file: '10' + networks: + - joystream_default ports: - '127.0.0.1:${DB_PORT}:${DB_PORT}' + - '[::1]:${DB_PORT}:${DB_PORT}' command: ['postgres', '-c', 'config_file=/etc/postgresql/postgresql.conf', '-p', '${DB_PORT}'] shm_size: 1g volumes: - - orion-db-data:/var/lib/postgresql/data - - ./postgres.conf:/etc/postgresql/postgresql.conf - # Orion processor - orion-processor: - image: joystream/orion:latest - container_name: orion-processor + - orion_db_data:/var/lib/postgresql/data + - ./db/postgres.conf:/etc/postgresql/postgresql.conf + + orion_processor: + container_name: orion_processor + hostname: orion_processor + image: node:18 restart: unless-stopped - depends_on: - - orion-db + networks: + - joystream_default env_file: - .env + - docker.env environment: - - DB_HOST=orion-db - - GQL_PORT=${GRAPHQL_API_PORT} - volumes: - - ./db/export:/squid/db/export - command: > - sh -c "npx squid-typeorm-migration apply && \ - node lib/processor.js" + - TYPEORM_SUBSCRIBERS_DIR=lib/mappings/subscribers ports: - '127.0.0.1:${PROCESSOR_PROMETHEUS_PORT}:${PROCESSOR_PROMETHEUS_PORT}' - # Orion GraphQL API - orion-graphql-api: - container_name: orion-graphql-api - image: joystream/orion:latest - restart: unless-stopped + - '[::1]:${PROCESSOR_PROMETHEUS_PORT}:${PROCESSOR_PROMETHEUS_PORT}' depends_on: - - orion-db - env_file: - - .env - environment: - - DB_HOST=orion-db - - GQL_PORT=${GRAPHQL_API_PORT} - command: ['npm', 'run', 'graphql-server-start'] - ports: - - '127.0.0.1:${GRAPHQL_API_PORT}:${GRAPHQL_API_PORT}' - # Orion Authentication API - orion-auth-api: - container_name: orion-auth-api - image: joystream/orion:latest + - orion_db + volumes: + - type: bind + source: . + target: /orion + working_dir: /orion + command: ['make', 'process'] + + orion_relevance-service: + container_name: orion_relevance-service + image: node:18 restart: unless-stopped + networks: + - joystream_default depends_on: - - orion-db - env_file: - - .env - environment: - - DB_HOST=orion-db - command: ['npm', 'run', 'auth-server-start'] - ports: - - '127.0.0.1:${AUTH_API_PORT}:${AUTH_API_PORT}' - # Caddy - orion-caddy: - profiles: - - deploy - container_name: orion-caddy - image: caddy:2.6 - restart: unless-stopped + - orion_rabbitmq env_file: - .env - ports: - - '80:80' - - '443:443' - - '443:443/udp' + - docker.env volumes: - - ./Caddyfile:/etc/caddy/Caddyfile - - ./atlas:/srv/atlas - - ./caddy/data:/data - - ./caddy/config:/config + - type: bind + source: . + target: /orion + working_dir: /orion + command: ['make', 'relevance-service'] - archive_db: - container_name: orion_archive_db - hostname: orion_archive_db - image: postgres:14 # CockroachDB cluster might be a better fit for production deployment - restart: unless-stopped - volumes: - - orion_archive_db_data:/var/lib/postgresql/data - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: squid-archive + orion_rabbitmq: + container_name: orion_rabbitmq + hostname: orion_rabbitmq + image: rabbitmq:4.1 + networks: + - joystream_default ports: - - '127.0.0.1:${ARCHIVE_DB_PORT}:${ARCHIVE_DB_PORT}' - - '[::1]:${ARCHIVE_DB_PORT}:${ARCHIVE_DB_PORT}' - command: ['postgres', '-c', 'log_statement=all', '-p', '${ARCHIVE_DB_PORT}'] + - '127.0.0.1:${RABBITMQ_PORT}:${RABBITMQ_PORT}' + - '[::1]:${RABBITMQ_PORT}:${RABBITMQ_PORT}' - ingest: - container_name: orion_archive_ingest - depends_on: - - archive_db + orion_graphql-server: + container_name: orion_graphql-server + hostname: orion_graphql-server + image: node:18 restart: unless-stopped - image: subsquid/substrate-ingest:firesquid - command: [ - '-e', - '${WS_SOURCE}', - '-c', - '20', # allow up to 20 pending requests for the above endpoint (default is 5) - # "--start-block", "1000000", # uncomment to specify a non-zero start block - '--out', - 'postgres://postgres:postgres@orion_archive_db:${ARCHIVE_DB_PORT}/squid-archive', - ] - - gateway: - container_name: orion_archive_gateway - hostname: orion_archive_gateway - depends_on: - - archive_db - restart: unless-stopped - image: subsquid/substrate-gateway:firesquid + networks: + - joystream_default + env_file: + - .env + - docker.env environment: - DATABASE_MAX_CONNECTIONS: 5 - RUST_LOG: 'actix_web=info,actix_server=info' - command: [ - '--database-url', - 'postgres://postgres:postgres@orion_archive_db:${ARCHIVE_DB_PORT}/squid-archive', - # "--evm-support" # uncomment for chains with Frontier EVM pallet - # (e.g. Moonbeam/Moonriver or Astar/Shiden) - ] + - SQD_TRACE=authentication + - OTEL_EXPORTER_OTLP_ENDPOINT=${TELEMETRY_ENDPOINT} + - TYPEORM_SUBSCRIBERS_DIR=lib/server-extension/subscribers + depends_on: + - orion_db + volumes: + - type: bind + source: . + target: /orion + working_dir: /orion + command: ['make', 'serve'] ports: - - '127.0.0.1:${GATEWAY_PORT}:8000' - - '[::1]:${GATEWAY_PORT}:8000' + - '4350:4350' - # Explorer service is optional. - # It provides rich GraphQL API for querying archived data. - # Many developers find it very useful for exploration and debugging. - explorer: - container_name: orion_archive_explorer - hostname: orion_archive_explorer + orion_auth-api: + container_name: orion_auth-api + hostname: orion_auth-api + image: node:18 restart: unless-stopped - image: subsquid/substrate-explorer:firesquid + networks: + - joystream_default + env_file: + - .env + - docker.env environment: - DB_TYPE: postgres # set to `cockroach` for Cockroach DB - DB_HOST: archive_db - DB_PORT: '12345' - DB_NAME: 'squid-archive' - DB_USER: 'postgres' - DB_PASS: 'postgres' + - SQD_TRACE=authentication + - OTEL_EXPORTER_OTLP_ENDPOINT=${TELEMETRY_ENDPOINT} + depends_on: + - orion_db + volumes: + - type: bind + source: . + target: /orion + working_dir: /orion + command: ['make', 'serve-auth-api'] ports: - - '${EXPLORER_PORT}:3000' + - '${AUTH_API_PORT}:${AUTH_API_PORT}' volumes: - orion_archive_db_data: - driver: local - orion-db-data: - driver: local + orion_db_data: + +networks: + joystream_default: + external: true From 8b417a74fe403df9f5c3c0509574fe0c6e14c52f Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 22 Oct 2025 18:17:43 +0200 Subject: [PATCH 4/5] Add missing variables to [examples/].env --- .env | 12 ++++++++++++ docs/operator-guide/examples/.env | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/.env b/.env index ca7be1ece..35c742d38 100644 --- a/.env +++ b/.env @@ -83,3 +83,15 @@ NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notifi # yes/no TELEMETRY_ENABLED=no TELEMETRY_ENDPOINT=http://apm-server:8200 + +# Name of the application link displayed in the notification e-mail footer +APP_NAME_ALT= + +# every time a channel is followed / unfollowed, its weight will be recalculated +CHANNEL_WEIGHT_FOLLOWS_TICK=1 + +# set the minimum amounts of JOY tokens required to obtain each tier +COMMENT_TIP_TIERS='{"SILVER": 100, "GOLD": 500, "DIAMOND": 1000}' + +# set the volume threshold below which tokens are considered to have no market cap +CRT_MARKET_CAP_MIN_VOLUME_JOY=100 diff --git a/docs/operator-guide/examples/.env b/docs/operator-guide/examples/.env index ca7be1ece..35c742d38 100644 --- a/docs/operator-guide/examples/.env +++ b/docs/operator-guide/examples/.env @@ -83,3 +83,15 @@ NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notifi # yes/no TELEMETRY_ENABLED=no TELEMETRY_ENDPOINT=http://apm-server:8200 + +# Name of the application link displayed in the notification e-mail footer +APP_NAME_ALT= + +# every time a channel is followed / unfollowed, its weight will be recalculated +CHANNEL_WEIGHT_FOLLOWS_TICK=1 + +# set the minimum amounts of JOY tokens required to obtain each tier +COMMENT_TIP_TIERS='{"SILVER": 100, "GOLD": 500, "DIAMOND": 1000}' + +# set the volume threshold below which tokens are considered to have no market cap +CRT_MARKET_CAP_MIN_VOLUME_JOY=100 From 36a76efd0e3a2771df2eba7905e804915a8f27f5 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 22 Oct 2025 18:26:38 +0200 Subject: [PATCH 5/5] APP NAME order --- .env | 7 ++++--- docs/operator-guide/examples/.env | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.env b/.env index 35c742d38..d3296ab6d 100644 --- a/.env +++ b/.env @@ -73,7 +73,11 @@ EMAIL_NOTIFICATION_DELIVERY_MAX_ATTEMPTS=5 # Notification emails storage links APP_ASSET_STORAGE=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/logos/gleev + +# Name of the application link displayed in the notification e-mail footer APP_NAME_ALT=Gleev.xyz + +# Set URL where the notification icons are stored. NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/icons # ===================================================================================== @@ -84,9 +88,6 @@ NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notifi TELEMETRY_ENABLED=no TELEMETRY_ENDPOINT=http://apm-server:8200 -# Name of the application link displayed in the notification e-mail footer -APP_NAME_ALT= - # every time a channel is followed / unfollowed, its weight will be recalculated CHANNEL_WEIGHT_FOLLOWS_TICK=1 diff --git a/docs/operator-guide/examples/.env b/docs/operator-guide/examples/.env index 35c742d38..e72e21dfa 100644 --- a/docs/operator-guide/examples/.env +++ b/docs/operator-guide/examples/.env @@ -51,7 +51,7 @@ ACCOUNT_OWNERSHIP_PROOF_EXPIRY_TIME_SECONDS=300 # 5 minutes COOKIE_SECRET=this-is-not-so-secret-change-it # Notification related variables -APP_ROOT_DOMAIN=gleev.xyz +APP_ROOT_DOMAIN= TRUST_PROXY=uniquelocal @@ -73,7 +73,11 @@ EMAIL_NOTIFICATION_DELIVERY_MAX_ATTEMPTS=5 # Notification emails storage links APP_ASSET_STORAGE=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/logos/gleev -APP_NAME_ALT=Gleev.xyz + +# Name of the application link displayed in the notification e-mail footer +APP_NAME_ALT= + +# Set URL where the notification icons are stored. NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notification-assets/main/icons # ===================================================================================== @@ -84,9 +88,6 @@ NOTIFICATION_ASSET_ROOT=https://raw.githubusercontent.com/Joystream/atlas-notifi TELEMETRY_ENABLED=no TELEMETRY_ENDPOINT=http://apm-server:8200 -# Name of the application link displayed in the notification e-mail footer -APP_NAME_ALT= - # every time a channel is followed / unfollowed, its weight will be recalculated CHANNEL_WEIGHT_FOLLOWS_TICK=1