<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Stroom – proxy</title>
    <link>/tags/proxy/</link>
    <description>Recent content in proxy on Stroom</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Tue, 24 Feb 2026 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="/tags/proxy/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Stroom Proxy Installation</title>
      <link>/docs/proxy/stroom-7-proxy-installation/</link>
      <pubDate>Fri, 20 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>/docs/proxy/stroom-7-proxy-installation/</guid>
      <description>
        
        
        &lt;p&gt;Stroom-Proxy can be installed in 4 main ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;App - There is an &lt;em&gt;app&lt;/em&gt; version that runs Stroom-Proxy as a Java &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/j/glossary-jar&#34;&gt;
      &lt;span&gt;JAR&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;JAR&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;strong&gt;J&lt;/strong&gt;ava &lt;strong&gt;Ar&lt;/strong&gt;chive is a file format for distributing Java class files, associated metadata and resource files. It is a compressed archive based on the {{&amp;lt; glossary &amp;ldquo;ZIP&amp;rdquo; &amp;gt;}} format, so can be inspected with any tool capable of reading a ZIP file. Stroom and Stroom-Proxy are distributed as JAR files.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; file locally on the server and has settings contained in a configuration file that controls access to the stroom server and database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Stack - Stroom-Proxy, Nginx and Stroom-Log-Sender run in Docker containers, orchestrated using Docker Compose and some shell scripts.
The stroom-proxy image is essentially a minimal Alpine Linux container with the appropriate Java version installed and the Stroom-Proxy JAR contained within it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Images - Manually run containers based on the Stroom-Proxy docker image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes - Deploy Stroom-Proxy into a Kubernetes cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The document will cover the installation and configuration of the Stroom-Proxy software for both the &amp;lsquo;app&amp;rsquo; and Docker stack deployments.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;


    &lt;p&gt;Older versions of Stroom-Proxy &amp;lsquo;sent&amp;rsquo; data to Stroom by being co-located with Stroom and using a shared repository location.
Stroom-Proxy would write to the repository and Stroom would retrieve data from there.&lt;/p&gt;
&lt;p&gt;This method is no longer used.
Current versions of Stroom-Proxy forward data to Stroom over HTTP so do not need to be co-located with Stroom.&lt;/p&gt;


&lt;/div&gt;


&lt;h2 id=&#34;typical-deployments&#34;&gt;Typical Deployments&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy is typically deployed in front of Stroom to act as a proxy for data receipt into Stroom.
This abstracts Stroom from the clients sending the data and ensures that received data is aggregated into sensibly sized streams.&lt;/p&gt;
&lt;p&gt;For a production Stroom cluster, it is likely that you will want multiple Stroom-Proxy instances behind a load balancer for resiliency and load management.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;


    &lt;p&gt;Stroom-Proxy instances are independent and cannot form a coherent cluster.
If you have a &amp;lsquo;cluster&amp;rsquo; of Stroom-Proxy instances for resilience, each Stroom-Proxy instance can only work with the data it has received and loss of an instance means the loss of any data it was in the process of aggregating.&lt;/p&gt;
&lt;p&gt;Also if you have a large &amp;lsquo;cluster&amp;rsquo; of Stroom-Proxy instances, this can have an impact on aggregation as data for the same aggregation key (Feed and Stream Type) will be spread over multiple instances and thus aggregates.
For low volume Feeds, this can mean smaller aggregates than is preferred.&lt;/p&gt;
&lt;p&gt;To mitigate against this, you can use sticky sessions when load balancing or ideally use a load balancer that allows selection of the upstream instance using HTTP headers, i.e. &lt;code&gt;Feed&lt;/code&gt;.&lt;/p&gt;


&lt;/div&gt;


&lt;h2 id=&#34;assumptions&#34;&gt;Assumptions&lt;/h2&gt;
&lt;p&gt;The following assumptions are used in this document.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user has reasonable RHEL/CentOS/Rocky System administration skills.&lt;/li&gt;
&lt;li&gt;Installation is on a fully patched minimal RHEL/CentOS/Rocky instance.&lt;/li&gt;
&lt;li&gt;The application user &lt;code&gt;stroomuser&lt;/code&gt; has been created in the OS.&lt;/li&gt;
&lt;li&gt;The user has set up the Stroom processing user as described &lt;a href=&#34;../../docs/howtos/install/installprocessingusersetuphowto/&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The prerequisite software has been installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;firewall-configuration&#34;&gt;Firewall Configuration&lt;/h2&gt;
&lt;p&gt;For both methods of deployment, the ports used are as follows:
Some may need to be opened to allow access to the ports from outside the host.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;80&lt;/code&gt; - Nginx listens on port &lt;code&gt;80&lt;/code&gt; but redirects onto &lt;code&gt;443&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;443&lt;/code&gt;  - Nginx listens on port &lt;code&gt;443&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;8090&lt;/code&gt; - Stroom-Proxy listens on port &lt;code&gt;8090&lt;/code&gt; for its main public APIs (&lt;code&gt;/datafeed&lt;/code&gt;, REST endpoints, etc).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;8091&lt;/code&gt; - Stroom-Proxy listens on port &lt;code&gt;8091&lt;/code&gt; for its administration APIs.
Access to this port should probably be carefully controlled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is therefore likely that you will only want to expose &lt;code&gt;443&lt;/code&gt; and maybe &lt;code&gt;80&lt;/code&gt; to other hosts.&lt;/p&gt;
&lt;p&gt;For example on a RHEL/CentOS server using &lt;code&gt;firewalld&lt;/code&gt; the commands would be as &lt;code&gt;root&lt;/code&gt; user:&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;root&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --zone=public --permanent --add-port=443/tcp
firewall-cmd --reload&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&#34;stroom-proxy-docker-version&#34;&gt;Stroom Proxy (docker version)&lt;/h2&gt;
&lt;p&gt;The build of a stroom proxy where the Stroom-Proxy Java application (and associated services) are running in docker containers.&lt;/p&gt;
&lt;p&gt;Because everything is running in Docker containers, the only requirement for the host is for the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Engine&lt;/li&gt;
&lt;li&gt;Docker Compose Plugin&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bash&lt;/code&gt; v4 or greater - Used by the stack scripts.&lt;/li&gt;
&lt;li&gt;GNU &lt;code&gt;coreutils&lt;/code&gt; - Used by the stack scripts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jq&lt;/code&gt; - Used by the stack scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;download-and-install-docker&#34;&gt;Download and install docker&lt;/h3&gt;
&lt;p&gt;To install Docker Engine and the Docker Composer Plugin see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://docs.docker.com/engine/install&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;Docker Engine (external link to https://docs.docker.com/engine/install)&#34;&gt;
    &lt;span&gt;Docker Engine&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://docs.docker.com/compose/install&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;Docker Compose Plugin (external link to https://docs.docker.com/compose/install)&#34;&gt;
    &lt;span&gt;Docker Compose Plugin&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All the Stroom-Proxy logs and data will be stored in Docker managed volumes that will, by default, reside in &lt;code&gt;/var/lib/docker&lt;/code&gt;.
It is typical that this directory will be on small mount point for the OS.
It is therefore recommended to relocate this directory to a mount with more space and sufficient resilience, i.e. RAID mirroring.&lt;/p&gt;
&lt;p&gt;To do this you need to follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop the Docker engine.&lt;/li&gt;
&lt;li&gt;Move the directory to its new location.&lt;/li&gt;
&lt;li&gt;Edit the file &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; and ensure this field is present with the new location as the value.
&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
  &amp;quot;data-root&amp;quot;: &amp;quot;/path/to/new/location&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Start the Docker engine.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;download-and-install-docker-stack&#34;&gt;Download and Install Docker Stack&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;stroom_proxy&lt;/em&gt; Docker stack is available from &lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://github.com/gchq/stroom-resources/releases&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;stroom-resources releases (external link to https://github.com/gchq/stroom-resources/releases)&#34;&gt;
    &lt;span&gt;stroom-resources releases&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
 on GitHub.
The stack distribution is simply a collection of shell scripts and Docker Compose configuration files.
The Docker images will get pulled down from DockerHub when the stack is started.&lt;/p&gt;
&lt;p&gt;The installation example below is for stroom version 7.10.20 - but is applicable to other stroom v7 versions.
As a suitable stroom user e.g. &lt;code&gt;stroomuser&lt;/code&gt; - download and unpack the stroom software.&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p ~/stroom-proxy
cd ~/stroom-proxy
wget https://github.com/gchq/stroom-resources/releases/download/stroom-stacks-v7.10.20/stroom_proxy-v7.10.20.tar.gz
tar -zxf stroom_proxy-v7.10.20.tar.gz
cd stroom_proxy-v7.10.20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;For a stroom proxy, the configuration file &lt;code&gt;stroom_proxy/stroom_proxy-v7.10.20/stroom_proxy.env&lt;/code&gt; needs to be edited, with the connection details of the stroom server that data files will be sent to.
The default network port for connection to the stroom server is 8080.&lt;/p&gt;
&lt;p&gt;The values that need to be set are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;STROOM_PROXY_REMOTE_FEED_STATUS_API_KEY  
STROOM_PROXY_REMOTE_FEED_STATUS_URL  
STROOM_PROXY_REMOTE_FORWARD_URL  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &amp;lsquo;API key&amp;rsquo; is generated on the stroom server and is related to a specific user e.g. proxyServiceUser.
The 2 URL values also refer to the stroom server and can be a fully qualified domain name (fqdn) or the IP Address.&lt;/p&gt;
&lt;p&gt;e.g. if the stroom server was - stroom-serve.somewhere.co.uk - the URL lines would be:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;export STROOM_PROXY_REMOTE_FEED_STATUS_URL=&amp;quot;http://stroom-serve.somewhere.co.uk:8080/api/feedStatus/v1&amp;quot;
export STROOM_PROXY_REMOTE_FORWARD_URL=&amp;quot;http://stroom-serve.somewhere.co.uk:8080/stroom/datafeed&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;to-start-stroom-proxy&#34;&gt;To Start Stroom Proxy&lt;/h3&gt;
&lt;p&gt;As the stroom user, run the &amp;lsquo;start.sh&amp;rsquo; script found in the stroom install:&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cd ~/stroom_proxy/stroom_proxy-v7.10.20/
./start.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The first time the script is run it will download the docker images from DockerHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stroom-proxy-remote&lt;/li&gt;
&lt;li&gt;stroom-log-sender&lt;/li&gt;
&lt;li&gt;stroom-nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the script has completed the Stroom-Proxy server should be running.&lt;/p&gt;
&lt;p&gt;The stack directory contains the following scripts for managing the Stroom-Proxy stack.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;health.sh&lt;/code&gt; - Tests and displays the health of the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info.sh*&lt;/code&gt; - Displays info about the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pull_images.sh&lt;/code&gt; - Pulls all the docker images used in the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logs.sh&lt;/code&gt; - Tails the logs from all services in the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove.sh&lt;/code&gt; - Removes all services and volumes in the stack.
&lt;strong&gt;Warning&lt;/strong&gt;: this will delete any data held in Stroom-Proxy.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restart.sh&lt;/code&gt; - Restarts all or named services it the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;send_data.sh&lt;/code&gt; - Script to aid POSTing data into Stroom-Proxy.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set_log_levels.sh&lt;/code&gt; - Sets log levels for classes/packages on the running Stroom-Proxy.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set_services.sh&lt;/code&gt; - Used for disabling services in the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show_config.sh&lt;/code&gt; - Displays the effective docker compose config taking the env file into account.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start.sh&lt;/code&gt; - Starts all or named services it the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status.sh&lt;/code&gt; - Shows the status of the services in the stack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop.sh&lt;/code&gt; - Stops all or named services it the stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;stroom-proxy-app-version&#34;&gt;Stroom Proxy (app version)&lt;/h2&gt;
&lt;p&gt;This is the bare bones installation method that requires installing everything manually.
If you are able to use Docker we recommend doing this as there are less things to install and configure, e.g. nginx, send_to_stroom.sh, cron, etc.&lt;/p&gt;
&lt;p&gt;Stroom-Proxy is distributed as a (&lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/j/glossary-jar&#34;&gt;
      &lt;span&gt;JAR&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;JAR&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;strong&gt;J&lt;/strong&gt;ava &lt;strong&gt;Ar&lt;/strong&gt;chive is a file format for distributing Java class files, associated metadata and resource files. It is a compressed archive based on the {{&amp;lt; glossary &amp;ldquo;ZIP&amp;rdquo; &amp;gt;}} format, so can be inspected with any tool capable of reading a ZIP file. Stroom and Stroom-Proxy are distributed as JAR files.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;) file so this method will run this JAR using the &lt;code&gt;java&lt;/code&gt; executable.&lt;/p&gt;
&lt;p&gt;The pre-requisites for this deployment are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RHEL/CentOS/Rocky&lt;/li&gt;
&lt;li&gt;Java 25+ JDK (JDK is preferred over JRE as it provides additional tools (e.g. &lt;code&gt;jmap&lt;/code&gt;) for capturing heap histogram statistics).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bash&lt;/code&gt; v4 or greater - Used by the helper scripts.&lt;/li&gt;
&lt;li&gt;GNU &lt;code&gt;coreutils&lt;/code&gt; - Used by the helper scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For details about which Java distribution and version to use, and how to install it, see &lt;a href=&#34;../../docs/install-guide/java/&#34;&gt;Java&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;


    Disable &lt;em&gt;selinux&lt;/em&gt; to avoid issues with access and file permissions.

