###################### # 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 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:
Leslie Doe, +336123456789, leslie.doe@example.org #### # 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 = True ## 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 = ; 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 = __APP__@__DOMAIN__ # 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 = __APP__@__DOMAIN__ # 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 = content_id # 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 : 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