.. /* * This file is part of the SavaPage project . * Copyright (c) 2026 Datraverse B.V. * Author: Rijk Ravestein. * * SPDX-FileCopyrightText: (c) 2020 Datraverse B.V. * SPDX-License-Identifier: CC-BY-SA-4.0 * * For more information, please contact Datraverse B.V. at this * address: info@datraverse.com */ .. _ch-install-on-linux-advanced-config: Advanced Configuration ---------------------- .. contents:: |RST_TABLE_OF_CONTENTS| :depth: 1 :local: The majority of |PRODUCT_NAME| configuration is conducted in the :ref:`Administrator Web App `. Additional configuration options can be set in the :ref:`server.properties ` and :ref:`log4j.properties ` files, and in the :ref:`Config Editor `. .. _ch-install-on-linux-config-server-properties: server.properties ~~~~~~~~~~~~~~~~~ Static server properties are configured in ``/opt/savapage/server/data/server.properties`` and read at server startup. .. tip:: ``/opt/savapage/server/examples/data/server.properties.template`` is a copy of the default ``server.properties`` of your current installation. If your actual ``server.properties`` is missing key/value pairs that are required for advanced configuration, you can copy them from the corresponding ``.template`` file. .. note:: Instead of using ``server.properties`` to configure |PRODUCT_NAME|, the same keys from this file can also be used as enviroment variables. See :ref:`System Environment `. .. _ch-install-on-linux-config-log4j-properties: log4j.properties ~~~~~~~~~~~~~~~~ Static logging properties are configured in ``/opt/savapage/server/data/log4j.properties`` and read at server startup. .. note:: ``/opt/savapage/server/examples/data/log4j.properties.template`` is a copy of the default ``log4j.properties`` of your current installation. If your actual ``log4j.properties`` is missing key/value pairs that are required for advanced configuration, you can copy them from the corresponding ``.template`` file. .. _ch-install-on-linux-config-alt-tcpip-settings: Alternative TCP/IP Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. contents:: |RST_TABLE_OF_CONTENTS| :depth: 2 :local: .. _ch-install-on-linux-advanced-config-alt-tcpip-interface-ports: Alternative TCP/IP Interface and Ports ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Alternative port are set in the :ref:`server.properties ` file as shown in the table below. .. list-table:: Alternative TCP/IP Ports : server.properties :width: 100% :widths: 20 80 :header-rows: 1 * - Key - Description * - ``server.host`` - Hostname or IPv4/6 address of the network interface the server binds to. Default: bind to all interfaces. * - ``server.port`` - Server http port. Default: ``8631`` * - ``server.ssl.port`` - Main https port. Connected to an externally supplied SSL certificate, :ref:`if installed `. If *not* installed, the port is connected to the internal self-signed SSL certificate for local use. Default: ``8632`` * - ``server.ssl.port.local`` - Extra https port for local use. Connected to the internal self-signed SSL certificate. Default: ``8633`` |br| |br| *This port is relevant if an external SSL certificate is installed and* ``server.host`` *is not specified.* * - ``server.html.redirect.ssl`` - Redirect HTML of non-SSL port to SSL: ``true`` or ``false`` (default). This concerns HTML only, IPP traffic is not redirected. * - ``server.print.port.raw`` - The RAW Print Server port. Default: ``9100`` - Value ``0``: RAW printing is disabled. .. important:: Since |PRODUCT_NAME| is run by user ``savapage``, you can't use ports below 1024, because these ports can only be bound to by the superuser (root). If you want |PRODUCT_NAME| Web Apps to be accessible through port 80 and 443 at all costs, you can use `Apache `__ or `NGINX `__ server to forward (or "reverse-proxy") requests to the IP address of the |PRODUCT_NAME| host and apply the ``server.host`` key to bind the server to this single IP address. .. _ch-install-on-linux-advanced-config-alt-tcpip-threadpool-settings: Server ThreadPool Settings ^^^^^^^^^^^^^^^^^^^^^^^^^^ A high reliability server process like |PRODUCT_NAME| must reject excess requests *immediately* (fail fast) by using a Request Queue with a *bounded capacity*. When a request is rejected, the user browser will show a diagnostic message, for example that “The connection to the server was reset while the page was loading” because “The site could be temporarily unavailable or too busy”, with the advise to “Try again in a few moments”. .. figure:: ../images/manual/screenshots/admin/sp-01-12-server-connection-reset-firefox.png :alt: Rejected request in Firefox browser :width: 400 Rejected request in Firefox browser Request Queue capacity is calculated according to a tolerable “no-response” time. For example, if the server is capable of handling 100 requests per second, and 30 seconds of patience is accepted by users in the event of excessive high load, you can set the queue capacity to ``30*100=3000``. If queue capacity is set too low, the server will reject requests too soon and won't be able to handle normal load spikes. If set too high, a high load, that exceeds the processing power of the server application, will continue to stack requests on the queue. And thus, even after the load stops, the application will appear to have stopped responding to new requests as it still has lots of requests on the queue to handle. Requests are FIFO processed by threads contained in a ThreadPool. The maximum number of threads needed, in order to achieve the best performance, depends on host resources (RAM and CPU cores) assigned to the |PRODUCT_NAME| application. The maximum value will typically be between ``50`` and ``500``. The keys to set thread pool and queue capacity in the :ref:`server.properties ` file are shown in the table below. .. list-table:: ThreadPool Settings: server.properties :width: 100% :widths: 40 60 :header-rows: 1 * - Key - Description * - ``server.threadpool.queue.capacity`` - The capacity (maximum length) of the queue holding client requests to the server. Requests are FIFO processed by threads in the pool. Default: ``3000`` * - ``server.threadpool.maxthreads`` - Maximum number of threads in the pool. Default: ``200`` * - ``server.threadpool.minthreads`` - Minimum number of threads in the pool. Default: ``20`` * - ``server.threadpool.idle-timeout-msec`` - Maximum time a thread may be idle in milliseconds after it is terminated. Default: ``30000`` ThreadPool settings are part of application performance tuning. See :ref:`Tuning ` in general and :ref:`Linux Kernel Parameters ` in particular. .. note:: The browser “connection reset” message can be easily provoked by setting very low threadpool values, like: .. code-block:: properties server.threadpool.queue.capacity=4 server.threadpool.minthreads=1 server.threadpool.maxthreads=5 server.threadpool.idle-timeout-msec=10000 ... and frantically pressing the F5 browser key. .. _ch-install-on-linux-advanced-config-alt-server-session-settings: Server Session Settings ^^^^^^^^^^^^^^^^^^^^^^^ Server Web Sessions expire after a certain period of inactivity: see :ref:`Web Session Timeout `. Expired sessions are removed by a cyclic scavenge process. The cycle interval can be set with this property: .. list-table:: Session Settings: server.properties :width: 100% :widths: 40 60 :header-rows: 1 * - Key - Description * - ``server.session.scavenge.interval-sec`` - The interval (seconds) at which expired server sessions are scavenged. Default: ``600`` .. _ch-install-on-linux-config-http2: HTTP/2 Settings ~~~~~~~~~~~~~~~ |PRODUCT_NAME| supports both HTTP/1.1 and `HTTP/2 `__ communication protocols. HTTP/2 can be disabled or customized as desired. In the :ref:`server.properties ` configuration file ... .. list-table:: HTTP/2 Settings: server.properties :width: 100% :widths: 40 60 :header-rows: 1 * - Key - Description * - ``server.http2`` - Enable HTTP/2: ``true`` (default) or ``false``. * - ``server.http2.max-requests-per-sec`` - Maximum number of requests from an HTTP/2 connection per second. Requests in excess of this will encounter an ERR_CONNECTION_CLOSED. Default: ``128``. |br| |br| Also see :ref:`Denial of Service Filter `. ... and in the :ref:`Config Editor `. .. list-table:: HTTP/2 Configuration Properties :width: 100% :widths: 55 45 :header-rows: 1 * - Configuration property - Description * - system.http2.max-requests.warn-interval.applog.mins - Interval (minutes) within which HTTP/2 requests that exceed the rate controlmax are totaled and written as warning in the :ref:`Application Log `. The expiration of the interval is triggered by an HTTP/2 event that exceeds the limit. Default: ``5``. * - system.http2.max-requests.warn-interval.webapp.secs - Interval (seconds) within which HTTP/2 requests that exceed the rate control max are totaled and send as :ref:`Real-time Activity ` warning with popup message to the Admin Web App. Default: ``60``. .. _ch-install-on-linux-config-http-xff-header: HTTP XFF Header Settings ~~~~~~~~~~~~~~~~~~~~~~~~ |PRODUCT_NAME| uses the Remote IP address from an HTTP Request as Client IP address. This usually works out well. However, when client requests go through an HTTP Proxy or Load Balancer, the Remote IP address will be the IP address of the proxy or load balancer only. In that case the Remote IP address can't be used to define :ref:`Devices ` or to restrict access to |PRODUCT_NAME| objects, like :ref:`Queues `, :ref:`Web Services `, etc. To solve this issue you can set the properties below to use the HTPP `X-Forwarded-For `__ header to retrieve the correct Client IP address. .. list-table:: HTTP Configuration Properties :width: 100% :widths: 40 60 :header-rows: 1 * - Configuration property - Description * - webserver.http.header.xff.enable - Use the X-Forwarded-For (XFF) HTTP header to retrieve Client IP address. Values: ``N`` (default) \| ``Y``. If ``Y``, the HTPP "X-Forwarded-For" header is used to retrieve the Client IP address. * - webserver.http.header.xff.proxies.allowed - A :ref:`CIDR Set ` of allowed XFF proxies. If empty all proxies are allowed. Default: empty. * - webserver.http.header.xff.debug - Enable X-Forwarded-For (XFF) HTTP header debugging. Values: ``N``(default), ``Y``. If ``Y``, INFO messages are send to the :ref:`Admin Dashboard ` for each retrieved Client IP address. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. _ch-install-on-linux-config-database-connection-settings: Database Connection Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Database connections are both expensive to create and maintain over time. Therefore, they are an ideal resource to pool. That is just what |PRODUCT_NAME| does, with the help of JDBC Connection Pooling [2]_. The keys to set the Connection parameters in the :ref:`server.properties ` file are shown in the table below. .. list-table:: Database Connection: server.properties :width: 100% :widths: 47 53 :header-rows: 1 * - Key - Description * - ``database.connection.pool.max`` - Maximum number of connections in the pool. Default: ``200``. |br| |br| **Important**: if you are using PostgreSQL as database back-end this value must align with the maximum number of client connections allowed by the database. See :ref:`PostgreSQL Settings `. * - ``database.connection.pool.min`` - Minimum number of connections in the pool. Default: ``5``. * - ``database.connection.idle-timeout-secs`` - Maximum time a connection may be idle in *seconds* after it is closed. Default: ``600``. * - ``database.connection.idle-timeout-test-secs`` - Idle time in *seconds* before a connection is checked for timeout. Default: ``120``. |br| |br| This value must be **less** than ``database.connection.idle-timeout-secs``. If not, connections closed by the database will not be detected. * - ``database.connection.statement-cache`` - Number of prepared SQL statements that will be cached. Default: ``50``. Value ``0`` disables caching. .. note:: Database Connection Settings do *not* apply to the :ref:`internal database `. .. [2] SavaPage uses Java Database Connectivity (JDBC) Connection Pooling from `c3p0 `__: an easy-to-use library for making traditional JDBC drivers “enterprise-ready”. .. _ch-install-on-linux-advanced-config-postgresql-settings: PostgreSQL Settings ^^^^^^^^^^^^^^^^^^^ PostgreSQL ships with a basic configuration tuned for wide compatibility rather than performance. Depending on available host resources and :ref:`Database Connection Settings ` as described in the section above, there is a good chance the default parameters are very undersized. `Tuning Your PostgreSQL Server `__ is an expert job, but there are two obvious parameters in ``postgresql.conf``\ [3]_ you need to consider: 1. ``max_connections`` **must** at least be equal to :ref:`database.connection.pool.max ` plus the value of ``superuser_reserved_connections``. For example: .. code-block:: properties #---------------------------------------------------------------- # If SavaPage: database.connection.pool.max = 200 # and in this file: superuser_reserved_connections = 3 # and SavaPage is the only process accessing the Database ... #---------------------------------------------------------------- max_connections = 203 # (change requires restart) # Defaults to 3 #superuser_reserved_connections = 3 See `PostgreSQL Connection Settings `__. 2. The ``shared_buffers`` default of 128MB can be replaced by a higher value, depending on the total RAM in your system. For example: .. code-block:: properties #---------------------------------------------------------------- # System has 16GB RAM, we take a conservative 6.25% ... #---------------------------------------------------------------- #shared_buffers = 128MB # min 128kB # (change requires restart) shared_buffers = 1024MB A higher value allocates more shared memory during inter-process communication (IPC) between the database server and the requesting client, resulting in speedier data transfer. See `PostgreSQL Memory `__. **Important**: *restart the database after changing any of these settings.* .. [3] On Debian based systems ``postgresql.conf`` is located in ``/etc/postgresql/[version]/main/`` .. _ch-install-on-linux-config-cups: CUPS Settings ~~~~~~~~~~~~~ .. contents:: |RST_TABLE_OF_CONTENTS| :depth: 2 :local: .. _ch-install-on-linux-config-cups-notifier: CUPS Notifier ^^^^^^^^^^^^^ :ref:`CUPS notifier ` is a custom |PRODUCT_NAME| binary that pushes printer and print job status events from CUPS to |PRODUCT_NAME| server. It is the default CUPS notification method. A :ref:`pull method ` can be activated as alternative. Occasionally the notifier may fail to deliver job state notifications, as can be seen reported in ``/var/log/cups/error_log``. Since a failure can result in no job end states being observed, a heartbeat monitor pulls print status from CUPS for active jobs that have not been notified since the previous beat of the heart. The heartbeat period can be configured: see :ref:`CUPS Configuration Properties `. .. _ch-install-on-linux-config-cups-job-status: CUPS Job Status ^^^^^^^^^^^^^^^ CUPS Job Status is handled in the following way: - Normally a print job that is stopped in CUPS, for instance because “job-completed-with-errors”, must be manually controlled (reprint, cancel, move) by an operator. However, when |PRODUCT_NAME| identifies a stopped job it cancels it automatically. - At system (application) start-up, job status is pulled from CUPS for every :ref:`proxy printed document ` that has not reached end-state. See :ref:`CUPS Configuration Properties ` on how to change the defaults. .. _ch-install-on-linux-config-cups-ipp: CUPS IPP connections ^^^^^^^^^^^^^^^^^^^^ See :ref:`CUPS Configuration Properties ` on how to change defaults for the number of IPP connections to local CUPS and their IPP connect and read timeouts. .. _ch-install-on-linux-config-cups-properties: CUPS Configuration Properties ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. list-table:: CUPS Configuration Properties :width: 100% :widths: 50 50 :header-rows: 1 * - Configuration property - Description * - cups.ipp.notification.method - CUPS event notification method. Value ``PUSH`` (default) activates *pushed* print job status notification by :ref:`CUPS Notifier `. If value is ``PULL``, print job status is *pulled* from CUPS. * - cups.ipp.notification.push.notify-lease-duration - Duration of the subscription lease (seconds) for ``PUSH`` notification with the :ref:`CUPS Notifier `. Value must be greater than one (1) hour, since the renewal of the subscription is scheduled by SavaPage every hour. Default: ``4200``. See :ref:`Hourly Jobs `. * - cups.ipp.notification.push.heartbeat-msec - Number of milliseconds to wait before evaluating *pushed* CUPS job status notifications. Default: ``4000``. * - cups.ipp.notification.push.pull-fallback-msec - Number of milliseconds since the last *pushed* print job status notification by :ref:`CUPS Notifier ` after which a job status update is *pulled* from CUPS. Default: ``30000``. * - cups.ipp.notification.pull.heartbeat-msec - Number of milliseconds to wait before *pulling* CUPS job status. Default: ``5000``. * - cups.ipp.job-state.cancel-if-stopped.enable - Set to ``Y`` (default) or ``N``, to enable/disable automatic cancellation of stopped :ref:`CUPS Job Status `. * - system.startup.cups.ipp.sync-print-jobs.enable - Set to ``Y`` (default) or ``N``, to enable/disable :ref:`CUPS Job Status ` synchronization at system start-up. * - cups.ipp.local-connect-timeout-msec - IPP connect timeout in milliseconds on local CUPS. Default: ``5000``. * - cups.ipp.local-socket-timeout-msec - IPP read timeout in milliseconds on local CUPS. Default: ``9000``. * - cups.ipp.max-connections - Max number of IPP connections on CUPS. Default: ``10``. * - cups.ipp.exception.stacktrace - Set to ``Y`` (default) or ``N`` to enable/disable writing a call stack trace to the ``server.log`` if an exception is thrown that breaks the IPP CUPS connection. See :ref:`Logs `. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. _ch-install-on-linux-config-server-side-download: Server-side Download ~~~~~~~~~~~~~~~~~~~~ A Web Page or Document can be printed by a :ref:`Drag & Drop ` of its URL. In that case its content is server-side downloaded and rendered as PDF. .. list-table:: Server-side Download Configuration Properties :width: 100% :widths: 40 60 :header-rows: 1 * - Configuration property - Description * - download.connect-timeout-msec - Timeout in milliseconds until a connection is established. Default: ``4000``. * - download.socket-timeout-msec - Timeout in milliseconds to receive data from remote host after the connection is established, i.e. maximum time of inactivity between two data packets. Default: ``2000``. * - download.max-connections - Max number of download connections. Default: ``10``. * - download.max-connections-per-route - Max number of download connections per route (host) Default: ``2``. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. note:: Rendering a Web Page by a Drag & Drop of its URL might not give accurate results. .. _ch-install-on-linux-config-restful-client: RESTful Client ~~~~~~~~~~~~~~ When |PRODUCT_NAME| makes RESTful API calls to third-party servers, for instance in the :ref:`IPP Routing Plug-in `, these are the configuration properties to consider. .. list-table:: RESTful Client Configuration Properties :width: 100% :widths: 45 55 :header-rows: 1 * - Configuration property - Description * - restful.client.connect-timeout-msec - Timeout in milliseconds until a connection is established. Default: ``4000``. * - restful.client.read-timeout-msec - Timeout in milliseconds to receive data from remote host after the connection is established, i.e. maximum time of inactivity between two data packets. Default: ``2000``. * - restful.client.max-connections - Max number of RESTful client. Default: ``100``. * - restful.client.max-connections-per-route - Max number of RESTful client connections per route (host) Default: ``20``. * - restful.client.trust-self-signed - Trust self-signed certificate of RESTful servers: ``N`` (default) or ``Y``. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. _ch-install-on-linux-config-user-home-clean: User Home Clean ~~~~~~~~~~~~~~~ If :ref:`Document expiration time ` is enabled, any |PRODUCT_NAME| document older than the number of configured minutes is considered expired and will be automatically deleted in an active User Web App session. Moreover, when a user logs out and logs in again, expired documents will be auto-deleted. So, when a user does not log in for a long time, old documents will stay put in the user's home directory. These ignored documents take up unnecessary space. The same applies to PDF documents that exist long after their due date, because their deletion is triggered far too late (never) at :ref:`Fast Print ` or :ref:`Hold Print ` release. During :ref:`Daily Maintenance ` user home directories are scanned and ignored documents deleted. The result of the scan is shown in the :ref:`Admin Dashboard `. These are the configuration properties to consider: .. list-table:: User Home Clean Configuration Properties :width: 100% :widths: 35 65 :header-rows: 1 * - Configuration property - Description * - print-in.job-expiry-ignored.mins - Number of minutes added to print-in job expiry (if applicable) after which job is considered ignored. Ignored jobs are removed by :ref:`Daily Maintenance `. Default: ``10``. * - proxy-print.hold-ignored-mins - Number of minutes added to :ref:`Hold Print ` job expiry after which job is considered ignored. Ignored jobs are removed by :ref:`Daily Maintenance `. Default: ``10``. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. note:: User Home Clean is also executed at server start-up. You can disable this behavior in a separate :ref:`Server Setting `. .. _ch-install-on-linux-config-db-locking: Database Locking ~~~~~~~~~~~~~~~~ When using an :ref:`External Database `, table row locking is used to serialize access to individual user resources. Production grade databases like PostgreSQL should be able to handle row locking without problems. However, if you do suspect problems in this area, please contact |PRODUCT_NAME| support. In the meantime, you can disable row locking with the property below. .. list-table:: Database Locking Configuration Properties :width: 100% :widths: 50 50 :header-rows: 1 * - Configuration property - Description * - webapp.user.database-user-row-locking.enabled - Enable user table row locking in database to serialize access of a user to database or user home file system: ``Y`` (default) or ``N``. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. _ch-install-on-linux-config-pdftocairo: pdf2cairo Image Strategy ~~~~~~~~~~~~~~~~~~~~~~~~ |PRODUCT_NAME| uses ``pdftocairo`` to create PNG images from SafePages. On centos-release-7-7.1908.0.el7, pdftocairo 0.26.5 fails due to a bug. Therefore ``pdftocairo -v`` is executed at server start-up to determine the best way to create images. If version is 0.26.5 is encountered workaround statements are applied. This default probe strategy can be overwritten with this configuration property: .. list-table:: pdf2cairo Image Strategy Configuration Property :width: 100% :widths: 40 60 :header-rows: 1 * - Configuration property - Description * - system.host.cmd.pdftocairo.img.strategy - Strategy for executing ``pdftocairo`` command to create a PNG image. Values: - ``AUTO`` : use version probe to determine optimal command (default). - ``STREAM`` : use one (1) stdout/stdin stream command. - ``SPLIT`` : split action into separate commands. See |RST_LINK_CONFIG_EDITOR| on how to set these properties. .. _ch-install-on-linux-config-alt-file-locations: Alternative File Locations ~~~~~~~~~~~~~~~~~~~~~~~~~~ To separate files created at runtime from :ref:`installation files ` you can set alternative locations for temporary files, :ref:`SafePages `, public :ref:`Letterheads ` and :ref:`Document Store ` in the :ref:`server.properties ` file. .. caution:: All alternative file locations must reside on the same |image55| disk partition [4]_. .. list-table:: Alternative File Locations: server.properties :width: 100% :widths: 30 70 :header-rows: 1 * - Key - Description * - ``app.dir.tmp`` - |image55| Location of temporary files created by |PRODUCT_NAME|. It is created when the application starts and removed when stopped, so make sure it is exclusively used by the |PRODUCT_NAME| application. |br| |br| The location is not used by third-party Java components: they use ``java.io.tmpdir`` to store their own temporary files. |br| |br| Default: ``/opt/savapage/server/data/.tmp`` |br| |br| User ``savapage`` must have permission to create the location. * - ``app.dir.safepages`` - |image55| Location where the user's :ref:`SafePages ` are stored. |br| |br| Default: ``/opt/savapage/server/data/internal/safepages`` |br| |br| The location directory must be owned by user ``savapage`` and have permission ``700``. * - ``app.dir.letterheads`` - |image55| Location where the public :ref:`Letterheads ` are stored. |br| |br| Default: ``/opt/savapage/server/data/internal/letterheads`` |br| |br| The location directory must be owned by user ``savapage`` and have permission ``700``. * - ``app.dir.doc.store.archive`` - |image55| Location where the *Archive branch* of the :ref:`Document Store ` is stored. |br| |br| Default: ``/opt/savapage/server/data/doc-archive`` |br| |br| User ``savapage`` must have permission to create the location. * - ``app.dir.doc.store.journal`` - |image55| Location where the *Journal branch* of the :ref:`Document Store ` is stored. |br| |br| Default: ``/opt/savapage/server/data/doc-journal`` |br| |br| User ``savapage`` must have permission to create the location. .. [4] This constraint is needed because files are initially created in the temporary location and *atomically* moved to their destination. Atomic moves do *not* work cross-partition. .. _ch-install-on-linux-config-misc-settings: Miscellaneous Settings ~~~~~~~~~~~~~~~~~~~~~~ These are the extra settings that can be configured in the :ref:`server.properties ` file. .. list-table:: Miscellaneous Settings: server.properties :width: 100% :widths: 35 65 :header-rows: 1 * - Key - Description * - ``start.cleanup-doclog`` - Enable database cleanup at server start-up. See :ref:`Backups `. |br| |br| Values: ``true`` (default) or ``false``. * - ``start.cleanup-userhome`` - Enable :ref:`User Home Clean ` at server start-up. |br| |br| Values: ``true`` (default) or ``false``. * - ``system.cleanup-userhome.test`` .. _config-system-cleanup-userhome-test: - Put :ref:`User Home Clean ` in test mode: i.e. cleanable files are signaled on the :ref:`Admin Dashboard ` but not deleted. |br| |br| Values: ``false`` (default) or ``true``. * - ``webapp.custom.i18n`` - See `Custom i18n <#ch-custom-webapp-i18n>`. |br| |br| Values: ``true`` or ``false`` (default). .. _ch-install-on-linux-config-system-env: System Environment ~~~~~~~~~~~~~~~~~~ Instead of using :ref:`server.properties ` to configure |PRODUCT_NAME|, the same keys from the properties file can also be used as enviroment variables, as follows: .. code-block:: properties # Namespace as prefix for SavaPage envvar names (mandatory) SAVAPAGE_NS=SP_ # Required if run in Docker container SP_CONTAINER=DOCKER # Unique SP_SRV_* variables with server.properties key/value # separated by ':' like SP_SRV_n=key:value # For example: SP_SRV_1=visitor.organization:Acme Corporation SP_SRV_2=server.port:8080 SP_SRV_3=server.ssl.port:8443 # etc ... .. important:: Environment variables take precedence over those configured in :ref:`server.properties ` The environment is shown in the Admin Web App. See :ref:`Environment ` and :ref:`Status `. .. |image55| image:: ../images/manual/famfamfam-silk_drive-16x11.png :width: 16px