&lt;/div&gt;


&lt;h3 id=&#34;download-and-install-stroom-v7-app-version&#34;&gt;Download and install Stroom v7 (app version)&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy releases are available from &lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://github.com/gchq/stroom/releases&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;github.com/gchq/stroom/releases (external link to https://github.com/gchq/stroom/releases)&#34;&gt;
    &lt;span&gt;github.com/gchq/stroom/releases&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
.
Each release has a number of artefacts, the Stroom-Proxy application is &lt;code&gt;stroom-proxy-app-v*.zip&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The installation example below is for stroom version v7.10.20, but is applicable to other stroom v7 versions.
As a suitable stroom user e.g. stroomuser - download and unpack the stroom software.&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;wget https://github.com/gchq/stroom/releases/download/v7.10.20/stroom-proxy-app-v7.10.20.zip
unzip stroom-proxy-app-v7.10.20.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The configuration file – &lt;code&gt;stroom-proxy/config/config.yml&lt;/code&gt; – is the principal file that controls the configuration of Stroom-Proxy.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/&#34;&gt;Stroom Proxy Configuration&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Proxy Functions</title>
      <link>/docs/proxy/proxy-functions/</link>
      <pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/proxy/proxy-functions/</guid>
      <description>
        
        
        &lt;h2 id=&#34;data-receipt&#34;&gt;Data Receipt&lt;/h2&gt;
&lt;h3 id=&#34;data-feed-api&#34;&gt;Data Feed API&lt;/h3&gt;
&lt;p&gt;This is Stroom-Proxy&amp;rsquo;s traditional API for receiving data and Stroom shares the same API.
See &lt;a href=&#34;../../docs/proxy/proxy-api/#datafeed&#34;&gt;&lt;code&gt;/datafeed&lt;/code&gt;&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h3 id=&#34;event-store-api&#34;&gt;Event Store API&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy presents an alternative HTTP &lt;code&gt;POST&lt;/code&gt; API at &lt;a href=&#34;../../docs/proxy/proxy-functions/&#34;&gt;&lt;code&gt;/api/event&lt;/code&gt;&lt;/a&gt; to receive individual events.
If the Stroom-Proxy instances are sufficiently resilient then client systems can use this API to send events directly without needing to buffer them locally.
It must only be used for sending a single event, not a batch of events.&lt;/p&gt;
&lt;p&gt;The HTTP headers &lt;code&gt;Feed&lt;/code&gt; and &lt;code&gt;Type&lt;/code&gt; are used to provide the Feed and Stream Type, which are used as the compound aggregation key.
The request content is assumed to be &lt;em&gt;UTF-8&lt;/em&gt; encoded text data but can be in any format, e.g. &lt;code&gt;XML&lt;/code&gt;, &lt;code&gt;JSON&lt;/code&gt;, &lt;code&gt;CSV&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Stroom-Proxy will convert each request into the following JSON object and aggregate them by &lt;code&gt;Feed&lt;/code&gt; and Stream &lt;code&gt;Type&lt;/code&gt; in the Event Store, with one file per key.
The JSON combines the receipt information, the HTTP headers and the event data into one structured object that can be processed and transformed by Stroom.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
  &amp;quot;version&amp;quot;: 0,
  &amp;quot;event-id&amp;quot;: &amp;quot;1771956627189_0001_P_test-proxy&amp;quot;,
  &amp;quot;proxy-id&amp;quot;: &amp;quot;test-proxy&amp;quot;,
  &amp;quot;feed&amp;quot;: &amp;quot;FEED_X&amp;quot;,
  &amp;quot;type&amp;quot;: &amp;quot;Raw Events&amp;quot;,
  &amp;quot;receive-time&amp;quot;: &amp;quot;2026-02-24T18:10:27.192Z&amp;quot;,
  &amp;quot;headers&amp;quot;: [
    { &amp;quot;name&amp;quot;: &amp;quot;Feed&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;FEED_X&amp;quot; },
    { &amp;quot;name&amp;quot;: &amp;quot;Type&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;Raw Events&amp;quot; }
  ],
  &amp;quot;detail&amp;quot;: &amp;quot;this\nis some data \n with new \n\n lines&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;version&lt;/code&gt; - The version of the Event structure, currently &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event-id&lt;/code&gt; - A unique ID for the event.
This uses the &lt;a href=&#34;../../docs/proxy/receipt-id/&#34;&gt;Receipt ID&lt;/a&gt; which is a unique identifier for the event.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy-id&lt;/code&gt; - The unique identity for the Stroom-Proxy instance within the estate.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feed&lt;/code&gt; - The Feed the event is destined for, taken from the &lt;code&gt;Feed&lt;/code&gt; HTTP header.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; - The Stream Type the event is destined for, taken from the &lt;code&gt;Type&lt;/code&gt; HTTP header.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;receive-time&lt;/code&gt; - The ISO-8601 timestamp taken when the event was received.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;headers&lt;/code&gt; - A list of the meta attributes extracted from the HTTP headers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;detail&lt;/code&gt; - The event payload, i.e. the HTTP request content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each event is written as one line in the aggregated file, delimited by a Line Feed (&lt;code&gt;\n&lt;/code&gt;).
A file containing one JSON object per line is typically referred to as &lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://jsonlines.org&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;JSON Lines Format (external link to https://jsonlines.org)&#34;&gt;
    &lt;span&gt;JSON Lines Format&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
