mirror of
https://github.com/YunoHost-Apps/tracim_ynh.git
synced 2024-10-01 13:34:52 +02:00
1089 lines
42 KiB
Text
1089 lines
42 KiB
Text
######################
|
|
# Tracim Config File #
|
|
######################
|
|
|
|
## Configuration
|
|
# Parameters can be defined via environment variables or in the config file.
|
|
# Environment parameters are used in priority if a variable is defined in both.
|
|
|
|
## File Syntax
|
|
# Comments start by `;` or `#`.
|
|
# In the sample config file:
|
|
# - `;` commented lines are used to indicate the default values used by Tracim;
|
|
# - `#` commented lines are used for comments/examples.
|
|
# Boolean values can be `True` or `False`
|
|
# All parameters starting with `basic_setup` can be used as variables in other parameters.
|
|
# For simple needs they are all you need to customize.
|
|
|
|
## Special Parameter
|
|
# The syntax "%(here)s" is automatically replaced by the directory of the config file.
|
|
# If you do use it, please note that your config file directory may vary depending where you decide
|
|
# to place your config file.
|
|
|
|
## GENERAL TRACIM config:
|
|
# These config are common for all app: REST API, Webdav, etc...
|
|
|
|
[DEFAULT]
|
|
|
|
###############
|
|
# BASIC SETUP #
|
|
###############
|
|
|
|
# easy setup (shortcut) for setting most common config
|
|
# search for "%(param)s" to check where those param are used and why
|
|
|
|
## global info (need for email and links)
|
|
basic_setup.website_title = __WEBSITE_TITLE__
|
|
# public address of tracim known by tracim (pushpin proxy-address)
|
|
basic_setup.website_base_url = https://__DOMAIN__
|
|
# listened host:port of tracim web
|
|
basic_setup.listen = localhost:6543
|
|
## storage path/connection
|
|
basic_setup.sqlalchemy_url = postgresql://__DB_USER__:__DB_PWD__@localhost:5432/__DB_NAME__?client_encoding=utf8
|
|
basic_setup.uploaded_files_storage_type = local
|
|
basic_setup.uploaded_files_storage_path = __DATADIR__/depot
|
|
basic_setup.caldav_storage_dir = __DATADIR__/radicale_storage
|
|
basic_setup.preview_cache_dir = %(here)s/previews
|
|
basic_setup.sessions_data_root_dir = %(here)s
|
|
|
|
## secret
|
|
# This is needed for some feature like reply by email
|
|
basic_setup.api_key = __API_KEY__
|
|
basic_setup.session_secret = __SESSION_SECRET__
|
|
|
|
##################
|
|
# ADVANCED SETUP #
|
|
##################
|
|
|
|
####
|
|
# CORE
|
|
####
|
|
|
|
# hapic debug mode: return python traceback of error
|
|
; debug = False
|
|
|
|
|
|
### Lang ###
|
|
## default lang used in backend if user doesn't provided any lang.
|
|
# Available parameter: en, fr, pt, de
|
|
default_lang = __LANGUAGE__
|
|
|
|
### Apps ###
|
|
|
|
## app enabled explicit list:
|
|
# this allow you to explictly disable default app or enabled beta app now
|
|
# already added to default list.
|
|
# This parameter is a list of app slug separated by ',' char.
|
|
# Not exhaustive list of available apps:
|
|
# - "content/thread" -> thread/topic/discussion: allow to discuss about one
|
|
# subject.
|
|
# - content/file -> allow to upload all type of file like .pdf, .odt, .jpg, etc
|
|
# - content/html-document -> allow to work on a standard html-based document
|
|
# which is editable through Tracim.
|
|
# - content/folder -> allow to put content into folder.
|
|
# - content/kanban -> allow to work with kanban-styled boards. It requires content/file to be enabled.
|
|
# - agenda -> add caldav agenda feature (specific process need to be runned)
|
|
# - collaborative_document_edition -> add support for collaborative document edition,
|
|
# add support for collaborative edition server like collabora/libreofficeOnline.
|
|
# - share_content -> allow user to share Tracim content with external user
|
|
# - upload_permission -> allow external with permission to upload some file in a space.
|
|
# - gallery -> add gallery app in Tracim
|
|
# default app.enabled config explicit list config:
|
|
; app.enabled = contents/thread,contents/file,contents/html-document,contents/folder,contents/kanban,agenda,share_content,upload_permission,gallery
|
|
# With all apps (add collaborative document edition):
|
|
# app.enabled = contents/thread,contents/file,contents/html-document,contents/folder,contents/kanban,agenda,collaborative_document_edition,share_content,upload_permission,gallery
|
|
|
|
### Live Messages ###
|
|
# control_uri for GRIP protocol reverse-proxy (PushPin)
|
|
# this is the base url used for publishing new events to reverse-proxy.
|
|
; live_messages.control_zmq_uri = tcp://localhost:5563
|
|
# stats socket uri for GRIP protocol reverse-proxy (PushPin)
|
|
# this is the base url used for listening to events related to connection to the
|
|
# reverse-proxy. If you are running pushpin using the docker-compose, set this
|
|
# parameter to tcp://localhost:5564
|
|
; live_messages.stats_zmq_uri = ipc:///var/run/pushpin/pushpin-stats
|
|
# do tracim block until publishing is complete or not
|
|
# by default it will be False if jobs.processing_mode is sync and True if processing_mode is async
|
|
# as sync publishing is done during the HTTP request
|
|
; live_messages.blocking_publish = False
|
|
|
|
### Plugins ###
|
|
# if provided, this allow Tracim to load package from this dir and if package follow
|
|
# the convention "tracim_backend_{plugin_name}", hooks provided inside the package will
|
|
# be loaded, allowing to add new feature to an existing Tracim.
|
|
; plugin.folder_path = %(here)s/plugins
|
|
|
|
### Workspace ###
|
|
# list of access_type allowed for new workspaces. In Tracim; these values for access_type are available:
|
|
# - confidential: not visible publicly, access only by invitation workspace_manager/admin
|
|
# - on_request: publicly visible, access by invitation or request with validation by workspace manager/admin)
|
|
# - open: publicly visible and access by invitation or request without validation
|
|
; workspace.allowed_access_types = confidential,on_request,open
|
|
# example:
|
|
# workspace.allowed_access_types = confidential
|
|
|
|
# When a user joins a space, messages from events that happened before are added to the user's recent activities.
|
|
# This setting limits the messages of events that are created to avoid cluttering the database and too much processing when a user joins a space.
|
|
# 0 will completely disable the feature, leading to empty space recent activities when joining a space.
|
|
# -1 means no limit.
|
|
workspace.join.max_messages_history_count = -1
|
|
|
|
## CORS Special config
|
|
# you can override access control allowed origin here with list of comma separated
|
|
# base_url, by default only website.base_url and api.base_url are allowed
|
|
; cors.access-control-allowed-origin =
|
|
# example:
|
|
# cors.access-control-allowed-origin = http://localhost:6543,http://localhost:8090
|
|
|
|
## Anonymized User
|
|
# You can set default display name for anonymized user.
|
|
; default_anonymized_user_display_name = "Deleted user"
|
|
|
|
## Build Version
|
|
# If you leave build_version empty or unsetted here, Tracim will automatically
|
|
# try to get a meaningful value according to context, it will try to
|
|
# use last commit tag or hash as build_version. If your Tracim code is not placed
|
|
# in a git repository or git isn't installed on the server, default value will be
|
|
# "unknown".
|
|
# You can override predefined build version.
|
|
# Leave as empty to let Tracim find automatically build_version value.
|
|
; build_version =
|
|
|
|
####
|
|
# Content Security Policy
|
|
#
|
|
# Tracim can generate a content security policy header that only
|
|
# enables script execution from Tracim frontend to avoid XSS attacks.
|
|
# It also forbids <object> tags.
|
|
# This behavior can be tuned by using "additional_directives" if some other
|
|
# scripts/resources are needed for your installation or usage.
|
|
# By default the header is generated.
|
|
####
|
|
# Enable or disable the content security policy header
|
|
; content_security_policy.enabled = True
|
|
# You can set this to an URI where browsers will report CSP failures.
|
|
# Multiple URIs are possible by separating them with spaces (the config value is added as it is)
|
|
# They must be secured by a valid SSL/TLS connection and certificate
|
|
# Example: content_security_policy.report_uri = https://www.myreporturi.com https://www.another-reporturi.org
|
|
; content_security_policy.report_uri =
|
|
# If set to True, the generated header will be Content-Security-Policy-Report-Only.
|
|
# Useful to test policy changes before enforcing them
|
|
# If set to true, "report_uri" must also have a valid value.
|
|
; content_security_policy.report_only = False
|
|
# additional directives to tune the CSP header, they are added without any change to the header
|
|
; content_security_policy.additional_directives =
|
|
|
|
###
|
|
# URL PREVIEW
|
|
###
|
|
# timeout for fetching URL preview (in sec).
|
|
; url_preview.fetch_timeout = 30
|
|
|
|
####
|
|
# LIMITATION
|
|
####
|
|
|
|
# limit number of sharespaces any user can be owner, 0 mean not limit, default to 0
|
|
; limitation.sharedspace_per_user = 0
|
|
|
|
# max upload content length accepted by Tracim for file in bytes
|
|
# by default 0 meaning no limit. 104857600 (100MB) is a good value
|
|
; limitation.content_length_file_size = 0
|
|
# example:
|
|
# limitation.content_length_file_size = 104857600
|
|
|
|
# max size of all files of a space in bytes
|
|
# by default 0 meaning no limit. 1073741824(1GB) is a good value
|
|
; limitation.workspace_size = 0
|
|
# example:
|
|
# limitation.workspace_size = 1073741824
|
|
|
|
## default allowed space for new user if not provided in bytes, 0 mean no space
|
|
## limit. Limit is on the sum of sizes of owned by user space.
|
|
; limitation.user_default_allowed_space = 0
|
|
|
|
# maximum count of simulteanously online users, 0 means unlimited and is the default value.
|
|
; limitation.maximum_online_users = 0
|
|
|
|
# The customized error message shown to the user when the limit is reached.
|
|
# Empty by default. HTML is allowed.
|
|
; limitation.maximum_online_users_message =
|
|
# For instance:
|
|
# limitation.maximum_online_users_message = We suggest you contact your manager to upgrade your offer:<br /><b>Leslie Doe</b>, <a href="tel:+336123456789">+336123456789</a>, <a href="mailto:leslie.doe@example.org">leslie.doe@example.org</a>
|
|
|
|
####
|
|
# STORAGE
|
|
####
|
|
|
|
### Database ###
|
|
# to set database you need a proper sqlalchemy url, some example with supported
|
|
# database (sqlite, postgresql, mysql/mariadb)
|
|
## sqlite:
|
|
# sqlalchemy.url = sqlite:///%(here)s/tracim.sqlite
|
|
## mysql/mariadb:
|
|
# sqlalchemy.url = mysql+pymysql://user:password@dbhost:dbport/dbname
|
|
## postgresql:
|
|
# sqlalchemy.url = postgresql://user:paswword@dbhost:dbport/dbname?client_encoding=utf8
|
|
# see also for more info:
|
|
# https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine ##
|
|
; sqlalchemy.url = sqlite:///%(here)s/tracim.sqlite
|
|
sqlalchemy.url = %(basic_setup.sqlalchemy_url)s
|
|
|
|
### Uploaded files ###
|
|
|
|
; uploaded_files.storage.storage_name = tracim
|
|
## storage type, can be either "local" (local dir), "memory" (ram storage) or "s3" (remote S3 compatible storage)
|
|
uploaded_files.storage.storage_type = %(basic_setup.uploaded_files_storage_type)s
|
|
|
|
## This is where the files uploaded by users will be stored if storage_type is "local"
|
|
uploaded_files.storage.local.storage_path = %(basic_setup.uploaded_files_storage_path)s
|
|
|
|
## S3 credentials (requires the boto3 packaqe):
|
|
; uploaded_files.storage.s3.access_key_id =
|
|
; uploaded_files.storage.s3.secret_access_key =
|
|
; uploaded_files.storage.s3.bucket =
|
|
; uploaded_files.storage.s3.region_name =
|
|
## S3 canned ACL policy can be either "private" or "public-read"
|
|
; uploaded_files.storage.s3.policy =
|
|
## use specific s3 storage class
|
|
; uploaded_files.storage.s3.storage_class =
|
|
## allow to define other S3 provided than AWS
|
|
; uploaded_files.storage.s3.endpoint_url =
|
|
# permit to store file under specific prefix, trailing slash prefix like "dirname/" permit to store in subdirectory
|
|
; uploaded_files.storage.s3.prefix =
|
|
|
|
|
|
|
|
|
|
### Preview ###
|
|
## preview cache directory
|
|
; preview_cache_dir = %(here)s/previews
|
|
preview_cache_dir = %(basic_setup.preview_cache_dir)s
|
|
|
|
## You can parametrized allowed jpg preview dimension list, if not set, default
|
|
## is 256x256. First {width}x{length} items is default preview dimensions.
|
|
## All items should be separated by a coma.
|
|
; preview.jpg.allowed_dims = 256x256
|
|
# examples with multiples values:
|
|
# preview.jpg.allowed_dims = 256x256,512x512,1024x1024
|
|
## Preview dimensions can be set as restricted. If set as True, access
|
|
## endpoint to get any other preview dimensions than allowed_dims will
|
|
## return error
|
|
; preview.jpg.restricted_dims = False
|
|
|
|
### Session ###
|
|
|
|
# Warning! if you decide to change the session parameters, we strongly encourage you to delete existing sessions
|
|
# in order to avoid security issues. See the Tracim settings documentation (available in source code, see "settings.md").
|
|
|
|
### pyramid_beaker parameters ###
|
|
|
|
session.type = file
|
|
# needed for "file" storage config :
|
|
; session.data_dir = %(here)s/sessions_data
|
|
session.data_dir = %(basic_setup.sessions_data_root_dir)s/sessions_data
|
|
# needed for many session storage type, but not for file (leave as empty for file)
|
|
session.url =
|
|
|
|
## "Redis" storage config sample:
|
|
# session.type = ext:redis
|
|
# note: redis db name are integer (by default 16 database are available from 0 to 15 db)
|
|
# session.url = redis://localhost:6379/0
|
|
|
|
; session.lock_dir = %(here)s/sessions_data
|
|
session.lock_dir = %(basic_setup.sessions_data_root_dir)s/sessions_lock
|
|
session.key = session_key
|
|
session.secret = %(basic_setup.session_secret)s
|
|
session.save_accessed_time = True
|
|
## Delay in seconds
|
|
session.cookie_expires = 604800
|
|
session.timeout = 604800
|
|
session.cookie_on_exception = True
|
|
# enable or disable http-only for cookie, by default set as True. Disable it only
|
|
# if you know what you're doing as this is less secure.
|
|
; session.httponly = True
|
|
# enable or disable secure for cookie, by default set as False. We strongly
|
|
# recommend you to set it a True if you are using https.
|
|
session.secure = True
|
|
|
|
####
|
|
# AUTH
|
|
####
|
|
|
|
### API KEY AUTH ###
|
|
# Api key auth allow to access to any authenticated user using
|
|
# 'Tracim-Api-Key'(secret share between client and Tracim)
|
|
# and 'Tracim-Api-Login' (mail of existing user) headers.
|
|
|
|
## Api key auth is disabled by default,
|
|
## you should set a not-null value to api.key to enable it:
|
|
; api.key =
|
|
api.key = %(basic_setup.api_key)s
|
|
## base url of the backend API, default to same as website.base_url
|
|
; api.base_url =
|
|
|
|
### Remote User Auth ###
|
|
# remote user auth give authorized access to user using a simple header with
|
|
# email of user, if user does not exist, new user will be created.
|
|
# This allow to delegate auth mechanism to webserver.
|
|
# this a true auth mechanism like internal or ldap,
|
|
# this mean user created this way will be attached to this mechanism.
|
|
|
|
## Remote user header should be a CGI env var.
|
|
## most common value is "REMOTE_USER".
|
|
## You can also directly use HTTP header instead of standard CGI env var
|
|
## using "HTTP_" CGI env var which are HTTP header
|
|
## but be careful about spoofing, you should be sure that no-one can set
|
|
## header and pretend to be anyone. Only trusted server should be able to
|
|
## set remote_user_header.
|
|
## remote user auth is disabled by default,
|
|
## you should set a not-null value to auth_remote_header to enable it:
|
|
; remote_user_header =
|
|
|
|
## Auth type list (internal or ldap), can be a list of item separated by ','
|
|
## and ordered by priority
|
|
## auth_type 'remote' is not allowed there, set remote_auth_header.
|
|
auth_types = internal
|
|
;auth_types = internal,ldap
|
|
# If auth_type is ldap, uncomment following ldap_* parameters
|
|
## LDAP server address
|
|
ldap_url = ldap://127.0.0.1:389
|
|
## Bind dn to identify the search
|
|
ldap_bind_dn =
|
|
# example:
|
|
# ldap_bind_dn = cn=admin,dc=directory,dc=fsf,dc=org
|
|
## The bind password
|
|
ldap_bind_pass =
|
|
# example:
|
|
# ldap_bind_pass = toor
|
|
## Base dn to make queries of users
|
|
ldap_user_base_dn = ou=users,dc=yunohost,dc=org
|
|
# example:
|
|
# ldap_user_base_dn = ou=Users,dc=directory,dc=fsf,dc=org
|
|
## Attribute name of user record who contain user login (email)
|
|
ldap_login_attribute = mail
|
|
## Attribute for default name of new user from ldap
|
|
ldap_name_attributes = givenName
|
|
## TLS usage to communicate with your LDAP server
|
|
ldap_tls = False
|
|
|
|
## User auth token validity in seconds (used to interfaces like web calendars)
|
|
; user.auth_token.validity = 604800
|
|
## user reset_password token lifetime (default to 900s -> 15 minutes)
|
|
; user.reset_password.token_lifetime = 900
|
|
## Default profile of created user, valid values are: users, trusted-users, administrators
|
|
; user.default_profile = users
|
|
## Allow people to register/create an account themselves without authentication.
|
|
## The profile of those users will be user.default_profile
|
|
; user.self_registration.enabled = False
|
|
|
|
# The delay in seconds after which a user is considered offline after all
|
|
# connections to live messages are closed.
|
|
# NOTE: this setting is experimental and may be removed without notice in a
|
|
# later version of Tracim.
|
|
|
|
; user.online_timeout = 10
|
|
|
|
## enable or disable filter on known user, if True, user cannot see at all informations about
|
|
## member with no common space. If False, it can access to these informations.
|
|
## This is used by search mechanism for invitation of user in space.
|
|
; known_members.filter = True
|
|
|
|
####
|
|
# CUSTOM PROPERTIES
|
|
####
|
|
|
|
## User custom properties: This features allows defining custom instance-global fields on users of this instance.
|
|
# See the Tracim settings documentation (available in source code, see "user_custom_properties.md") for more
|
|
# information about it.
|
|
; user.custom_properties.json_schema_file_path = %(here)s/tracim_backend/templates/user_custom_properties/default/schema.json
|
|
; user.custom_properties.ui_schema_file_path = %(here)s/tracim_backend/templates/user_custom_properties/default/ui.json
|
|
; user.custom_properties.translations_dir_path = %(here)s/tracim_backend/templates/user_custom_properties/default/locale
|
|
## example with user.custom_properties.dir shortcut:
|
|
# user.custom_properties.dir = %(here)s/tracim_backend/templates/user_custom_properties/default
|
|
# user.custom_properties.json_schema_file_path = %(user.custom_properties.dir)s/schema.json
|
|
# user.custom_properties.ui_schema_file_path = %(user.custom_properties.dir)s/ui.json
|
|
# user.custom_properties.translations_dir_path = %(user.custom_properties.dir)s/locale
|
|
|
|
####
|
|
# IHM
|
|
####
|
|
|
|
### Website config ###
|
|
## title of website, used in email and is part of the title in browsers
|
|
; website.title = Tracim
|
|
website.title = %(basic_setup.website_title)s
|
|
## description of website, used by search engines to display their results
|
|
; website.description =
|
|
## Custom welcome page displayed during login
|
|
## The path of those files is relative to frontend/dist/assets/branding/
|
|
## Please read the documentation in doc/branding.md for further information
|
|
; website.welcome_page = welcome-simple.html
|
|
; website.welcome_page_style = welcome-simple.css
|
|
|
|
# The following base_url is used for links and icons
|
|
# integrated in the email notifcations, it's the frontend config.
|
|
; website.base_url = http://localhost:6543
|
|
website.base_url = %(basic_setup.website_base_url)s
|
|
|
|
# paths to usage conditions files (relative to frontend/dist/assets/branding)
|
|
# separated by ",", by default there are no usage conditions files.
|
|
website.usage_conditions =
|
|
|
|
|
|
### Frontend ###
|
|
## if you want to use Tracim API without frontend, change this parameter
|
|
; frontend.serve = True
|
|
# You can set dist folder of Tracim frontend. By default, system
|
|
# will try to get it automatically according to Tracim repository
|
|
# organisation.
|
|
; frontend.dist_folder_path =
|
|
# example:
|
|
# frontend.dist_folder_path = /home/user/tracim/frontend/dist
|
|
|
|
# if you need to add custom javascript code into Tracim, you can use custom toolbox
|
|
# feature. You add your javascript in this folder, all content
|
|
# of this folder will be serve in /custom_toolbox-assets
|
|
# and all javascript ".js" file will be added to index.html file.
|
|
; frontend.custom_toolbox_folder_path =
|
|
# example:
|
|
# frontend.custom_toolbox_folder_path = /tmp/custom_toolbox
|
|
|
|
# Cache token is used to force browser fetching of static files if Tracim version has changed.
|
|
# If you leave frontend.cache_token empty here, Tracim will automatically
|
|
# try to get a meaningful value according to context, it will try to
|
|
# use last commit hash as cache_token. If your Tracim code is not placed
|
|
# in a git repository or git isn't installed on the server, Tracim will use an
|
|
# autogenerated uuid. This uuid will change at each restart of Tracim
|
|
# You can override predefined cache_token here.
|
|
# Leave as empty to let Tracim find automatically cache_token value.
|
|
; frontend.cache_token =
|
|
# example:
|
|
# frontend.cache_token = QmlnIHN1cmljYXRlIGlzIHdhdGNoaW5nIHlvdSAh
|
|
|
|
### Color ###
|
|
# check for color.json file in Tracim, check by default in Tracim parent
|
|
# directory of backend.
|
|
## you can set a specific file path here
|
|
; color.config_file_path =
|
|
# example:
|
|
# color.config_file_path = /home/user/tracim/color.json
|
|
|
|
### Webdav ###
|
|
# webdav url for client
|
|
# url can be extended like localhost/webdav by setting webdav.root_path parameter
|
|
# in this case, you have to create your own proxy behind this url.
|
|
webdav.base_url = %(website.base_url)s
|
|
webdav.ui.enabled = True
|
|
|
|
### Notifications ###
|
|
# Comma-separated events listed in this setting are not displayed in recent activities and notifications to the user.
|
|
# Possible events are in the form ENTITY_TYPE.EVENT_TYPE or ENTITY_TYPE.EVENT_TYPE.CONTENT_TYPE where:
|
|
# ENTITY_TYPE = user_call | user | workspace | content | mention | workspace_member
|
|
# EVENT_TYPE = created | modified | deleted | undeleted
|
|
# CONTENT_TYPE = html-document | file | thread | folder | comment
|
|
# To include all notifications, use web.notifications.excluded = ""
|
|
# To exclude all notification of an entity, you can use wildcard syntax: for example "user.*" for user,
|
|
# will exclude those events: user.deleted, user.created, user.modified, user.undeleted...
|
|
; web.notifications.excluded = user_call.created, user.*, workspace.modified, workspace.deleted, workspace.undeleted, workspace_member.modified, content.modified, reaction.*, tag.*, content_tag.*
|
|
|
|
### UI Customization
|
|
# These parameters configure the user interface without affecting the backend proper
|
|
|
|
# Enable the parent space choice when creating a new space from the user interface.
|
|
; ui.spaces.creation.parent_space_choice.visible = True
|
|
|
|
####
|
|
# JOB EXECUTION
|
|
####
|
|
|
|
### configuration of potentially lengthy jobs ###
|
|
# processing_mode may be sync or async,
|
|
# if async is choosen, you need also to run:
|
|
# - a custom rq worker (see backend/README.md)
|
|
# - a redis server
|
|
; jobs.processing_mode = sync
|
|
## with async, please also configure redis below
|
|
; jobs.async.redis.host = localhost
|
|
; jobs.async.redis.port = 6379
|
|
# note: redis db name are integer (by default 16 database are available from 0 to 15 db)
|
|
; jobs.async.redis.db = 0
|
|
|
|
####
|
|
# EMAIL-COMMON
|
|
####
|
|
# Require that every users have an email address associated with their account.
|
|
# If disabled, users will be allowed to have accounts without an email address. In this case, the username is mandatory.
|
|
; email.required = True
|
|
|
|
####
|
|
# EMAIL-NOTIFICATION
|
|
####
|
|
|
|
## send some notification when user make specific action in Tracim
|
|
; email.notification.activated = False
|
|
## you can enable or disable if invited user to space will be notified
|
|
## on this space by default.
|
|
## NB: new users will not being notified until they login to Tracim a first time
|
|
; email.notification.enabled_on_invitation = True
|
|
# You can enable notification-specific logs using the 'tracim_email_notification' logger.
|
|
|
|
|
|
### SMTP ###
|
|
|
|
|
|
email.notification.smtp.server = localhost
|
|
email.notification.smtp.port = 25
|
|
; email.notification.smtp.user =__APP__@__DOMAIN__
|
|
; email.notification.smtp.password =
|
|
# configuration example:
|
|
# email.notification.smtp.server = your_smtp_server
|
|
# email.notification.smtp.port = 25
|
|
# email.notification.smtp.user = your_smtp_user
|
|
# email.notification.smtp.password = your_smtp_password
|
|
|
|
# enable implicit ssl if you are using implicit smtp with encryption port like 465
|
|
# by default, Tracim will try to use explicit smtp encryption using starttls, and unencrypted
|
|
# connection as fallback.
|
|
; email.notification.smtp.use_implicit_ssl = False
|
|
|
|
### Headers ###
|
|
; email.notification.from.default_label = Tracim Notifications
|
|
|
|
# Note: items between {} are variable names. Do not remove / rename them
|
|
# email notifications can be sent with the user_id added as an identifier
|
|
# this way email clients like Thunderbird will be able to distinguish
|
|
# notifications generated by a user or another one. 'content_id' for example is
|
|
# needed in both 'reply_to' and 'references' header pattern
|
|
# to have email_reply feature working correctly.
|
|
|
|
# header for from, reply-to and references headers.
|
|
# those allow to set one variable only one time in email pattern, this kind
|
|
# of pattern with multiple variable will not work correctly:
|
|
# reply+{content_id}{content_id}@domainname.tld
|
|
|
|
|
|
## valid variable is 'user_id' for 'from' header:
|
|
; email.notification.from.email =
|
|
# example of recommanded pattern (for 'from' header):
|
|
# email.notification.from.email = noreply+{user_id}@domainname.tld
|
|
|
|
## valid variable is 'content_id' for 'reply_to' header:
|
|
; email.notification.reply_to.email =
|
|
# tagging reply_to header of email with content_id is needed for working
|
|
# email_reply feature
|
|
# example of recommanded pattern (for 'reply_to' header):
|
|
# email.notification.reply_to.email = reply+{content_id}@domainname.tld
|
|
# email.notification.reply_to.email = {content_id}@reply.domainname.tld
|
|
# email.notification.reply_to.email = reply+cid{content_id}@domainname.tld
|
|
|
|
## valid variable is 'content_id' for 'references' header:
|
|
; email.notification.references.email =
|
|
# tagging reference header of email with content_id is nice to have
|
|
# all modification to a same content in a same email client thread
|
|
# Note: reference doesn't need to be an existing email account but should
|
|
# be a email like string.
|
|
# example of recommanded pattern (for 'references' header):
|
|
# email.notification.references.email = thread+{content_id}@domainname.tld
|
|
|
|
# emails subjects:
|
|
; email.notification.content_update.subject = [{website_title}] [{workspace_label}] {content_label} ({content_status_label})
|
|
; email.notification.created_account.subject = [{website_title}] Someone created an account for you
|
|
; email.notification.share_content_to_emitter.subject = [{website_title}] You shared "{content_filename}" with {nb_receivers} people
|
|
; email.notification.share_content_to_receiver.subject = [{website_title}] {emitter_name} shared the file "{content_filename}" with you
|
|
; email.notification.upload_permission_to_emitter.subject = [{website_title}] You invited {nb_receivers} people to upload files on "{workspace_name}"
|
|
; email.notification.upload_permission_to_receiver.subject = {emitter_name} invited you to upload files on "{website_title}"
|
|
|
|
### Templates ###
|
|
|
|
# emails templates:
|
|
; email.notification.content_update.template.html = %(here)s/tracim_backend/templates/mail/content_update_body_html.mak
|
|
; email.notification.created_account.template.html = %(here)s/tracim_backend/templates/mail/created_account_body_html.mak
|
|
; email.notification.reset_password_request.template.html = %(here)s/tracim_backend/templates/mail/reset_password_body_html.mak
|
|
; email.notification.share_content_to_emitter.template.html = %(here)s/tracim_backend/templates/mail/shared_content_to_emitter_body_html.mak
|
|
; email.notification.share_content_to_receiver.template.html = %(here)s/tracim_backend/templates/mail/shared_content_to_receiver_body_html.mak
|
|
; email.notification.upload_permission_to_emitter.template.html = %(here)s/tracim_backend/templates/mail/upload_permission_to_emitter_body_html.mak
|
|
; email.notification.upload_permission_to_receiver.template.html = %(here)s/tracim_backend/templates/mail/upload_permission_to_receiver_body_html.mak
|
|
; email.notification.new_upload_event.template.html = %(here)s/tracim_backend/templates/mail/new_upload_event_body_html.mak
|
|
|
|
|
|
# example with shortcut for template_dir path:
|
|
; email.template_dir =
|
|
# email.template_dir = %(here)s/tracim_backend/templates/mail
|
|
# email.notification.content_update.template.html = %(email.template_dir)s/content_update_body_html.mak
|
|
# email.notification.created_account.template.html = %(email.template_dir)s/created_account_body_html.mak
|
|
# email.notification.reset_password_request.template.html = %(email.template_dir)s/reset_password_body_html.mak
|
|
# email.notification.share_content_to_emitter.template.html = %(email.template_dir)s/shared_content_to_emitter_body_html.mak
|
|
# email.notification.share_content_to_receiver.template.html = %(email.template_dir)s/shared_content_to_receiver_body_html.mak
|
|
# email.notification.upload_permission_to_emitter.template.html = %(email.template_dir)s/upload_permission_to_emitter_body_html.mak
|
|
# email.notification.upload_permission_to_receiver.template.html = %(email.template_dir)s/upload_permission_to_receiver_body_html.mak
|
|
# email.notification.new_upload_event.template.html = %(email.template_dir)s/new_upload_event_body_html.mak
|
|
|
|
####
|
|
# EMAIL-REPLY
|
|
####
|
|
|
|
# Email reply configuration:
|
|
# Reply by email feature: allow user to answer directly to Tracim in reply
|
|
# to notification.
|
|
# This need api.key with non-empty value
|
|
# This feature need to run mail_fetcher daemons.
|
|
# more info in README (Run daemons according to your config)
|
|
; email.reply.activated = False
|
|
|
|
### IMAP ###
|
|
# Tracim email reply feature will read all mails in following IMAP,
|
|
# to be able to transform email responses into Tracim app comments.
|
|
|
|
; email.reply.imap.server =
|
|
; email.reply.imap.port =
|
|
; email.reply.imap.user =
|
|
; email.reply.imap.password =
|
|
# imap folder where email are retrieved for email fetcher,
|
|
# valid name for inbox is INBOX. You need to set an existing directory.
|
|
# you can use "INBOX/tracim_reply" for tracim_reply subdir, or directly "tracim_reply" if you don't use subdir.
|
|
# to use this properly with a different value than INBOX,
|
|
# you probably need to add rules to automatically move the new mail
|
|
# to the correct dir.
|
|
; email.reply.imap.folder = INBOX
|
|
; email.reply.imap.use_ssl = True
|
|
|
|
# example:
|
|
# email.reply.imap.server = your_imap_server
|
|
# email.reply.imap.port = 993
|
|
# email.reply.imap.user = your_imap_user
|
|
# email.reply.imap.password = your_imap_password
|
|
|
|
|
|
# IMAP IDLE feature is for real-time notifications (its not necessary to use function send & receive)
|
|
# if this option is available in your imap server, change this parameter to True
|
|
; email.reply.imap.use_idle = False
|
|
|
|
### Connection ###
|
|
## Delay in seconds for re-new connection
|
|
; email.reply.connection.max_lifetime = 600
|
|
## Delay in seconds between each check
|
|
; email.reply.check.heartbeat = 60
|
|
|
|
### Parsing ###
|
|
; email.reply.use_html_parsing = True
|
|
; email.reply.use_txt_parsing = True
|
|
|
|
### Lock ###
|
|
# Lockfile path is required for email_reply feature,
|
|
# it's just an empty file use to prevent concurrent access to imap unseen mail
|
|
; email.reply.lockfile_path = %(here)s/email_fetcher.lock
|
|
|
|
####
|
|
# WEBDAV
|
|
####
|
|
|
|
### Main Webdav Config ###
|
|
## webdav server hostname listen
|
|
webdav.listen = localhost:3030
|
|
## default root of webdav service
|
|
## this params need to be modified in case of using webdav with proxy
|
|
## if you want for example that path /webdav give access to webdav
|
|
webdav.root_path = /webdav
|
|
|
|
### Technical Webdav configuration ###
|
|
## wsgidav block size in bytes
|
|
; webdav.block_size = 8192
|
|
## wsgidav verbose level
|
|
## 0 - quiet
|
|
## 1 - no output (excepting application exceptions)
|
|
## 2 - warnings and errors only
|
|
## 3 - show single line request summaries (HTTP logging)
|
|
## 4 - show additional events
|
|
## 5 - show full request/response header info (HTTP Logging)
|
|
## request body and GET response bodies not shown
|
|
; webdav.verbose.level = 1
|
|
|
|
### Webdav HTML dir browser ###
|
|
## Render HTML listing for GET requests on collections
|
|
; webdav.dir_browser.enabled = True
|
|
## Raw HTML code, appended as footer,
|
|
## if not set, let Tracim created his own footer.
|
|
; webav.dir_browser.footer =
|
|
# example:
|
|
# webdav.dir_browser.footer = Just another footer
|
|
|
|
####
|
|
# CALDAV (Radicale)
|
|
####
|
|
|
|
# This feature require application "agenda" in "app.enabled"
|
|
|
|
### Radicale Proxy config ##
|
|
## path to Tracim radicale server, usually at localhost:port
|
|
; caldav.radicale_proxy.base_url = http://localhost:5232
|
|
|
|
### Radicale config ###
|
|
## those params are same as in config file of radicale but syntax
|
|
## is different.
|
|
## use syntax:
|
|
## ```
|
|
## caldav.radicale.section.param_name = value
|
|
## ```
|
|
## instead of radicale.ini syntax:
|
|
## ```
|
|
## [section]
|
|
## param_name = value
|
|
## ```
|
|
|
|
caldav.radicale.server.host = localhost:5232
|
|
## To make Tracim work, we need to disable auth and rights.
|
|
caldav.radicale.auth.type = None
|
|
caldav.radicale.rights.type = None
|
|
## We do not need radicale web ui
|
|
caldav.radicale.web.type = None
|
|
## for Tracim we do use file storage.
|
|
caldav.radicale.storage.type = multifilesystem
|
|
; caldav.radicale.storage.filesystem_folder = %(here)s/radicale_storage
|
|
caldav.radicale.storage.filesystem_folder = %(basic_setup.caldav_storage_dir)s
|
|
# CORS config for radicale
|
|
caldav.radicale.headers.Access-Control-Allow-Origin = *
|
|
caldav.radicale.headers.Access-Control-Allow-Methods = GET, POST, OPTIONS, PROPFIND, PROPPATCH, REPORT, PUT, MOVE, DELETE, LOCK, UNLOCK
|
|
caldav.radicale.headers.Access-Control-Allow-Headers = User-Agent, Authorization, Content-type, Depth, If-match, If-None-Match, Lock-Token, Timeout, Destination, Overwrite, X-client, X-Requested-With, Prefer
|
|
caldav.radicale.headers.Access-Control-Expose-Headers = Etag
|
|
|
|
####
|
|
# SEARCH (ElasticSearch)
|
|
####
|
|
# choose search engine to use, available value are: simple, elasticsearch.
|
|
# simple need nothing more than Tracim but features are limited,
|
|
# elasticsearch is more effective but need an elasticsearch server.
|
|
; search.engine = simple
|
|
# elasticsearch configuration
|
|
; search.elasticsearch.host = localhost
|
|
; search.elasticsearch.port = 9200
|
|
# global elasticsearch timeout in seconds
|
|
; search.elasticsearch.request_timeout = 60
|
|
|
|
# prefix of the index aliases that will be used to store Tracim users, contents and workspaces for searching
|
|
; search.elasticsearch.index_alias_prefix =
|
|
# example:
|
|
# search.elasticsearch.index_alias_prefix = my-tracim
|
|
|
|
# template_name for all created indices. Currently only {index_alias} and {date} variable are usable.
|
|
# be careful this template is used to find all indices to delete with tracimcli search delete command
|
|
; search.elasticsearch.index_pattern_template = {index_alias}-{date}
|
|
|
|
# if you use ingest mode in elasticsearch, you can enable file content ingest
|
|
# for search
|
|
; search.elasticsearch.use_ingest = False
|
|
|
|
# define mimetypes to be plain-text indexed. List of mimetypes, separated by a coma ",".
|
|
# if set to empty, index documents of any mimetype:
|
|
; search.elasticsearch.ingest.mimetype_whitelist =
|
|
# example:
|
|
# search.elasticsearch.ingest.mimetype_whitelist = text/markdown,text/plain
|
|
|
|
# exclude mimetypes from plain-text indexation. If a mimetype is both in whitelist and blacklist, it will be blacklisted.
|
|
# if set to empty, do nothing. Default value is empty, meaning no blacklist:
|
|
; search.elasticsearch.ingest.mimetype_blacklist =
|
|
# example:
|
|
# search.elasticsearch.ingest.mimetype_blacklist = application/gzip,application/zip
|
|
|
|
# add size limit (in bytes) for elasticsearch ingest activation
|
|
# if file content like a pdf of a content type file is bigger than the limit, it's content will
|
|
# not be indexed using ingest mode.
|
|
# default value to 52428800 = 50Mo
|
|
; search.elasticsearch.ingest.size_limit = 52428800
|
|
|
|
|
|
####
|
|
# Collaborative Document Edition (Collabora, etc)
|
|
####
|
|
|
|
# This feature require application "collaborative_document_edition" in "app.enabled"
|
|
|
|
# software used for collaborative document_edition
|
|
; collaborative_document_edition.software =
|
|
# "collabora" software value give support for
|
|
# both CollaboraOnline and LibreofficeOnline, example:
|
|
# collaborative_document_edition.software = collabora
|
|
|
|
# list of extensions for which online edition will be provided.
|
|
# This list is used to filter the extensions returned by the collaborative edition software.
|
|
# It is also used to filter the list of template files.
|
|
# If empty (which is the default value),no filtering is done.
|
|
; collaborative_document_edition.enabled_extensions =
|
|
# collaborative_document_edition.enabled_extensions = odt,ods
|
|
|
|
# base url where collabora server exist
|
|
; collaborative_document_edition.collabora.base_url =
|
|
# example:
|
|
# collaborative_document_edition.collabora.base_url = http://localhost:9980
|
|
|
|
# template dir for collaborative document edition:
|
|
; collaborative_document_edition.file_template_dir = %(here)s/tracim_backend/templates/open_documents
|
|
|
|
|
|
####
|
|
# Translation service
|
|
####
|
|
|
|
|
|
# This feature provides comments and html-documents translation by using a third-party translation service
|
|
|
|
; translation_service.enabled = False
|
|
|
|
## Translation service target languages that will be proposed in Tracim's interface
|
|
# It is a comma-separated list of <ISO-639-1 language code>:<Language string to display> pairs.
|
|
# The string can use any UTF-8 character.
|
|
; translation_service.target_languages = en:English,fr:Français,pt:Português,de:Deutsch
|
|
# example:
|
|
# translation_service.target_languages = fr:Français,ar:العربية,ja:日本語
|
|
|
|
## Translation service timeout in seconds.
|
|
# This timeout will be applied to each translation request.
|
|
; translation_service.timeout = 0
|
|
# example:
|
|
# translation_service.timeout = 20
|
|
|
|
## Translation provider, currently only "systran" is supported
|
|
; translation_service.provider =
|
|
# example:
|
|
# translation_service.provider = systran
|
|
|
|
## Systran translation config parameters
|
|
; translation_service.systran.api_url =
|
|
; translation_service.systran.api_key =
|
|
# example:
|
|
# translation_service.systran.api_url = https://api-translate.systran.net
|
|
# translation_service.systran.api_key = your-systran-api-key
|
|
|
|
## all next lines are not directly concerned by syntax explain in beggining of this file.
|
|
|
|
####
|
|
# Call service
|
|
####
|
|
|
|
# This feature allows to call other users by using a third-party call service.
|
|
|
|
; call.enabled = False
|
|
|
|
## Call provider, currently only "jitsi_meet" is supported
|
|
; call.provider =
|
|
# example:
|
|
# call.provider = jitsi_meet
|
|
|
|
## Jitsi Meet configuration parameters
|
|
; call.jitsi_meet.url =
|
|
# example:
|
|
# call.jitsi_meet.url = https://meet.jit.si
|
|
|
|
## Time (in seconds) before the call is considered unanswered
|
|
; call.unanswered_timeout = 30
|
|
# example: timeout after 60s
|
|
# call.unanswered_timeout = 60
|
|
|
|
##############################
|
|
# SPECIFIC CONFIG FOR WEBAPP #
|
|
##############################
|
|
|
|
### WEB REST API specific config ###
|
|
# Rest API running pyramid framework
|
|
[pipeline:main]
|
|
pipeline = tracim_web
|
|
[app:tracim_web]
|
|
use = egg:tracim_backend
|
|
|
|
### pyramid config ###
|
|
pyramid.reload_templates = True
|
|
pyramid.debug_authorization = False
|
|
pyramid.debug_notfound = False
|
|
pyramid.debug_routematch = False
|
|
pyramid.default_locale_name = en
|
|
## More info here:
|
|
## https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/i18n.html#localization-deployment-settings
|
|
|
|
### pyramid optionals plugins ###
|
|
# required plugin are imported directly in Tracim source code,
|
|
# for example:
|
|
# ```
|
|
# pyramid.includes =
|
|
# pyramid_debugtoolbar
|
|
# ```
|
|
|
|
|
|
[pipeline:webdav]
|
|
pipeline = tracim_webdav
|
|
[app:tracim_webdav]
|
|
use = egg:tracim_backend#webdav
|
|
|
|
[pipeline:caldav]
|
|
pipeline = tracim_caldav
|
|
[app:tracim_caldav]
|
|
use = egg:tracim_backend#caldav
|
|
|
|
[server:main]
|
|
use = egg:waitress#main
|
|
listen = %(basic_setup.listen)s
|
|
|
|
[server:webdav]
|
|
use = egg:waitress#main
|
|
listen = %(webdav.listen)s
|
|
|
|
[server:caldav]
|
|
use = egg:waitress#main
|
|
listen = %(caldav.radicale.server.host)s
|
|
######################
|
|
# DATABASE MIGRATION #
|
|
######################
|
|
|
|
[alembic]
|
|
## path to migration scripts
|
|
script_location = tracim_backend/migration
|
|
|
|
## template used to generate migration files
|
|
; file_template = %%(rev)s_%%(slug)s
|
|
|
|
# timezone to use when rendering the date
|
|
# within the migration file as well as the filename.
|
|
# string value is passed to dateutil.tz.gettz()
|
|
## leave blank for localtime
|
|
; timezone =
|
|
|
|
## max length of characters to apply to the "slug" field
|
|
; truncate_slug_length = 40
|
|
|
|
# set to 'True' to run the environment during
|
|
# the 'revision' command, regardless of autogenerate
|
|
; revision_environment = False
|
|
|
|
# set to 'True' to allow .pyc and .pyo files without
|
|
# a source .py file to be detected as revisions in the
|
|
# versions/ directory
|
|
; sourceless = False
|
|
|
|
# version location specification; this defaults to migrate/versions.
|
|
# When using multiple version directories,
|
|
# initial revisions must be specified with --version-path
|
|
; version_locations = %(here)s/bar %(here)s/bat migrate/versions
|
|
|
|
# the output encoding used when revision files
|
|
# are written from script.py.mako
|
|
; output_encoding = utf-8
|
|
|
|
###########
|
|
# LOGGERS #
|
|
###########
|
|
|
|
## more info here:
|
|
## https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html
|
|
|
|
## level possibilities
|
|
# "level = INFO" logs SQL queries.
|
|
# "level = DEBUG" logs SQL queries and results.
|
|
# "level = WARN" logs neither (Recommended for production systems.)
|
|
|
|
### LOGGERS ###
|
|
[loggers]
|
|
keys = root, tracim, sqlalchemy, alembic, hapic
|
|
# add Tracim_email_notification logfile
|
|
# this need to add tracim_email_notification handler and tracim_email_notification formatter
|
|
# example:
|
|
# keys = root, tracim, sqlalchemy, alembic, hapic, tracim_email_notification
|
|
|
|
[logger_root]
|
|
level = INFO
|
|
handlers = console
|
|
|
|
[logger_tracim]
|
|
level = DEBUG
|
|
handlers =
|
|
qualname = tracim
|
|
|
|
[logger_sqlalchemy]
|
|
level = WARN
|
|
handlers =
|
|
qualname = sqlalchemy.engine
|
|
|
|
[logger_alembic]
|
|
level = INFO
|
|
handlers =
|
|
qualname = alembic
|
|
|
|
[logger_hapic]
|
|
level = DEBUG
|
|
handlers =
|
|
qualname = hapic
|
|
|
|
[logger_tracim_email_notification]
|
|
level = INFO
|
|
handlers = tracim_email_notification
|
|
qualname = tracim_email_notification
|
|
propagate = 0
|
|
|
|
### FORMATTER ###
|
|
# colored log formatter for console (do not work properly with file)
|
|
# this need coloredlog python package, you can install it in venv
|
|
# with 'pip install colorlog'
|
|
|
|
[formatters]
|
|
keys = generic
|
|
## colored log format (need colorlog)
|
|
# keys = color
|
|
|
|
[formatter_color]
|
|
## use utc based date format:
|
|
class=tracim_backend.lib.utils.logger.ColoredUTCFormatter
|
|
## alternative date: use normal current date (localized):
|
|
# class=colorlog.ColoredFormatter
|
|
format = %(asctime)s %(log_color)s%(levelname)-5.5s %(reset)s[%(name)s:%(lineno)s][%(threadName)s] %(log_color)s%(message)s
|
|
datefmt = %Y-%m-%d %H:%M:%S
|
|
|
|
[formatter_generic]
|
|
## use utc based date format:
|
|
class=tracim_backend.lib.utils.logger.StandardUTCFormatter
|
|
## alternative date: use normal current date (localized):
|
|
# class=logging.Formatter
|
|
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s
|
|
datefmt = %Y-%m-%d %H:%M:%S
|
|
|
|
[formatter_tracim_email_notification]
|
|
## use utc based date format:
|
|
class=tracim_backend.lib.utils.logger.StandardUTCFormatter
|
|
## alternative date: use normal current date (localized)
|
|
# class=logging.Formatter
|
|
format = %(asctime)s %(network)s %(action)s %(recipient)s %(subject)s %(message)s
|
|
datefmt = %Y-%m-%d %H:%M:%S
|
|
|
|
### HANDLERS ###
|
|
[handlers]
|
|
keys = console
|
|
# use file log instead:
|
|
# keys = logfile
|
|
# add tracim_email_notification_handler
|
|
# this logger is useful to log when notification is prepared
|
|
# ( for email: email is build)
|
|
# and when notification is send (for email: email is send):
|
|
# keys = console, tracim_email_notification
|
|
|
|
### Console log ###
|
|
[handler_console]
|
|
class = StreamHandler
|
|
args = (sys.stderr,)
|
|
level = NOTSET
|
|
formatter = generic
|
|
# colored console log (need colorlog python package):
|
|
# formatter = color
|
|
|
|
### Rotated file log ###
|
|
[handler_logfile]
|
|
class=handlers.RotatingFileHandler
|
|
level=NOTSET
|
|
# file name = tracim.log (created in current dir)
|
|
# max log size = 10Mo
|
|
# number of max log file = 5
|
|
args=('tracim.log','a',10*1024*1024,5)
|
|
formatter=generic
|
|
|
|
# file log for tracim_email_notification
|
|
[handler_tracim_email_notification]
|
|
class=FileHandler
|
|
level=INFO
|
|
args=('tracim_email_notification.log','a')
|
|
formatter=tracim_email_notification
|