.
This format is mean easier to parse than a single JSON object containing many events.&lt;/p&gt;
&lt;p&gt;If Stroom-Proxy is configured for &lt;a href=&#34;#aggregation&#34;&gt;aggregation&lt;/a&gt; then the Event Store essentially adds another layer of aggregation in front of Stroom-Proxy&amp;rsquo;s standard aggregation.
The Event Store aggregation is configured separately to the standard aggregation.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/#event-store-configuration&#34;&gt;Event Store Configuration&lt;/a&gt; for details on how to configure the Event Store and the aggregation thresholds.&lt;/p&gt;
&lt;p&gt;Once a file of one or more individual event objects has met its aggregation thresholds it will be processed in the same way as data arriving via &lt;code&gt;/datafeed&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;authentication&#34;&gt;Authentication&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;/api/event&lt;/code&gt; differs from the other &lt;code&gt;/api/...&lt;/code&gt; &lt;a href=&#34;../../docs/proxy/proxy-api/#rest-api&#34;&gt;REST endpoints&lt;/a&gt; in how requests are authenticated.
It does not use the same authentication as the other endpoints.&lt;/p&gt;
&lt;p&gt;Its authentication is performed in the same way as &lt;code&gt;/datafeed&lt;/code&gt; and is configured using &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#receive-configuration&#34;&gt;Event Store Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;aws-simple-queue-service-connector&#34;&gt;AWS Simple Queue Service Connector&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy Supports receiving individual events from one or more AWS Simple Queue Service queues.
Each event received is treated in the same way as event received via the &lt;a href=&#34;#event-store-api&#34;&gt;Event Store API&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;receipt-filtering&#34;&gt;Receipt Filtering&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy can be configured a number of different methods of data receipt filtering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FEED_STATUS&lt;/code&gt; - Data is filtered based on the &lt;em&gt;Status&lt;/em&gt; of the Feed in Stroom.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RECEIPT_POLICY&lt;/code&gt; - Data is filtered based on a set of policy rules that have been created in Stroom.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RECEIVE_ALL&lt;/code&gt; - All data is accepted, regardless.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DROP_ALL&lt;/code&gt; - All data is silently dropped.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REJECT_ALL&lt;/code&gt; - All data is rejected with an error.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;splitting&#34;&gt;Splitting&lt;/h2&gt;
&lt;p&gt;When ZIP data is received in &lt;a href=&#34;../../docs/sending-data/payloads/#stroom-zip-format&#34;&gt;Stroom ZIP Format&lt;/a&gt; it will be examined to determine if it contains multiple &lt;em&gt;groups&lt;/em&gt; (where a group is identified by Feed and Stream Type).
ZIP data with multiple groups will be split so that data for each group will be processed separately.&lt;/p&gt;
&lt;h2 id=&#34;aggregation&#34;&gt;Aggregation&lt;/h2&gt;
&lt;p&gt;If enabled, the aggregation function will locally store the received data and aggregate data from multiple HTTP requests together until the aggregation threshold is reached.
Data will be aggregated by common group key (Feed and Stream Type).&lt;/p&gt;
&lt;p&gt;Aggregation can be limited by one or more of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Item count - The number of items in the aggregate.&lt;/li&gt;
&lt;li&gt;Maximum uncompressed size - The total uncompressed size of the aggregate.
Note, this is a target as Stroom-Proxy may received a single item of data that is larger than this limit.&lt;/li&gt;
&lt;li&gt;Frequency - How often data is assembled into a completed aggregate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;forwarding&#34;&gt;Forwarding&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy can forward data to one or more destinations and the following destination types are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File - The data (in ZIP format) is written to a configured directory.&lt;/li&gt;
&lt;li&gt;HTTP - The data (in ZIP format) is POSTed to a configured URL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If multiple destinations are configured, the ZIP to be forwarded will be copied to each of the forward destination input queues.
This means the failure to send to one destination has no impact on sending to the other destinations.&lt;/p&gt;
&lt;p&gt;Forwarding is configured using &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/#forward-configuration&#34;&gt;Forward Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For details of the directories used in forwarding, see &lt;a href=&#34;../../docs/proxy/architecture/#40_forwarding_input_queue&#34;&gt;&lt;code&gt;/40_forwarding_input_queue/&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;../../docs/proxy/architecture/#50_forwarding&#34;&gt;&lt;code&gt;/50_forwarding/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;instant-forwarding&#34;&gt;Instant Forwarding&lt;/h3&gt;
&lt;p&gt;This is a special type of forwarding that means data is streamed directly to a destination rather than being written to local disk first.
The instant forwarding is only possible if there is only &lt;strong&gt;one&lt;/strong&gt; forwarding destination configured.
Data will still be subject to the configured receipt filtering.&lt;/p&gt;
&lt;p&gt;Instant forwarding is enabled by setting &lt;code&gt;instant&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; on the forward destination configuration branch.&lt;/p&gt;
&lt;h3 id=&#34;forward-failure-handling&#34;&gt;Forward Failure Handling&lt;/h3&gt;
&lt;p&gt;When there is a failure to forward a ZIP, Stroom-Proxy will move it to one of two places:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Retry Queue&lt;/dt&gt;
&lt;dd&gt;If the reason for the failure is considered a recoverable one, e.g. the HTTP destination is down, it will move the ZIP onto the retry queue.
&lt;p&gt;The retry behaviour is configured using &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/#queue-configuration&#34;&gt;Queue Configuration&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Failure Directory&lt;/dt&gt;
&lt;dd&gt;If the failure is deemed unrecoverable, the ZIP will be moved to the &lt;code&gt;03_failure&lt;/code&gt; sub directory within the forward destination directory.
At this point the ZIP file is no longer under the control of Stroom-Proxy and will have to be dealt with manually by the administrator.
&lt;p&gt;If the reason for the failure is addressed it is possible to re-process the failed data by moving it into a directory that is configured for &lt;a href=&#34;#directory-scanning&#34;&gt;Directory Scanning&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2 id=&#34;directory-scanning&#34;&gt;Directory Scanning&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy can periodically scan one or more directories to look for ZIP files to ingest.
Any ZIP files found will be treated as if they were received via the &lt;code&gt;/datafeed&lt;/code&gt; API.
The scanning will recurse into any directories found.&lt;/p&gt;
&lt;p&gt;This feature is primarily aimed at re-processing data that Stroom-Proxy has been unable to forward due to an un-recoverable error or too many retries.
This mechanism can also be used as an additional means of passing data into Stroom-Proxy (instead of via &lt;code&gt;/datafeed&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;
&lt;p&gt;A typical case scenario is that some data has failed to send to Stroom and the retry age has been reached so the ZIP has been moved to the forward failure directory:&lt;/p&gt;
&lt;p&gt;Contents of &lt;code&gt;data/50_forwarding/downstream/&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;./03_failure/20251014/BAD_FEED/0/001/proxy.zip
./03_failure/20251014/BAD_FEED/0/001/proxy.meta
./03_failure/20251014/BAD_FEED/0/001/error.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you wish to re-send this ZIP you can do the following:&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mv data/50_forwarding/downstream/03_failure/20251014/BAD_FEED/0/001 &amp;#34;./zip_file_ingest/${uuidgen)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This will move the &lt;code&gt;001&lt;/code&gt; directory into &lt;code&gt;zip_file_ingest/&lt;/code&gt;, renaming it to a unique &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/u/glossary-uuid&#34;&gt;
      &lt;span&gt;UUID&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;UUID&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A &lt;strong&gt;U&lt;/strong&gt;niversally &lt;strong&gt;U&lt;/strong&gt;nique &lt;strong&gt;Id&lt;/strong&gt;entifier for uniquely identifying something. &lt;em&gt;UUIDs&lt;/em&gt; are used as the identifier in &lt;em&gt;Doc Refs&lt;/em&gt;. An example of a &lt;em&gt;UUID&lt;/em&gt; is &lt;code&gt;4ffeb895-53c9-40d6-bf33-3ef025401ad3&lt;/code&gt;.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to ensure it doesn&amp;rsquo;t clash with any existing files/directories.
The name of this directory in the ingest directory has no bearing on processing, other than the order in which directories are scanned.&lt;/p&gt;
&lt;p&gt;On the next scan, Stroom-Proxy will discover the &lt;code&gt;proxy.zip&lt;/code&gt; file.
It will check for the presence of any of the optional associated side-car files (i.e. &lt;code&gt;proxy.meta&lt;/code&gt; and &lt;code&gt;error.log&lt;/code&gt;).
The entries in the &lt;code&gt;.meta&lt;/code&gt; file will be consumed.
The &lt;code&gt;error.log&lt;/code&gt; file will be deleted following successful ingest.&lt;/p&gt;
&lt;p&gt;Stroom-Proxy will scan into all sub-directories within the ingest directory, regardless of depth.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;.meta&lt;/code&gt; sidecar file is optional, but if provided will be used to provide meta values equivalent to HTTP headers when sending to &lt;code&gt;/datafeed&lt;/code&gt;.
For a &lt;code&gt;.meta&lt;/code&gt; file to be consumed, it must have the same base-name as the ZIP file, e.g. &lt;code&gt;data.zip&lt;/code&gt; and &lt;code&gt;data.meta&lt;/code&gt;, and be in the same directory as the ZIP file.&lt;/p&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;

    &lt;p&gt;Stroom-Proxy may be scanning at the same time as you are moving files in to the &lt;code&gt;zip_file_ingest&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;Therefore, it is important that if you are supplying sidecar files that you move a parent directory rather than the files themselves (as is shown in the above &lt;code&gt;mv&lt;/code&gt; example).
This will ensure that the move happens atomically, so all files will be visible to the scanner.&lt;/p&gt;


&lt;/div&gt;



      </description>
    </item>
    
    <item>
      <title>Docs: Proxy Architecture</title>
      <link>/docs/proxy/architecture/</link>
      <pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>/docs/proxy/architecture/</guid>
      <description>
        
        
        &lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy has a number of moving parts and it can be configured in a variety of ways.
This document aims to describe some typical configurations of Stroom-Proxy.&lt;/p&gt;
&lt;h3 id=&#34;directories-as-queues&#34;&gt;Directories as Queues&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy makes heavy use of multiple file system directories as work queues.
These queues act as the interface between the different processing steps in Stroom-Proxy.&lt;/p&gt;
&lt;p&gt;Data representing one queue item is placed into a directory.
That directory is atomically moved into a queue directory with a new name to represent its position in the queue.
The directory is consumed from the directory queue by atomically moving it to a different path, typically this will be a numbered directory that acts as a staging area where it can be worked on before moving it to a different directory queue.&lt;/p&gt;
&lt;p&gt;These sub-directories are placed in a path structure that indicates the position in the queue, e.g.:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;./50_forwarding/downstream/02_retry/2/012/345/012345678
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the above example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./50_forwarding/downstream/02_retry&lt;/code&gt; represents the base directory of the queue.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/2/&lt;/code&gt; represents the depth of the directory tree, i.e. the queue item has two sub-directories above it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/012/&lt;/code&gt; is a sub-directory containing items 12,000,000 to 12,999,999.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/345/&lt;/code&gt; is a sub-directory containing items 12,345,000 to 12,345,999.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/012345678/&lt;/code&gt; is the queue item containing the data to be processed.
The number is the position in the queue and the number of digits is always left padded with zeros to be a multiple of three.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This structure ensures that there are never more than 999 items in each directory and the head/tail of the queue can be found quickly.&lt;/p&gt;
&lt;h3 id=&#34;numbered-directories&#34;&gt;Numbered Directories&lt;/h3&gt;
&lt;p&gt;Typically between each queue is a numbered directory that acts as a staging area to work on the data.
Numbered directories are sequentially numbered directories that all exist in a single parent directory.
They are expected to be transient in nature, i.e. only existing until they can be move to another queue.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;01_receiving_simple&lt;/code&gt; contains numbered directories and each one is used to stage non-ZIP data that has been received into proxy:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;./01_receiving_simple/0000001407/
./01_receiving_simple/0000001408/
./01_receiving_simple/0000001409/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each directory represents data for a single request into Stroom Proxy.
Once the data has been successfully written to one of these directories, the directory will be atomically moved to one of the directory queues, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;./01_receiving_simple/0000001407/ =&amp;gt; 20_pre_aggregate_input_queue/0/382/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The directory then becomes the responsibility of the queue directory it was moved into.&lt;/p&gt;
&lt;h3 id=&#34;directory-structure&#34;&gt;Directory Structure&lt;/h3&gt;
&lt;p&gt;The following is a list of the directories used by Stroom-Proxy in its data directory (as configured by &lt;code&gt;proxyConfig.path.data&lt;/code&gt;).&lt;/p&gt;
&lt;!-- Use `tree -F --charset=ascii` to generate this --&gt;
&lt;pre&gt;&lt;code class=&#34;language-treeview&#34;&gt;|-- 01_receiving_simple/
|-- 01_receiving_zip/
|-- 02_split_zip_input_queue/
|-- 03_split_zip_splits/
|-- 20_pre_aggregate_input_queue/
|-- 21_pre_aggregates/
|-- 22_splitting/
|-- 23_split_output/
|-- 30_aggregate_input_queue/
|-- 31_aggregates/
|-- 40_forwarding_input_queue/
|-- 50_forwarding/
|   |-- &amp;lt;destination name 1&amp;gt;/
|   |   |-- 01_forward/
|   |   |-- 02_retry/
|   |   `-- 03_failure/
|   `-- &amp;lt;destination name 2&amp;gt;/
|       |-- 01_forward/
|       |-- 02_retry/
|       `-- 03_failure/
|-- 99_deleting/
|-- event/
`-- temp_forward_copies/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following diagram illustrates how data flows between the various queues and numbered directories.&lt;/p&gt;







  
  
  
  
  







  
  



&lt;div class=&#34;card rounded shadow-stroom p-2 td-post-card mb-4 mt-4&#34; style=&#34;max-width: 810px&#34;&gt;

  &lt;a title=&#34;images/proxy/architecture.puml.svg&#34; href=&#34;../../images/proxy/architecture.puml.svg&#34;&gt;
    &lt;figure style=&#34;margin-block-end: 0px&#34; &gt;
      
      &lt;img class=&#34;card-img-top&#34; src=&#34;../../images/proxy/architecture.puml.svg&#34; style=&#34;max-width:800&#34; alt=&#34;images/proxy/architecture.puml.svg&#34;&gt;
      

      
    &lt;/figure&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;h4 id=&#34;01_receiving_simple&#34;&gt;&lt;code&gt;/01_receiving_simple/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;This directory is the reception for area for data that is NOT a &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/z/glossary-zip&#34;&gt;
      &lt;span&gt;ZIP&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;ZIP&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A compressed file format for storing a one or more files with an associated directory structure. Stroom and Stroom Proxy use the ZIP format for exporting content and data as well as its Proxy ZIP format for holding multiple streams of data with associated meta data.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; file, i.e. uncompressed or &lt;code&gt;gzip&lt;/code&gt; compressed data.
It contains numbered directories.&lt;/p&gt;
&lt;p&gt;Data will be written to this directory before the client receives the HTTP response.&lt;/p&gt;
&lt;p&gt;Each numbered directory will contain two files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/01_receiving_simple/0000002034/0000000001.meta&lt;/code&gt; - The meta sidecar file containing the HTTP headers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/01_receiving_simple/0000002034/0000000001.dat&lt;/code&gt; - The file containing the received payload data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The filenames are always the same as it is only dealing with a single stream.&lt;/p&gt;
&lt;h4 id=&#34;02_receiving_zip&#34;&gt;&lt;code&gt;/02_receiving_zip/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;This directory is the reception for area for data that has been received as a &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/z/glossary-zip&#34;&gt;
      &lt;span&gt;ZIP&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;ZIP&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A compressed file format for storing a one or more files with an associated directory structure. Stroom and Stroom Proxy use the ZIP format for exporting content and data as well as its Proxy ZIP format for holding multiple streams of data with associated meta data.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; file which may contain one or more streams of data and associated metadata.
It contains numbered directories.&lt;/p&gt;
&lt;p&gt;Received ZIP files will be written to a numbered sub-directory in this directory before the client receives the HTTP response.&lt;/p&gt;
&lt;p&gt;All &lt;code&gt;.meta&lt;/code&gt; files in the ZIP file will be updated to add the HTTP headers from the request.
In order to do this, Stroom Proxy will first write the ZIP as a &lt;code&gt;.zip.staging&lt;/code&gt; file.
It will clone all the ZIP entries in this file into a &lt;code&gt;.zip&lt;/code&gt; file, updating the &lt;code&gt;.meta&lt;/code&gt; entries as it goes.
The &lt;code&gt;.zip.staging&lt;/code&gt; file will be deleted once complete.&lt;/p&gt;
&lt;p&gt;The ZIP entries will be scanned and all valid entries will be written to a &lt;code&gt;.entries&lt;/code&gt; sidecar file for subsequent processes to use.
This &lt;code&gt;.entries&lt;/code&gt; file defines the entries in the ZIP that are valid for further processing and allows subsequent processing to use this file as a reference rather than having to re-scan the ZIP.&lt;/p&gt;
&lt;p&gt;The scanning process will also establish how many groups are in the ZIP.
A group is defined as a combination of the &lt;em&gt;Feed&lt;/em&gt; and the &lt;em&gt;Stream Type&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If the ZIP contains more than one group or the ZIP does not adhere to the correct [Stroom ZIP Format](/docs/sending-data/payloads/#stroom-zip-format, the directory will be moved to &lt;code&gt;/02_split_zip_input_queue/&lt;/code&gt; for splitting.&lt;/p&gt;
&lt;p&gt;If the ZIP has a valid format and only contains one group, it will either be moved to the &lt;code&gt;20_pre_aggregate_input_queue&lt;/code&gt; queue, if aggregation is enabled, or &lt;code&gt;40_forwarding_input_queue&lt;/code&gt; queue if not.&lt;/p&gt;
&lt;h4 id=&#34;02_split_zip_input_queue&#34;&gt;&lt;code&gt;/02_split_zip_input_queue/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Each directory placed into this directory queue will contain a ZIP file and a &lt;code&gt;.entries&lt;/code&gt; file.
The ZIP may be in an invalid format, in which case a new ZIP will be created with the correct entry naming and structure.
This is to ensure that all ZIP files received downstream are in a consistent format.
Alternatively it will contain more than one group, so will need to be split into one ZIP file per group.&lt;/p&gt;
&lt;p&gt;A numbered directory will be created in &lt;code&gt;/03_split_zip_splits/&lt;/code&gt; to hold each split.
For each group of entries in a split, it will create a sub-directory named after the group in the numbered directory, e.g. for two splits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_X__raw_events/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_X__raw_events/proxy.entries&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_X__raw_events/proxy.meta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_Y__raw_events/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_Y__raw_events/proxy.entries&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/03_split_zip_splits/0000000392/FEED_Y__raw_events/proxy.meta&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the splitting is complete, each split directory will be moved to the &lt;code&gt;20_pre_aggregate_input_queue&lt;/code&gt; queue, if aggregation is enabled, or &lt;code&gt;40_forwarding_input_queue&lt;/code&gt; queue if not.&lt;/p&gt;
&lt;h4 id=&#34;20_pre_aggregate_input_queue&#34;&gt;&lt;code&gt;/20_pre_aggregate_input_queue/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Each directory on this queue will contain a ZIP file that contains one or more entries for the same group (combination of Feed and Stream Type).&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;proxyConfig.aggregator.splitSources&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt;, Stroom Proxy will inspect the ZIP to see if it needs to be split up into multiple parts, to meet the aggregation targets (defined by &lt;code&gt;proxyConfig.aggregator.maxItemsPerAggregate&lt;/code&gt; and  &lt;code&gt;proxyConfig.aggregator.maxUncompressedByteSize&lt;/code&gt;), else the zip will be treated as a single split-part.&lt;/p&gt;
&lt;p&gt;If there is just one split-part, the directory will be moved into the current aggregate directory for its group, e.g.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/21_pre_aggregates/FEED_X__raw_events/009/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If there are multiple split-parts the ZIP file will require splitting into multiple ZIP files with one per split-part, i.e. all entries from the input ZIP spread over multiple split-part ZIPs.
Each split-part will be written like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/22_splitting/0000000343/009_part_1/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/22_splitting/0000000343/009_part_2/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/22_splitting/0000000343/009_part_3/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the splitting has been completed, the common parent directory is moved to &lt;code&gt;/23_split_output/&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/23_split_output/0000000343/009_part_1/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/23_split_output/0000000343/009_part_1/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/23_split_output/0000000343/009_part_1/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each split-part is then moved to &lt;code&gt;/21_pre_aggregates/&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/21_pre_aggregates/FEED_X__raw_events/011/proxy.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the aggregate for a Feed|Type group is complete (based on item count and uncompressed size), the aggregate will be closed.
Closing of the aggregate involves moving the parent directory of all the aggregate items to &lt;code&gt;/30_aggregate_input_queue/&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;30_aggregate_input_queue&#34;&gt;&lt;code&gt;/30_aggregate_input_queue/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Each directory on this queue will contain multiple directory groups (each containing a ZIP file and its associated files) that are to be part of a single aggregate.&lt;/p&gt;
&lt;p&gt;If there is only one item in the queue directory, the directory will be moved to &lt;code&gt;/40_forwarding_input_queue/&lt;/code&gt; for forwarding.&lt;/p&gt;
&lt;p&gt;If there are more than one items in the queue directory then a new aggregate ZIP will be created in &lt;code&gt;/31_aggregates/&lt;/code&gt;.
The entries from each item ZIP will be written into the new aggregate ZIP.&lt;/p&gt;
&lt;p&gt;It will also create a set of meta entries for the aggregate.
This will contain only key/value entries that are present in &lt;strong&gt;every&lt;/strong&gt; item in the aggregate.&lt;/p&gt;
&lt;p&gt;Once the aggregate has been written it is moved to &lt;code&gt;/40_forwarding_input_queue/&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;40_forwarding_input_queue&#34;&gt;&lt;code&gt;/40_forwarding_input_queue/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Each directory on this queue will contain a single ZIP file that may contain one or more streams (plus associated files).
In addition to the ZIP file will be a combined &lt;code&gt;.meta&lt;/code&gt; file for the aggregate.&lt;/p&gt;
&lt;p&gt;Depending on how forwarding has been configured (using &lt;code&gt;proxyConfig.forwardFileDestinations&lt;/code&gt; and &lt;code&gt;proxyConfig.forwardHttpDestinations&lt;/code&gt;), there will be a pair of directory queues for each of the forwarding destinations, with the destination name in the path, e.g.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/file-dest-1/01_forward/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/file-dest-1/02_retry/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/file-dest-2/01_forward/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/file-dest-2/02_retry/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/http-dest-1/01_forward/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/http-dest-1/02_retry/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/http-dest-2/01_forward/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/50_forwarding/http-dest-2/02_retry/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each item on the &lt;code&gt;/40_forwarding_input_queue/&lt;/code&gt; queue will be copied into each of the &lt;code&gt;01_forward&lt;/code&gt; queues, then the source item will be deleted.
This keeps each destination independent and prevents a loss of connection to one destination from impacting the others.&lt;/p&gt;
&lt;h4 id=&#34;50_forwarding&#34;&gt;&lt;code&gt;/50_forwarding/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;This directory contains multiple directory queues, two per forward destination.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;..../&amp;lt;destination name&amp;gt;/01_forward/&lt;/code&gt; - Items initially queued for forwarding to the destination.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;..../&amp;lt;destination name&amp;gt;/02_retry/&lt;/code&gt; - Items that have failed to forward to the destination and have been queued for a retry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each forward destination directory also contains a failure directory:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;..../&amp;lt;destination name&amp;gt;/03_failure/&lt;/code&gt; - Items that have failed to forward.
Either they have failed too many times or have failed with an error that prevents retry.
Items in this directory are now outside the control of Stroom-Proxy and will remain until moved/deleted by an administrator.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Stroom Proxy</title>
      <link>/docs/proxy/</link>
      <pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/proxy/</guid>
      <description>
        
        
        &lt;p&gt;Stroom-Proxy&amp;rsquo;s primary role is to act as a front door for data being sent to Stroom.
Data can be sent to Stroom-Proxy in small chunks and it will aggregate the data into larger chunks (grouped by &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/f/glossary-feed&#34;&gt;
      &lt;span&gt;Feed&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Feed&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A Feed is a means of organising and categorising data in Stroom. A Feed contains multiple &lt;em&gt;Streams&lt;/em&gt; of data that have been ingested into Stroom or output by a &lt;em&gt;Pipeline&lt;/em&gt;. Typically a Feed will contain &lt;em&gt;Streams&lt;/em&gt; of data that are all from one system and have a common data format.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/s/glossary-stream-type&#34;&gt;
      &lt;span&gt;Stream Type&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Stream Type&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;All &lt;em&gt;Streams&lt;/em&gt; must have a Stream Type. The list of Stream Types is configured using the &lt;em&gt;Property&lt;/em&gt; &lt;code&gt;stroom.data.meta.metaTypes&lt;/code&gt;.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;) so that Stroom doesn&amp;rsquo;t have to process lots of small &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/s/glossary-stream&#34;&gt;
      &lt;span&gt;Streams&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Stream&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A Stream is the unit of data that Stroom works with and will typically contain many &lt;em&gt;Events&lt;/em&gt;.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.
It also provides a separation between the client and Stroom, so Stroom can be taken offline while data is still being accepted by Stroom-Proxy.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;../../docs/architecture/#overview&#34;&gt;Architecture&lt;/a&gt; for an example of how Stroom-Proxy is typically deployed.&lt;/p&gt;
&lt;h2 id=&#34;api&#34;&gt;API&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy presents an identical &lt;em&gt;HTTP POST&lt;/em&gt; &lt;code&gt;/datafeed&lt;/code&gt; &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/a/glossary-api&#34;&gt;
      &lt;span&gt;API&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;API&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;em&gt;Application Programming Interface&lt;/em&gt;. An interface that one system can present so other systems can use it to communicate. Stroom has a number of APIs, e.g. its many &lt;em&gt;REST&lt;/em&gt; APIs and its &lt;code&gt;/datafeed&lt;/code&gt; interface for data receipt.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to Stroom, so clients can send the same data in the same way to either Stroom or Stroom-Proxy.
For more detail on sending data into Stroom-Proxy, see &lt;a href=&#34;../../docs/sending-data/&#34;&gt;Sending Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also presents a number of other APIs for administration and communication with other proxies.
For more detail on Stroom-Proxy&amp;rsquo;s other APIs, see &lt;a href=&#34;../../docs/proxy/proxy-api/&#34;&gt;Proxy API&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;functions&#34;&gt;Functions&lt;/h2&gt;
&lt;p&gt;Stroom-Proxy has a number of key functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Receipt Filtering&lt;/em&gt; - The process of filtering the incoming data based on the HTTP headers.
Data can either be &lt;em&gt;Received&lt;/em&gt;, silently &lt;em&gt;Dropped&lt;/em&gt; or &lt;em&gt;Rejected&lt;/em&gt; with an error.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Splitting&lt;/em&gt; - Splitting received &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/z/glossary-zip&#34;&gt;
      &lt;span&gt;ZIP&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;ZIP&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A compressed file format for storing a one or more files with an associated directory structure. Stroom and Stroom Proxy use the ZIP format for exporting content and data as well as its Proxy ZIP format for holding multiple streams of data with associated meta data.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; files by &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/f/glossary-feed&#34;&gt;
      &lt;span&gt;Feed&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Feed&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;A Feed is a means of organising and categorising data in Stroom. A Feed contains multiple &lt;em&gt;Streams&lt;/em&gt; of data that have been ingested into Stroom or output by a &lt;em&gt;Pipeline&lt;/em&gt;. Typically a Feed will contain &lt;em&gt;Streams&lt;/em&gt; of data that are all from one system and have a common data format.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/s/glossary-stream-type&#34;&gt;
      &lt;span&gt;Stream Type&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Stream Type&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;All &lt;em&gt;Streams&lt;/em&gt; must have a Stream Type. The list of Stream Types is configured using the &lt;em&gt;Property&lt;/em&gt; &lt;code&gt;stroom.data.meta.metaTypes&lt;/code&gt;.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Aggregation&lt;/em&gt; - Storing received data locally and forwarding it when the aggregation limits have been reached.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Forwarding&lt;/em&gt; - Forwarding the received/aggregated data to one or more forward destinations.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Instant Forwarding&lt;/em&gt; - Data is streamed to a single &lt;em&gt;HTTP&lt;/em&gt; forward destination (i.e. Stroom or another Stroom-Proxy) as the data is received.
This function does not support multiple forward destinations or aggregations.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Directory Scanning&lt;/em&gt; - Periodically scanning one or more directories for ZIP files in &lt;a href=&#34;../../docs/sending-data/payloads/#stroom-zip-format&#34;&gt;Stroom ZIP Format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Event Store&lt;/em&gt; - Stroom-Proxy presents an &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/a/glossary-api&#34;&gt;
      &lt;span&gt;API&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;API&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;em&gt;Application Programming Interface&lt;/em&gt;. An interface that one system can present so other systems can use it to communicate. Stroom has a number of APIs, e.g. its many &lt;em&gt;REST&lt;/em&gt; APIs and its &lt;code&gt;/datafeed&lt;/code&gt; interface for data receipt.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; for receiving individual events.
This is to support applications that want to log events directly to Stroom-Proxy rather than writing them to rolled files locally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a more detailed explanation of each function, see &lt;a href=&#34;../../docs/proxy/proxy-functions/&#34;&gt;Proxy Functions&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Installation of Stroom Proxy</title>
      <link>/docs/howtos/install/installproxyhowto/</link>
      <pubDate>Mon, 12 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>/docs/howtos/install/installproxyhowto/</guid>
      <description>
        
        
        
&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;TODO&lt;/h4&gt;

    This section was written for Stroom-Proxy v5, so is out of date.

&lt;/div&gt;

&lt;h2 id=&#34;assumptions&#34;&gt;Assumptions&lt;/h2&gt;
&lt;p&gt;The following assumptions are used in this document.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user has reasonable RHEL/Centos System administration skills.&lt;/li&gt;
&lt;li&gt;Installation is on a fully patched minimal Centos 7.3 instance.&lt;/li&gt;
&lt;li&gt;The Stroom database has been created and resides on the host &lt;code&gt;stroomdb0.strmdev00.org&lt;/code&gt; listening on port 3307.&lt;/li&gt;
&lt;li&gt;The Stroom database user is &lt;code&gt;stroomuser&lt;/code&gt; with a password of &lt;code&gt;Stroompassword1@&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The application user &lt;code&gt;stroomuser&lt;/code&gt; has been created.&lt;/li&gt;
&lt;li&gt;The user is or has deployed the two node Stroom cluster described &lt;a href=&#34;../../docs/howtos/install/installhowto/#storage-scenario&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The user has set up the Stroom processing user as described &lt;a href=&#34;../../docs/howtos/install/installprocessingusersetuphowto/&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The prerequisite software has been installed.&lt;/li&gt;
&lt;li&gt;When a screen capture is documented, data entry is identified by the data surrounded by &amp;lsquo;&amp;lt;&lt;strong&gt;&amp;rsquo; &amp;lsquo;&lt;/strong&gt;&amp;gt;&amp;rsquo; . This excludes enter/return presses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;confirm-prerequisite-software-installation&#34;&gt;Confirm Prerequisite Software Installation&lt;/h2&gt;
&lt;p&gt;The following command will ensure the prerequisite software has been deployed&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel policycoreutils-python unzip zip
sudo yum -y install mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo yum -y install mysql-community-client&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note that we do &lt;strong&gt;NOT&lt;/strong&gt; need the database client software for a Forwarding or Standalone proxy.&lt;/p&gt;
&lt;h2 id=&#34;get-the-software&#34;&gt;Get the Software&lt;/h2&gt;
&lt;p&gt;The following will gain the identified, in this case release &lt;code&gt;5.1-beta.10&lt;/code&gt;, Stroom Application software release from github, then deploy it. You should regularly monitor the site for newer releases.&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo -i -u stroomuser
Prx=v5.1-beta.10
wget https://github.com/gchq/stroom-proxy/releases/download/${Prx}/stroom-proxy-distribution-${Prx}.zip
unzip stroom-proxy-distribution-${Prx}.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&#34;configure-the-software&#34;&gt;Configure the Software&lt;/h2&gt;
&lt;p&gt;There are three different types of Stroom Proxy&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Store&lt;/em&gt; - A &lt;em&gt;store&lt;/em&gt; proxy accepts batches of events, as files. It will validate the batch with the database then store the batches as files in a configured directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Store_No_DB&lt;/em&gt; - A &lt;em&gt;store_no_DB&lt;/em&gt; proxy accepts batches of events, as files. It has no connectivity to the database, so it assumes all batches are valid, so it stores the batches as files in a configured directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Forwarding&lt;/em&gt; - A &lt;em&gt;forwarding&lt;/em&gt; proxy accepts batches of events, as files. It has indirect connectivity to the database via the destination proxy, so it validates the batches then stores the batches as files in a configured directory until they are periodically forwarded to the configured destination Stroom proxy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will demonstrate the installation of each.&lt;/p&gt;
&lt;h3 id=&#34;store-proxy-configuration&#34;&gt;Store Proxy Configuration&lt;/h3&gt;
&lt;p&gt;In our &lt;em&gt;Store&lt;/em&gt; Proxy description below, we will use the multi node deployment scenario. That is we are deploying the &lt;em&gt;Store&lt;/em&gt; proxy on multiple Stroom nodes (&lt;code&gt;stroomp00&lt;/code&gt;, &lt;code&gt;stroomp01&lt;/code&gt;) and we have configured our storage as per the &lt;a href=&#34;../../docs/howtos/install/installhowto/#storage-scenario&#34;&gt;Storage Scenario&lt;/a&gt; which means the directories to install the inbound batches of data are &lt;code&gt;/stroomdata/stroom-working-p00/proxy&lt;/code&gt; and &lt;code&gt;/stroomdata/stroom-working-p01/proxy&lt;/code&gt; depending on the node.&lt;/p&gt;
&lt;p&gt;To install a &lt;em&gt;Store&lt;/em&gt; proxy, we run&lt;/p&gt;
&lt;p&gt;
  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;stroom-proxy/bin/setup.sh store&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

during which one is prompted for a number of configuration settings. Use the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NODE to be the hostname (not FQDN) of your host (i.e. &#39;stroomp00&#39; or &#39;stroomp01&#39; depending on the node we are installing on)
PORT_PREFIX should use the default, just press return
REPO_DIR should be set to &#39;/stroomdata/stroom-working-p00/proxy&#39; or &#39;/stroomdata/stroom-working-p01/proxy&#39; depending on the node we are installing on
REPO_FORMAT can be left as the default, just press return
JDBC_CLASSNAME should use the default, just press return
JDBC_URL should be set to &#39;jdbc:mysql://stroomdb0.strmdev00.org:3307/stroom&#39;
DB_USERNAME should be our processing user, &#39;stroomuser&#39;
DB_PASSWORD should be the one we set when creating the stroom database, that is &#39;Stroompassword1@&#39;
JAVA_OPTS can use the defaults, but ensure you have sufficient memory, either change or accept the default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, the script will configure the proxy. There should be no errors, but review the output.
If you make a mistake in the above, just re-run the script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The selection of the &lt;code&gt;REPO_DIR&lt;/code&gt; above and the setting of the &lt;code&gt;STROOM_TMP&lt;/code&gt; environment variable &lt;a href=&#34;../../docs/howtos/install/installprocessingusersetuphowto/&#34;&gt;earlier&lt;/a&gt; ensure that not only inbound files are placed in the &lt;code&gt;REPO_DIR&lt;/code&gt; location but the Stroom Application itself will access the same directory when it aggregates inbound data for ingest in its proxy aggregation threads.&lt;/p&gt;
&lt;h3 id=&#34;forwarding-proxy-configuration&#34;&gt;Forwarding Proxy Configuration&lt;/h3&gt;
&lt;p&gt;In our &lt;em&gt;Forwarding&lt;/em&gt; Proxy description below, we will deploy on a host named &lt;code&gt;stroomfp0&lt;/code&gt; and it will store the files in &lt;code&gt;/stroomdata/stroom-working-fp0/proxy&lt;/code&gt;. Remember, we are being consistent with our Storage hierarchy to make documentation and scripting simpler. Our destination host to periodically forward the files to will be &lt;code&gt;stroomp.strmdev00.org&lt;/code&gt; (the CNAME for &lt;code&gt;stroomp00.strmdev00.org&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;To install a &lt;em&gt;Forwarding&lt;/em&gt; proxy, we run&lt;/p&gt;
&lt;p&gt;
  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;stroom-proxy/bin/setup.sh forward&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

during which one is prompted for a number of configuration settings. Use the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NODE to be the hostname (not FQDN) of your host (i.e. &#39;stroomfp0&#39; in our example)
PORT_PREFIX should use the default, just press return
REPO_DIR should be set to &#39;/stroomdata/stroom-working-fp0/proxy&#39; which we created earlier.
REPO_FORMAT can be left as the default, just press return
FORWARD_SERVER should be set to our stroom server. (i.e. &#39;stroomp.strmdev00.org&#39; in our example)
JAVA_OPTS can use the defaults, but ensure you have sufficient memory, either change or accept the default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, the script will configure the proxy. There should be no errors, but review the output.&lt;/p&gt;
&lt;h3 id=&#34;store-no-database-proxy-configuration&#34;&gt;Store No Database Proxy Configuration&lt;/h3&gt;
&lt;p&gt;In our &lt;em&gt;Store_No_DB&lt;/em&gt; Proxy description below, we will deploy on a host named &lt;code&gt;stroomsap0&lt;/code&gt; and it will store the files in &lt;code&gt;/stroomdata/stroom-working-sap0/proxy&lt;/code&gt;. Remember, we are being consistent with our Storage hierarchy to make documentation and scripting simpler.&lt;/p&gt;
&lt;p&gt;To install a &lt;em&gt;Store_No_DB&lt;/em&gt; proxy, we run&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;stroom-proxy/bin/setup.sh store_nodb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;During which one is prompted for a number of configuration settings. Use the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NODE to be the hostname (not FQDN) of your host (i.e. &#39;stroomsap0&#39; in our example)
PORT_PREFIX should use the default, just press return
REPO_DIR should be set to &#39;/stroomdata/stroom-working-sap0/proxy&#39; which we created earlier.
REPO_FORMAT can be left as the default, just press return
JAVA_OPTS can use the defaults, but ensure you have sufficient memory, either change or accept the default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, the script will configure the proxy. There should be no errors, but review the output.&lt;/p&gt;
&lt;h2 id=&#34;apachemod_jk-change&#34;&gt;Apache/Mod_JK change&lt;/h2&gt;
&lt;p&gt;For all proxy deployments, if we are using Apache&amp;rsquo;s mod_jk then we need to ensure the proxy&amp;rsquo;s AJP connector specifies a 64K packetSize. View the file &lt;code&gt;stroom-proxy/instance/conf/server.xml&lt;/code&gt; to ensure the Connector element for the AJP protocol has a packetSize attribute of &lt;code&gt;65536&lt;/code&gt;. For example,&lt;/p&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;grep AJP stroom-proxy/instance/conf/server.xml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;shows&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Connector port=&amp;quot;9009&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; connectionTimeout=&amp;quot;20000&amp;quot; redirectPort=&amp;quot;8443&amp;quot; maxThreads=&amp;quot;200&amp;quot; packetSize=&amp;quot;65536&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This check is required for earlier releases of the Stroom Proxy. Releases since &lt;code&gt;v5.1-beta.4&lt;/code&gt; have set the AJP &lt;code&gt;packetSize&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;start-the-proxy-service&#34;&gt;Start the Proxy Service&lt;/h2&gt;
&lt;p&gt;We can now manually start our proxy service. Do so as the &lt;code&gt;stroomuser&lt;/code&gt; with the command

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;user&#34; 
    data-host=&#34;localhost&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;stroom-proxy/bin/start.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

Now monitor the directory &lt;code&gt;stroom-proxy/instance/logs&lt;/code&gt; for any errors. Initially you will see the log files &lt;code&gt;localhost_access_log.YYYY-MM-DD.txt&lt;/code&gt; and &lt;code&gt;catalina.out&lt;/code&gt;. Check them for errors and correct (or pose a question to this arena).
The context path and unknown version warnings in &lt;code&gt;catalina.out&lt;/code&gt; can be ignored.&lt;/p&gt;
&lt;p&gt;Eventually (about 60 seconds) the log file &lt;code&gt;stroom-proxy/instance/logs/stroom.log&lt;/code&gt; will appear. Again check it for errors.
The proxy will have completely started when you see the messages&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INFO  [localhost-startStop-1] spring.StroomBeanLifeCycleReloadableContextBeanProcessor (StroomBeanLifeCycleReloadableContextBeanProcessor.java:109) - ** proxyContext 0 START COMPLETE **
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INFO  [localhost-startStop-1] spring.StroomBeanLifeCycleReloadableContextBeanProcessor (StroomBeanLifeCycleReloadableContextBeanProcessor.java:109) - ** webContext 0 START COMPLETE **
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you leave it for a while you will eventually see cyclic (10 minute cycle) messages of the form&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INFO  [Repository Reader Thread 1] repo.ProxyRepositoryReader (ProxyRepositoryReader.java:170) - run() - Cron Match at YYYY-MM-DD ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a proxy takes too long to start, you should read the section on &lt;a href=&#34;../../docs/howtos/install/installhowto/#entropy-issues-in-virtual-environments&#34;&gt;Entropy Issues&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;proxy-repository-format&#34;&gt;Proxy Repository Format&lt;/h2&gt;
&lt;p&gt;A Stroom Proxy stores inbound files in a hierarchical file system whose root is supplied during the proxy setup (&lt;code&gt;REPO_DIR&lt;/code&gt;) and as files arrive they are given a &lt;em&gt;repository id&lt;/em&gt; that is a one-up number starting at one (1). The files are stored in a specific &lt;em&gt;repository format&lt;/em&gt;.
The default template is &lt;code&gt;${pathId}/${id}&lt;/code&gt; and this pattern will produce the following output files under &lt;code&gt;REPO_DIR&lt;/code&gt; for the given repository id&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Repository Id&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;FilePath&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;000.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;100&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;100.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1000&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;001/001000.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;10000&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;010/010000.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;100000&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;100/100000.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Since version v5.1-beta.4, this template can be specified during proxy setup via the entry to the &lt;code&gt;Stroom Proxy Repository Format&lt;/code&gt; prompt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
@@REPO_FORMAT@@ : Stroom Proxy Repository Format [${pathId}/${id}] &amp;gt; 
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The template uses replacement variables to form the file path. As indicated above, the default template is &lt;code&gt;${pathId}/${id}&lt;/code&gt; where &lt;code&gt;${pathId}&lt;/code&gt; is the automatically generated directory for a given &lt;em&gt;repository id&lt;/em&gt; and &lt;code&gt;${id}&lt;/code&gt; is the &lt;em&gt;repository id&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Other replacement variables can be used to in the template including http header meta data parameters (e.g. &amp;lsquo;${feed}&amp;rsquo;) and time based parameters (e.g. &amp;lsquo;${year}&amp;rsquo;). Replacement variables that cannot be resolved will be output as &amp;lsquo;_&amp;rsquo;. You must ensure that all templates include the &amp;lsquo;${id}&amp;rsquo; replacement variable at the start of the file name, failure to do this will result in an invalid repository.&lt;/p&gt;
&lt;p&gt;Available time based parameters are based on the file&amp;rsquo;s time of processing and are zero filled (excluding &lt;code&gt;ms&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;four digit year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;month&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;two digit month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;day&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;two digit day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hour&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;two digit hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minute&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;two digit minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;second&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;two digit second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;millis&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;three digit milliseconds value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ms&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;milliseconds since Epoch value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;proxy-repository-template-examples&#34;&gt;Proxy Repository Template Examples&lt;/h3&gt;
&lt;p&gt;For each of the following templates applied to a Store NoDB Proxy, the resultant proxy directory tree is shown after three posts were sent to the test feed &lt;code&gt;TEST-FEED-V1_0&lt;/code&gt; and two posts to the test feed &lt;code&gt;FEED-NOVALUE-V9_0&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;example-a---the-default---pathidid&#34;&gt;Example A - The default - &lt;code&gt;${pathId}/${id}&lt;/code&gt;&lt;/h4&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;stroomsap0&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;find /stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/001.zip
(out)/stroomdata/stroom-working-sap0/proxy/002.zip
(out)/stroomdata/stroom-working-sap0/proxy/003.zip
(out)/stroomdata/stroom-working-sap0/proxy/004.zip
(out)/stroomdata/stroom-working-sap0/proxy/005.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&#34;example-b---a-feed-orientated-structure---feedyearmonthdaypathidid&#34;&gt;Example B - A feed orientated structure - &lt;code&gt;${feed}/${year}/${month}/${day}/${pathId}/${id}&lt;/code&gt;&lt;/h4&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;stroomsap0&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;find /stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017/07
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017/07/23
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017/07/23/001.zip
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017/07/23/002.zip
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/2017/07/23/003.zip
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/2017
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/2017/07
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/2017/07/23
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/2017/07/23/004.zip
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/2017/07/23/005.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&#34;example-c---a-date-orientated-structure---yearmonthdaypathidid&#34;&gt;Example C - A date orientated structure - &lt;code&gt;${year}/${month}/${day}/${pathId}/${id}&lt;/code&gt;&lt;/h4&gt;

  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;stroomsap0&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;find /stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/2017
(out)/stroomdata/stroom-working-sap0/proxy/2017/07
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23/001.zip
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23/002.zip
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23/003.zip
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23/004.zip
(out)/stroomdata/stroom-working-sap0/proxy/2017/07/23/005.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&#34;example-d---a-feed-orientated-structure-but-with-a-bad-parameter---feedbadparamdaypathidid&#34;&gt;Example D - A feed orientated structure, but with a bad parameter - &lt;code&gt;${feed}/${badparam}/${day}/${pathId}/${id}&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;
  






&lt;div class=&#34;code-toolbar&#34;&gt;
  &lt;pre 
    class=&#34;command-line language-bash&#34; 
    data-user=&#34;stroomuser&#34; 
    data-host=&#34;stroomsap0&#34; 
    data-continuation-str=&#34;\&#34;
    data-filter-output=&#34;(out)&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;find /stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/_
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/_/23
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/_/23/001.zip
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/_/23/002.zip
(out)/stroomdata/stroom-working-sap0/proxy/TEST-FEED-V1_0/_/23/003.zip
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/_
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/_/23
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/_/23/004.zip
(out)/stroomdata/stroom-working-sap0/proxy/FEED-NOVALUE-V9_0/_/23/005.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

and one would also see a warning for each post in the proxy&amp;rsquo;s log file of the form&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WARN  [ajp-apr-9009-exec-4] repo.StroomFileNameUtil (StroomFileNameUtil.java:133) - Unused variables found: [badparam]
&lt;/code&gt;&lt;/pre&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Stroom Proxy Configuration</title>
      <link>/docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/</link>
      <pubDate>Wed, 23 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>/docs/install-guide/configuration/stroom-and-proxy/configuring-stroom-proxy/</guid>
      <description>
        
        
        
&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;See Also&lt;/h4&gt;
&lt;div class=&#34;alert-content&#34;&gt;
  
  &lt;p&gt;&lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/&#34;&gt;Stroom and Stroom-Proxy Common Configuration&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;../../docs/user-guide/properties/&#34;&gt;Stroom Properties&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The configuration of Stroom-proxy is very much the same as for Stroom with the only difference being the structure of the application specific part of the &lt;code&gt;config.yml&lt;/code&gt; file.
Stroom-proxy has a &lt;code&gt;proxyConfig&lt;/code&gt; key in the YAML while Stroom has &lt;code&gt;appConfig&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;yaml-configuration-file&#34;&gt;YAML Configuration File&lt;/h2&gt;
&lt;p&gt;The Stroom-proxy application is essentially just an executable &lt;span class=&#34;external-link&#34;&gt;
  &lt;a href=&#34;https://en.wikipedia.org/wiki/JAR_%28file_format%29&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;JAR (external link to https://en.wikipedia.org/wiki/JAR_%28file_format%29)&#34;&gt;
    &lt;span&gt;JAR&lt;/span&gt;
    &lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/span&gt;
 file that can be run when provided with a configuration file, &lt;code&gt;config.yml&lt;/code&gt;.
This configuration file is common to all forms of deployment.&lt;/p&gt;
&lt;p&gt;As Stroom-proxy does not have a user interface, the &lt;code&gt;config.yml&lt;/code&gt; file is the only way of configuring Stroom-Proxy.
As with stroom, the &lt;code&gt;config.yml&lt;/code&gt; file is split into three sections using these keys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;server&lt;/code&gt; - Configuration of the web server, e.g. ports, paths, request logging.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#server-configuration&#34;&gt;Server Configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;logging&lt;/code&gt; - Configuration of application logging.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#logging-configuration&#34;&gt;Logging Configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;proxyConfig&lt;/code&gt; - Stroom-Proxy specific configuration&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See also &lt;a href=&#34;../../docs/user-guide/properties/&#34;&gt;Properties&lt;/a&gt; for more details on structure of the config.yml file and supported data types.&lt;/p&gt;
&lt;p&gt;Stroom-Proxy operates on a configuration by exception basis so as far as is possible, all configuration properties will have a sensible default value and a property only needs to be explicitly configured if the default value is not appropriate (e.g. for tuning a large scale production deployment) or where values are environment specific (e.g. the hostname of a forward destination).&lt;/p&gt;
&lt;p&gt;As a result the &lt;code&gt;config.yml&lt;/code&gt; shipped with Stroom Proxy only contains a minimal set of properties.
The full tree of properties can be seen in &lt;code&gt;./config/config-defaults.yml&lt;/code&gt; and a schema for the configuration tree (along with descriptions for each property) can be found in &lt;code&gt;./config/config-schema.yml&lt;/code&gt;.
These two files can be used as a reference when configuring stroom.&lt;/p&gt;
&lt;p&gt;In the snippets of YAML configuration below, the default sections&lt;/p&gt;
&lt;h3 id=&#34;basic-structure&#34;&gt;Basic Structure&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy has a number of &lt;a href=&#34;../../docs/proxy/proxy-functions/&#34;&gt;key functions&lt;/a&gt; which are all configured via its YAML configuration file.&lt;/p&gt;
&lt;p&gt;The following YAML shows the high level structure of the Stroom-Proxy configuration file.
Each branch of the this YAML is explained in more detail below.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:

  # This should be set to a value that is unique within your Stroom/Stroom-Proxy estate.
  # It is used in the unique ReceiptId that is set in the meta of received data so
  # provides provenence of where data was received at each stage.
  proxyId: null

  # If true, Stroom-Proxy will halt on start up if any errors are found in the YAML
  # configuration file. If false, the errors will simply be logged. Setting this to
  # false is not advised
  haltBootOnConfigValidationFailure: true

  # Configuration of the base and temp paths used by Stroom-Proxy.
  # See Path Configuration below
  path:

  # This is the downstream (in flow of stream data terms) Stroom/Stroom-Proxy instance/cluster
  # used for feed status checks, supplying data receipt rules and verifying API keys.
  downstreamHost:

  # This controls the aggregation of received data into larger chunks prior to forwarding.
  # This is typically required to prevent Stroom receiving lots of small streams.
  aggregator:

  # If receive.receiptCheckMode is FEED_STATUS, this controls the feed status
  # checking. See Feed Status Configuration below.
  feedStatus:

  # Zero to many HTTP POST based destinations.
  # E.g. for forwarding to Stroom or another Stroom-Proxy
  forwardHttpDestinations:

  # Zero to many file system based destinations. See Forward Configuration below.
  forwardFileDestinations:

  # This controls the meta entries that will be included in the send and receive logs.
  logStream:

  # If receive.receiptCheckMode is RECEIPT_POLICY, this controls the fetching
  # of the policy rules.
  receiptPolicy:

  # This section is common to both Stroom and Stroom-Proxy
  # See Receive Configuration below.
  receive:

  # Configuration for authentication. See Security Configuration below.
  security:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stroom-proxy should be configured to check the receipt status of feeds on receipt of data.
This is done by configuring the end point of a downstream stroom-proxy or stroom.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  feedStatus:
    url: &amp;quot;http://stroom:8080/api/feedStatus/v1&amp;quot;
    apiKey: &amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;url&lt;/code&gt; should be the url for the feed status API on the downstream stroom(-proxy).
If this is on the same host then you can use the http endpoint, however if it is on a remote host then you should use https and the host of its nginx, e.g. &lt;code&gt;https://downstream-instance/api/feedStatus/v1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In order to use the API, the proxy must have a configured &lt;code&gt;apiKey&lt;/code&gt;.
The API key must be created in the downstream stroom instance and then copied into this configuration.&lt;/p&gt;
&lt;p&gt;If the proxy is configured to forward data then the forward destination(s) should be set.
This is the &lt;code&gt;datafeed&lt;/code&gt; endpoint of the downstream stroom-proxy or stroom instance that data will be forwarded to.
This may also be the address of a load balancer or similar that is fronting a cluster of stroom-proxy or stroom instances.
See also &lt;a href=&#34;#feed-status-certificate-configuration&#34;&gt;Feed status certificate configuration&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  forwardHttpDestinations:
    - enabled: true
      name: &amp;quot;downstream&amp;quot;
      forwardUrl: &amp;quot;https://some-host/stroom/datafeed&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;forwardUrl&lt;/code&gt; specifies the URL of the &lt;em&gt;datafeed&lt;/em&gt; endpoint on the destination host.
Each forward location can use a different key/trust store pair.
See also &lt;a href=&#34;#forwarding-certificate-configuration&#34;&gt;Forwarding certificate configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If the proxy is configured to store then the location of the proxy repository may need to be configured if it needs to be in a different location to the proxy home directory, e.g. on another mount point.&lt;/p&gt;
&lt;h3 id=&#34;aggregator-configuration&#34;&gt;Aggregator Configuration&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  aggregator:
    enabled: true
    # Whether to split received ZIPs if they are too large.
    splitSources: true
    # Maximum number of items to include in an aggregate
    maxItemsPerAggregate: 1000
    # Maximum size of the aggregate in uncompressed bytes.
    # Aggregates may be larger than this is splitSources is false or single very
    # large streams are received.
    maxUncompressedByteSize: &amp;quot;1G&amp;quot;
    #The the length of time that data is added to an aggregate for before the aggregate is closed.
    aggregationFrequency: &amp;quot;PT10M&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;


    &lt;p&gt;The &lt;code&gt;aggregator&lt;/code&gt; settings apply to &lt;strong&gt;all&lt;/strong&gt; forwarders.
It is not possible for forwarders to to use different aggregation settings.&lt;/p&gt;
&lt;p&gt;If you need to forward to a HTTP destination but also want to forward to a file destination using different aggregator settings, e.g. to keep a local archive of the data, you would need to employ a second Stroom-Proxy.
Stroom-Proxy A would forward to the HTTP downstream and forward to Stroom-Proxy B over HTTP.
Stroom-Proxy B would forward to a file destination, using much larger aggregator thresholds.&lt;/p&gt;


&lt;/div&gt;


&lt;h3 id=&#34;directory-scanner-configuration&#34;&gt;Directory Scanner Configuration&lt;/h3&gt;
&lt;p&gt;This configuration controls the directories that Stroom-Proxy scans to look for ZIP files to ingest.
It is primarily used as a means of manually re-processing files that have failed to forward, either as a result of too many retries or due to an unrecoverable error.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  dirScanner:
    # One or more directories to scan.
    # If the path is relative it is treated as relative to the proxyConfig.path.home property.
    dirs:
    - &amp;quot;zip_file_ingest&amp;quot;
    # Whether directory scanning is enabled or not
    enabled: true
    # The directory to move any failed files to.
    # If the path is relative it is treated as relative to the proxyConfig.path.home property.
    failureDir: &amp;quot;zip_file_ingest_failed&amp;quot;
    # How frequently each directory is scanned for files.
    scanFrequency: &amp;quot;PT1M&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;downstream-host-configuration&#34;&gt;Downstream Host Configuration&lt;/h3&gt;
&lt;p&gt;This is the default downstream (in flow of stream data terms) Stroom/Stroom-Proxy instance/cluster used for feed status checks, supplying data receipt rules and verifying API keys.&lt;/p&gt;
&lt;p&gt;By default it will be used as the default&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  downstreamHost:
    # http or https
    scheme: &amp;quot;https&amp;quot;
    # If not set, will default to 80/443 depending on scheme
    port: 443
    hostname: &amp;quot;...STROOM-PROXY OR STROOM FQDN...&amp;quot;
    # If not using OpenID authentication you will need to provide an API key.
    apiKey: &amp;quot;sak_6a011e3e5d_oKimmDxfNwj......&amp;lt;truncated&amp;gt;.....HYQxHaR2&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;event-store-configuration&#34;&gt;Event Store Configuration&lt;/h3&gt;
&lt;p&gt;The Event Store is used to store and aggregate individual events received via the &lt;code&gt;/api/event&lt;/code&gt; &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/a/glossary-api&#34;&gt;
      &lt;span&gt;API&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;API&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;em&gt;Application Programming Interface&lt;/em&gt;. An interface that one system can present so other systems can use it to communicate. Stroom has a number of APIs, e.g. its many &lt;em&gt;REST&lt;/em&gt; APIs and its &lt;code&gt;/datafeed&lt;/code&gt; interface for data receipt.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; or the SQS Connectors.
Events are appended to files specific to the Feed and Stream Type of the event.
Once a threshold is reached, the file will be rolled and processed by Stroom-Proxy.&lt;/p&gt;
&lt;p&gt;Each event is stored as a JSON line in the file.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  eventStore:
    # The size of an internal queue used to buffer aggregates that are ready to process.
    forwardQueueSize: 1000
    # The maximum age of the file before it is rolled.
    maxAge: &amp;quot;PT1M&amp;quot;
    # The maximum size of the file before it is rolled.
    maxByteCount: 9223372036854775807
    # The maximum number of events in the file before it is rolled.
    maxEventCount: 9223372036854775807
    # Configuration of the cache used for the event store.
    openFilesCache:
    # The frequency at which files are checked to see if they need to be rolled or not.
    rollFrequency: &amp;quot;PT10S&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;feed-status-configuration&#34;&gt;Feed Status Configuration&lt;/h3&gt;
&lt;p&gt;The configuration for performing feed status checks.
This section is only relevant if &lt;code&gt;proxyConfig.receive.receiptCheckMode&lt;/code&gt; is set to &lt;code&gt;FEED_STATUS&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  feedStatus:
    # Standard cache configuration block for configuring the cache of feed status check outcomes
    feedStatusCache:
    # The full URL to use for feed status checking.
    # ONLY set this if using a non-standard URL, otherwise
    # it will be derived from the downstreamHost.
    url: null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The configuration of the client certificates for feed status checks is done using the &lt;code&gt;DOWNSTREAM&lt;/code&gt; jersey client configuration.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#jersey-http-client-configuration&#34;&gt;Stroom and Stroom-Proxy Common Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;forward-configuration&#34;&gt;Forward Configuration&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy has two configuration branches for controlling forwarding as each has a different structure.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  # Zero to many HTTP POST based destinations.
  forwardHttpDestinations:
  # Zero to many file system based destinations.
  forwardFileDestinations:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both types of forwarder have an &lt;code&gt;enabled&lt;/code&gt; property.
If a forwarder&amp;rsquo;s &lt;code&gt;enabled&lt;/code&gt; state is set to &lt;code&gt;false&lt;/code&gt; it is as if the forwarder configuration does not exist, i.e no data will be queued for that forwarder until its state is changed to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;file-forward-destinations-configuration&#34;&gt;File Forward Destinations Configuration&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  # Zero to many file system based destinations.
  forwardFileDestinations:
    # Stroom-Proxy will attempt to move files onto the forward destination using an atomic move.
    # This ensures that the move does not happen more than once. If an atomic move is not possible,
    # e.g. the destination is a remote file system that does not support an atomic move, then it will
    # fall back to a non-atomic move with the risk of it happening more than once. If you see warnings
    # in the logs or know the file system will not support atomic moves then set this to false
  - atomicMoveEnabled: true
    # Whether this destination is enabled or not.
    enabled: true
    # If Instant Forwarding is to be used.
    instant: false
    # The type of liveness check to perform:
    # READ - will attempt to read the file/dir specified in livenessCheckPath. 
    # WRITE - will attempt to touch the file specified in livenessCheckPath.
    livenessCheckMode: &amp;quot;READ&amp;quot;
    # The path to use for regular liveness checking of this forward destination.
    # If null, empty or if the &#39;queue&#39; property is not configured, then no liveness check
    # will be performed and the destination will be
    # assumed to be healthy. If livenessCheckMode is READ, livenessCheckPath can be a
    # directory or a file and stroom-proxy will attempt to check it can read the
    # file/directory. If livenessCheckMode is WRITE, then livenessCheckPath must be a
    # file and stroom-proxy will attempt to touch that file. It is
    # only recommended to set this property for a remote file system where
    # connection issues may be likely. If it is a relative path, it will be assumed
    # to be relative to &#39;path&#39;
    livenessCheckPath: null
    # The unique name of the destination (across all file/http forward destinations.
    # The name is used in the directories on the file system, so do not change the name
    # once proxy has processed data. Must be provided.
    name: &amp;quot;...PROVIDE FORWARDER NAME...&amp;quot;
    # The base path of a directory to forward to.
    path: &amp;quot;...PROVIDE PATH...&amp;quot;
    # See Queue Configuration section below
    queue:
    # The templated relative sub-path of path.
    # The default path template is &#39;${year}${month}${day}/${feed}&#39;
    # Cannot be an absolute path and must resolve to a descendant of path.
    # Fore details of this configuration branch, see Path Templating Configuration below.
    subPathTemplate: null
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;http-forward-destinations-configuration&#34;&gt;HTTP Forward Destinations Configuration&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  # Zero to many HTTP POST based destinations.
  forwardHttpDestinations:
    # If true, add Open ID authentication headers to the request. Only works if the identityProviderType
    # is EXTERNAL_IDP and the destination is in the same Open ID Connect realm as the OIDC client that this
    # proxy instance is using.
  - addOpenIdAccessToken: false
    # The API key to use when forwarding data if Stroom is configured to require an API key.
    # Does NOT use the API Key from downstreamHost config.
    apiKey: null
    # Whether this destination is enabled or not.
    enabled: true
    forwardHeadersAdditionalAllowSet: []
    # The full URL to forward to if different from &amp;lt;downstreamHost&amp;gt;/datafeed
    forwardUrl: null
    # Configuration of the HTTP client, see below.
    httpClient:
    # If Instant Forwarding is to be used.
    instant: false
    # Whether liveness checking of the HTTP destination will take place. The queue property
    # must also be configured for liveness checking to happen
    livenessCheckEnabled: true
    # The URL/path to check for liveness of the forward destination. The URL should return a 200 response
    # to a GET request for the destination to be considered live.
    # If the response from the liveness check is not a 200, forwarding
    # will be paused at least until the next liveness check is performed.
    # If this property is not set, the downstreamHost configuration will be combined with the default API
    # path (/status).
    # If this property is just a path, it will be combined with the downstreamHost configuration.
    # Only set this property if you wish to use a non-default path.
    # or you want to use a different host/port/scheme to that defined in downstreamHost
    livenessCheckUrl: null
    # The unique name of the destination (across all file/http forward destinations.
    # The name is used in the directories on the file system, so do not change the name
    # once proxy has processed data. Must be provided.
    name: &amp;quot;...PROVIDE FORWARDER NAME...&amp;quot;
    # See Queue Configuration section below
    queue:
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;queue-configuration&#34;&gt;Queue Configuration&lt;/h4&gt;
&lt;p&gt;Each forward destination (whether file or HTTP) has a &lt;code&gt;queue&lt;/code&gt; configuration property that controls various aspects of forwarding, e.g. failure handling, delays, concurrency, etc.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  forwardHttpDestinations / forwardFileDestinations:
    queue:
      # The sub-path template to use for data that could not be retried
      # or has reached a retry limit.
      errorSubPathTemplate:
        enabled: true
        pathTemplate: &amp;quot;${year}${month}${day}/${feed}&amp;quot;
        templatingMode: &amp;quot;REPLACE_UNKNOWN_PARAMS&amp;quot;
      # A delay to add before forwarding. Primarily for testing.
      forwardDelay: &amp;quot;PT0S&amp;quot;
      # Number of threads to process retries
      forwardRetryThreadCount: 1
      # Number of threads to handle forwarding
      forwardThreadCount: 5
      # Duration between liveness checks
      livenessCheckInterval: &amp;quot;PT1M&amp;quot;
      # The maximum time from the first failed forward attempt to continue retrying.
      # After this the data will be move to the failure directory permenantly.
      maxRetryAge: &amp;quot;P7D&amp;quot;
      # The maximum time between retries. Must be greater than or equal to retryDelay.
      maxRetryDelay: &amp;quot;P1D&amp;quot;
      # If false forwards will be attempted imediately and any failure will restult in the
      # data being moved to the failure directory.
      queueAndRetryEnabled: false
      # The time between retries. If retryDelayGrowthFactor is &amp;gt;1, this value will grow
      # after each retry.
      retryDelay: &amp;quot;PT10M&amp;quot;
      # The factor to apply to retryDelay after each failed retry.
      retryDelayGrowthFactor: 1.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;path-templating-configuration&#34;&gt;Path Templating Configuration&lt;/h4&gt;
&lt;p&gt;The following properties all share the same structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proxyConfig.forwardFileDestinations.[n].subPathTemplate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxyConfig.forwardFileDestinations.[n].queue.errorSubPathTemplate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxyConfig.forwardHttpDestinations.[n].queue.errorSubPathTemplate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  xxxxxxTemplate:
    # Whether templating is enabled or not. If not enabled
    # no sub-path will be used.
    enabled: true
    # The template to use for the sub-path
    pathTemplate: &amp;quot;${year}${month}${day}/${feed}&amp;quot;
    # Controls how unknown parameters are dealt with. One of:
    # IGNORE_UNKNOWN_PARAMS - e.g. &#39;cat/${unknownparam}/dog&#39; =&amp;gt; &#39;cat/${unknownparam}/dog&#39;
    # REMOVE_UNKNOWN_PARAMS - e.g. &#39;cat/${unknownparam}/dog&#39; =&amp;gt; &#39;cat/dog&#39;
    # REPLACE_UNKNOWN_PARAMS - Replace unknown with &#39;XXX&#39;, e.g. &#39;cat/${unknownparam}/dog&#39; =&amp;gt; &#39;cat/XXX/dog&#39;
    templatingMode: &amp;quot;REPLACE_UNKNOWN_PARAMS&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following template parameters are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;${feed}&lt;/code&gt; - The Feed name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${type}&lt;/code&gt; - The Stream Type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${year}&lt;/code&gt; - The 4 digit year of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${month}&lt;/code&gt; - The 2 digit month of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${day}&lt;/code&gt; - The 2 digit day of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${hour}&lt;/code&gt; - The 2 digit hour of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${minute}&lt;/code&gt; - The 2 digit minute of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${second}&lt;/code&gt; - The 2 digit second of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${millis}&lt;/code&gt; - The 3 digit milliseconds of the current date/time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${ms}&lt;/code&gt; - The current date/time as milliseconds since the Unix Epoch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;liveness-checking&#34;&gt;Liveness Checking&lt;/h4&gt;
&lt;p&gt;Each of the configured forward destinations has a liveness check that can be configured.
This allows Stroom Proxy to periodically check that the destination is &lt;em&gt;live&lt;/em&gt;.
If the liveness check fails for a destination, all forwarding for that destination will be paused until a subsequent liveness check reports it as &lt;em&gt;live&lt;/em&gt; again.&lt;/p&gt;
&lt;p&gt;The liveness checks take the following forms:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;HTTP Destination&lt;/dt&gt;
&lt;dd&gt;Performs a &lt;code&gt;GET&lt;/code&gt; request to the URL configured using &lt;code&gt;forwardHttpDestinations.[n].livenessCheckUrl&lt;/code&gt;.
If not configured it will use &lt;code&gt;/status&lt;/code&gt; on the downstream host.
The destination is considered live if it gets a &lt;code&gt;200&lt;/code&gt; response.
You can use a URL that allows the destination to control its liveness, i.e. to take itself off line during an upgrade.&lt;/dd&gt;
&lt;dt&gt;File Destination&lt;/dt&gt;
&lt;dd&gt;Reads or writes (&lt;code&gt;touch&lt;/code&gt;) to a file defined by &lt;code&gt;forwardFileDestinations.[n].livenessCheckPath&lt;/code&gt;.
Liveness checking for a file destination may be useful if the destination is on a network file share.
&lt;code&gt;livenessCheckMode&lt;/code&gt; controls whether a read or write to the file is performed.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id=&#34;http-client-configuration&#34;&gt;HTTP Client Configuration&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  forwardHttpDestinations:
    httpClient:
      connectionRequestTimeout: &amp;quot;PT3M&amp;quot;
      connectionTimeout: &amp;quot;PT3M&amp;quot;
      cookiesEnabled: false
      keepAlive: &amp;quot;PT0S&amp;quot;
      maxConnections: 1024
      maxConnectionsPerRoute: 1024
      proxy: null
      retries: 0
      timeToLive: &amp;quot;PT1H&amp;quot;
      timeout: &amp;quot;PT3M&amp;quot;
      # Transport Layer Security, see below.
      tls: null
      userAgent: null
      validateAfterInactivityPeriod: &amp;quot;PT0S&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;tls&lt;/code&gt; branch of the configuration is for configuring Transport Layer Security (the successor to Secure Sockets Layer (SSL)).
It is &lt;code&gt;null&lt;/code&gt; by default, i.e. no additional TLS configuration is used.
Its structure is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  forwardHttpDestinations:
    httpClient:
      tls:
        protocol: &amp;quot;TLSv1.2&amp;quot;
        # The name of the JCE provider to use on client side for cryptographic support 
        # (for example, SunJCE, Conscrypt, BC, etc). See Oracle documentation for more information.
        provider:
        # The path of the key store file
        keyStorePath: null
        # The password of the key store file
        keyStorePassword: null
        # The type of key store (usually JKS, PKCS12, JCEKS, Windows-MY, or Windows-ROOT).
        keyStoreType: &amp;quot;JKS&amp;quot;
        keyStoreProvider: null
        # The path of the trust store file
        trustStorePath: null
        # The password of the trust store file
        trustStorePassword: null
        # The type of trust store (usually JKS, PKCS12, JCEKS, Windows-MY, or Windows-ROOT).
        trustStoreType: &amp;quot;JKS&amp;quot;
        trustStoreProvider: null
        trustSelfSignedCertificates: false
        verifyHostname: false
        # Zero to protocols (e.g., SSLv3, TLSv1) which are supported.
        # All other protocols will be refused.
        supportedProtocols: null
        # A list of cipher suites (e.g., TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256) which are supported.
        # All other cipher suites will be refused.
        supportedCiphers: null
        certAlias: null
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;log-stream-configuration&#34;&gt;Log Stream Configuration&lt;/h3&gt;
&lt;p&gt;This controls the meta entries that will be included in the send and receive logs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  logStream:
    # The headers attributes that will be output in the send/receive log lines.
    # They will be output in the order that they appear in this list.
    # Duplicates will be ignored, case does not matter.
    metaKeys:
      - &amp;quot;guid&amp;quot;
      - &amp;quot;receiptid&amp;quot;
      - &amp;quot;feed&amp;quot;
      - &amp;quot;system&amp;quot;
      - &amp;quot;environment&amp;quot;
      - &amp;quot;remotehost&amp;quot;
      - &amp;quot;remoteaddress&amp;quot;
      - &amp;quot;remotedn&amp;quot;
      - &amp;quot;remotecertexpiry&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;path-configuration&#34;&gt;Path Configuration&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  path:
    # By default all files read or written to by stroom-proxy will be in directories relative to
    # the home location. Ideally this should differ from the location of the Stroom Proxy
    # installed software as it has a different lifecycle.
    # If not set the location of the Stroom-Proxy application JAR file will be used and if that
    # can&#39;t be determined, &amp;lt;user&#39;s home&amp;gt;/.stroom will be used.
    home: &amp;quot;...SET TO AN ABSOLUTE PATH...&amp;quot;
    # The location for Stroom-Proxy&#39;s persisted data
    data: &amp;quot;data&amp;quot;
    # The location for any temporary files/directories.
    # If not set, will use a sub-directory called &#39;stroom-proxy&#39; in the system temp dir,
    # i.e. as defined by &#39;java.io.tmpdir&#39;.
    temp: null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All paths in the configuration file can be either relative or absolute.
If relative then they will be treated as being relative to the &lt;code&gt;home&lt;/code&gt; path.&lt;/p&gt;
&lt;h3 id=&#34;receipt-policy-configuration&#34;&gt;Receipt Policy Configuration&lt;/h3&gt;
&lt;p&gt;This section of configuration is only applicable if &lt;code&gt;proxyConfig.receive.receiptCheckMode&lt;/code&gt; is &lt;code&gt;RECEIPT_POLICY&lt;/code&gt;.
It controls the fetching of the receipt policy rules from a downstream Stroom or Stroom-Proxy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  receiptPolicy:
    # Only set if using a non-standard URL, else this is derived based on downstreamHost
    # config.
    receiveDataRulesUrl: null
    # The duration between calls to fetch the latest policy rules.
    syncFrequency: &amp;quot;PT1M&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The configuration of the client certificates for receipt policy checks is done using the &lt;code&gt;DOWNSTREAM&lt;/code&gt; jersey client configuration.
See &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#jersey-http-client-configuration&#34;&gt;Stroom and Stroom-Proxy Common Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;receive-configuration&#34;&gt;Receive Configuration&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;receive&lt;/code&gt; configuration is common to both Stroom and Stroom-Proxy, see &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#receive-configuration&#34;&gt;Receive Configuration&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;security-configuration&#34;&gt;Security Configuration&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  security:
    authentication:
      # This property is currently not used
      authenticationRequired: true
      # Open ID Connect configuration
      openId:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;openId&lt;/code&gt; branch of the config is common to both Stroom and Stroom-Proxy, see &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/common-configuration/#open-id-configuration&#34;&gt;Open ID Configuration&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3 id=&#34;amazon-simple-queue-service-configuration&#34;&gt;Amazon Simple Queue Service Configuration&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy is able to consume messages from multiple AWS SQS queues.
Each message received from a queue will be added to the Event Store for aggregation by Feed and Stream Type.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  # Zero to many connectors
  sqsConnectors:
    # This property is not currently used
  - awsProfileName: null
    # The name of the AWS region the SQS queue exists in.
    awsRegionName: &amp;quot;...AWS REGION...&amp;quot;
    # The maximum time to wait when polling the queue for messages
    pollFrequency: &amp;quot;PT10S&amp;quot;
    # This property is not currently used
    queueName: null
    # The URL of the Amazon SQS queue from which messages are received.
    queueUrl: &amp;quot;...SQS QUEUE URL...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;thread-configuration&#34;&gt;Thread Configuration&lt;/h3&gt;
&lt;p&gt;Stroom-Proxy is able to run certain operations in parallel.
This configuration allows you to increase the number of threads used for each operation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;proxyConfig:
  threads:
    # Number of threads to consume from the aggregate input queue.
    aggregateInputQueueThreadCount: 1
    # Number of threads to consume from the forwarding input queue. 
    forwardingInputQueueThreadCount: 1
    # Number of threads to consume from the pre-aggregate input queue.
    preAggregateInputQueueThreadCount: 1
    # Number of threads to consume from the zip splitting input queue.
    zipSplittingInputQueueThreadCount: 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;deploying-without-docker&#34;&gt;Deploying without Docker&lt;/h2&gt;
&lt;p&gt;Apart from the structure of the &lt;code&gt;config.yml&lt;/code&gt; file, the configuration in a non-docker environment is the same as for &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom/#deploying-without-docker&#34;&gt;stroom&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;as-part-of-a-docker-stack&#34;&gt;As part of a docker stack&lt;/h2&gt;
&lt;p&gt;The way Stroom-Proxy is configured is essentially the same as for &lt;a href=&#34;../../docs/install-guide/configuration/stroom-and-proxy/configuring-stroom/#as-part-of-a-docker-stack&#34;&gt;stroom&lt;/a&gt; with the only real difference being the structure of the &lt;code&gt;config.yml&lt;/code&gt; file as note &lt;a href=&#34;#config-file-structure&#34;&gt;above&lt;/a&gt; .
As with stroom the docker stack comes with a &lt;code&gt;./volumes/stroom-proxy-*/config/config.yml&lt;/code&gt; file that will be used in the absence of a provided one.
Also as with stroom, the &lt;code&gt;config.yml&lt;/code&gt; file supports environment variable substitution so can make use of environment variables set in the stack &lt;code&gt;.env&lt;/code&gt; file and passed down via the docker-compose YAML files.&lt;/p&gt;
&lt;h3 id=&#34;certificates&#34;&gt;Certificates&lt;/h3&gt;
&lt;p&gt;Stroom-proxy makes use of client certificates for two purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Communicating with a downstream stroom/stroom-proxy in order to establish the receipt status for the feeds it has received data for.&lt;/li&gt;
&lt;li&gt;When forwarding data to a downstream stroom/stroom-proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The stack comes with the following files that can be used for demo/test purposes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;volumes/stroom-proxy-*/certs/ca.jks
volumes/stroom-proxy-*/certs/client.jks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a production deployment these will need to be replaced with the certificates that are appropriate for your environment.&lt;/p&gt;
&lt;h2 id=&#34;typical-configuration&#34;&gt;Typical Configuration&lt;/h2&gt;
&lt;p&gt;The following are a guide to typical configurations for operating a Stroom-Proxy with different use cases.&lt;/p&gt;
&lt;h3 id=&#34;store-and-forward&#34;&gt;Store and Forward&lt;/h3&gt;
&lt;p&gt;This is a typical case where you want to aggregate received data then forward it to a downstream Stroom or Stroom-Proxy, but also retain a store of the aggregates.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;server:
  applicationContextPath: /
  adminContextPath: /proxyAdmin
  applicationConnectors:
    - type: http
      port: &amp;quot;8090&amp;quot;
      useForwardedHeaders: true
  adminConnectors:
    - type: http
      port: &amp;quot;8091&amp;quot;
      useForwardedHeaders: true
  detailedJsonProcessingExceptionMapper: true
  requestLog:
    appenders:
      # Log appender for the web server request logging
    - type: file
      currentLogFilename: logs/access/access.log
      discardingThreshold: 0
      # Rolled and gzipped every minute
      archivedLogFilenamePattern: logs/access/access-%d{yyyy-MM-dd&#39;T&#39;HH:mm}.log.gz
      # One week using minute files
      archivedFileCount: 10080
      logFormat: &#39;%h %l &amp;quot;%u&amp;quot; [%t] &amp;quot;%r&amp;quot; %s %b &amp;quot;%i{Referer}&amp;quot; &amp;quot;%i{User-Agent}&amp;quot; %D&#39;

logging:
  level: WARN
  loggers:
    # Logs useful information about stroom proxy. Only set DEBUG on specific &#39;stroom&#39; classes or packages
    # due to the large volume of logs that would be produced for all of &#39;stroom&#39; in DEBUG.
    stroom: INFO
    # Logs useful information about dropwizard when booting stroom
    io.dropwizard: INFO
    # Logs useful information about the jetty server when booting stroom
    # Set this to INFO if you want to log all REST request/responses with headers/payloads.
    org.glassfish.jersey.logging.LoggingFeature: OFF

    # Logger and appender for proxy receipt audit logs
    &amp;quot;receive&amp;quot;:
      level: INFO
      additive: false
      appenders:
      - type: file
        currentLogFilename: logs/receive/receive.log
        discardingThreshold: 0
        # Rolled and gzipped every minute
        archivedLogFilenamePattern: logs/receive/receive-%d{yyyy-MM-dd&#39;T&#39;HH:mm}.log.gz
        # One week using minute files
        archivedFileCount: 10080
        logFormat: &amp;quot;%-6level [%d{yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;}] [%t] %logger - %X{code} %msg %n&amp;quot;

    # Logger and appender for proxy send audit logs
    &amp;quot;send&amp;quot;:
      level: INFO
      additive: false
      appenders:
      - type: file
        currentLogFilename: logs/send/send.log
        discardingThreshold: 0
        # Rolled and gzipped every minute
        archivedLogFilenamePattern: logs/send/send-%d{yyyy-MM-dd&#39;T&#39;HH:mm}.log.gz
        # One week using minute files
        archivedFileCount: 10080
        logFormat: &amp;quot;%-6level [%d{yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;}] [%t] %logger - %X{code} %msg %n&amp;quot;

  appenders:

    # Log to stdout, use this if running in Docker
  - type: console
    # Multi-coloured log format for console output
    logFormat: &amp;quot;%highlight(%-6level) [%d{\&amp;quot;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;\&amp;quot;,UTC}] [%green(%t)] %cyan(%logger) - %X{code} %msg %n&amp;quot;
    timeZone: UTC

    # Minute rolled files for stroom/datafeed, will be curl&#39;d/deleted by stroom-log-sender
  - type: file
    currentLogFilename: logs/app/app.log
    discardingThreshold: 0
    archivedLogFilenamePattern: logs/app/app-%d{yyyy-MM-dd&#39;T&#39;HH:mm}.log.gz
    # One week using minute files
    archivedFileCount: 10080
    logFormat: &amp;quot;%-6level [%d{\&amp;quot;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;\&amp;quot;,UTC}] [%t] %logger - %X{code} %msg %n&amp;quot;

# This section contains the Stroom Proxy configuration properties
# For more information see:
# https://gchq.github.io/stroom-docs/user-guide/properties.html
# jerseyClients are used for making feed status and content sync REST calls
jerseyClients:
  default:
    tls:
      keyStorePath: &amp;quot;certs/client.jks&amp;quot;
      keyStorePassword: &amp;quot;password&amp;quot;
      trustStorePath: &amp;quot;certs/ca.jks&amp;quot;
      trustStorePassword: &amp;quot;password&amp;quot;

proxyConfig:
  path:
    # By default all files read or written to by stroom-proxy will be in directories relative to
    # the home location. This must be set to an absolute path and also to one that differs
    # the installed software as it has a different lifecycle.
    home: &amp;quot;/stroomdata/stroom-proxy/home&amp;quot;
  # This is the downstream (in datafeed flow terms) stroom/stroom-proxy used for
  # feed status checks, supplying data receipt rules and verifying API keys.
  downstreamHost:
    scheme: &amp;quot;https&amp;quot;
    port: &amp;quot;443&amp;quot;
    hostname: &amp;quot;stroom.some.domain&amp;quot;
    apiKey: &amp;quot;...API KEY...&amp;quot;

  aggregator:
    maxItemsPerAggregate: 1000
    maxUncompressedByteSize: &amp;quot;1G&amp;quot;
    aggregationFrequency: 10m

  forwardFileDestinations:
  - name: &amp;quot;archive-repo&amp;quot;
    path: &amp;quot;/stroomdata/stroom-proxy/archive-repo&amp;quot;
    subPathTemplate:
      pathTemplate: &amp;quot;${year}/${year}-${month}/${year}-${month}-${day}/${year}-${month}-${day}-${feed}/&amp;quot;

  forwardHttpDestinations:
  - name: &amp;quot;downstream-stroom&amp;quot;
    httpClient:
      tls:
        keyStorePath: &amp;quot;certs/client.jks&amp;quot;
        keyStorePassword: &amp;quot;password&amp;quot;
        trustStorePath: &amp;quot;certs/ca.jks&amp;quot;
        trustStorePassword: &amp;quot;password&amp;quot;

  receive:
    receiptCheckMode: &amp;quot;RECEIPT_POLICY&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;air-gapped-store-only&#34;&gt;Air-Gapped Store Only&lt;/h3&gt;
&lt;p&gt;This is an example of a Stroom-Proxy instance that is hosted in an environment where is has no direct link to a downstream Stroom/Stroom-Proxy.
All data is aggregated and forwarded to the local file system for transport downstream using other means outside of the scope of this documentation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;server:
  # ... Same as configuration above

logging:
  # ... Same as configuration above

jerseyClients:
  # ... Same as configuration above

proxyConfig:
  path:
    # By default all files read or written to by stroom-proxy will be in directories relative to
    # the home location. This must be set to an absolute path and also to one that differs
    # the installed software as it has a different lifecycle.
    home: &amp;quot;/stroomdata/stroom-proxy/home&amp;quot;

  # No downstreamHost due to air-gap
  downstreamHost:
    enabled: false

  aggregator:
    maxItemsPerAggregate: 1000
    maxUncompressedByteSize: &amp;quot;1G&amp;quot;
    aggregationFrequency: 10m

  forwardFileDestinations:

  # Repo for a local archive
  - name: &amp;quot;archive-repo&amp;quot;
    path: &amp;quot;/stroomdata/stroom-proxy/archive-repo&amp;quot;
    subPathTemplate:
      pathTemplate: &amp;quot;${year}/${year}-${month}/${year}-${month}-${day}/${year}-${month}-${day}-${feed}/&amp;quot;

  # Repo to be transported downstream around air-gap
  - name: &amp;quot;downstream-repo&amp;quot;
    path: &amp;quot;/stroomdata/stroom-proxy/downstream-repo&amp;quot;
    subPathTemplate:
      pathTemplate: &amp;quot;${year}/${year}-${month}/${year}-${month}-${day}/${year}-${month}-${day}-${feed}/&amp;quot;

  forwardHttpDestinations: []

  receive:
    # No receipt checking due to air-gap. All data accepted.
    receiptCheckMode: &amp;quot;RECEIVE_ALL&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

      </description>
    </item>
    
  </channel>
</rss>
