Repository: factcast/factcast
Pull request #3512: #3131: UI Exports - add documentation
Author: login: bedaka
Created: 2025-03-10T13:05:56Z | Merged: 2025-03-11T10:46:19Z



Diff:
diff --git a/factcast-examples/factcast-example-server-ui-s3-reports/src/main/resources/application.properties b/factcast-examples/factcast-example-server-ui-s3-reports/src/main/resources/application.properties
index f08f433d81..9bbe8b0f5b 100644
--- a/factcast-examples/factcast-example-server-ui-s3-reports/src/main/resources/application.properties
+++ b/factcast-examples/factcast-example-server-ui-s3-reports/src/main/resources/application.properties
@@ -1,4 +1,4 @@
 factcast.security.enabled=false
 factcast.store.schemaRegistryUrl=classpath:example-registry
 vaadin.productionMode=true
-factcast.ui.s3.bucket=factcast-ui-bucket
\ No newline at end of file
+factcast.ui.report.store.s3=factcast-ui-bucket
diff --git a/factcast-server-ui-s3-reportstore/README.md b/factcast-server-ui-s3-reportstore/README.md
index bc5eab2551..ca55c85a6a 100644
--- a/factcast-server-ui-s3-reportstore/README.md
+++ b/factcast-server-ui-s3-reportstore/README.md
@@ -4,4 +4,4 @@ To be used in combination with factcast-server-ui in order to store generated re
 
 ## Configuration properties
 
-`factcast.ui.s3.bucket`=  the name of your S3 bucket.
\ No newline at end of file
+`factcast.ui.report.store.s3`= the name of your S3 bucket.
diff --git a/factcast-server-ui-s3-reportstore/src/main/java/org/factcast/server/ui/s3reportstore/S3ReportStore.java b/factcast-server-ui-s3-reportstore/src/main/java/org/factcast/server/ui/s3reportstore/S3ReportStore.java
index 4418d6ae0f..e8d682114d 100644
--- a/factcast-server-ui-s3-reportstore/src/main/java/org/factcast/server/ui/s3reportstore/S3ReportStore.java
+++ b/factcast-server-ui-s3-reportstore/src/main/java/org/factcast/server/ui/s3reportstore/S3ReportStore.java
@@ -44,7 +44,7 @@ public class S3ReportStore implements ReportStore {
   private final S3TransferManager s3TransferManager;
   private final S3Presigner s3Presigner;
 
-  @Value("${factcast.ui.s3.bucket}")
+  @Value("${factcast.ui.report.store.s3}")
   private String bucketName;
 
   @Override
diff --git a/factcast-server-ui-s3-reportstore/src/test/java/org/factcast/server/ui/s3reportstore/config/AwsS3TestConfig.java b/factcast-server-ui-s3-reportstore/src/test/java/org/factcast/server/ui/s3reportstore/config/AwsS3TestConfig.java
index d8e2e5f93c..3556a1143f 100644
--- a/factcast-server-ui-s3-reportstore/src/test/java/org/factcast/server/ui/s3reportstore/config/AwsS3TestConfig.java
+++ b/factcast-server-ui-s3-reportstore/src/test/java/org/factcast/server/ui/s3reportstore/config/AwsS3TestConfig.java
@@ -42,7 +42,7 @@ S3ReportStore s3ReportStore(
 
   @Bean
   public S3TransferManager localS3(
-      @Value("${factcast.ui.s3.bucket}") String bucketName, LocalStackContainer container) {
+      @Value("${factcast.ui.report.store.s3}") String bucketName, LocalStackContainer container) {
 
     S3AsyncClient s3 = getClient(container.getEndpointOverride(LocalStackContainer.Service.S3));
     S3TransferManager s3TransferManager = S3TransferManager.builder().s3Client(s3).build();
@@ -56,8 +56,9 @@ private S3AsyncClient getClient(URI uri) {
 
   private void createBucket(S3AsyncClient client, String bucketName) {
     if (doesBucketExist(client, bucketName)) {
-      log.info("Found bucket, do nothing");
+      log.debug("Bucket found, skip creation.");
     } else {
+      log.debug("Bucket not found, creating");
       client.createBucket(x -> x.bucket(bucketName)).join();
 
       CORSRule corsRule =
@@ -69,8 +70,6 @@ private void createBucket(S3AsyncClient client, String bucketName) {
       client
           .putBucketCors(x -> x.bucket(bucketName).corsConfiguration(c -> c.corsRules(corsRule)))
           .join();
-
-      log.info("Did not found bucket, creating");
     }
   }
 
diff --git a/factcast-server-ui-s3-reportstore/src/test/resources/application.properties b/factcast-server-ui-s3-reportstore/src/test/resources/application.properties
index 757d667e4e..09dec3acf2 100644
--- a/factcast-server-ui-s3-reportstore/src/test/resources/application.properties
+++ b/factcast-server-ui-s3-reportstore/src/test/resources/application.properties
@@ -1 +1 @@
-factcast.ui.s3.bucket=factcast-ui
+factcast.ui.report.store.s3=factcast-ui
diff --git a/factcast-server-ui/README.md b/factcast-server-ui/README.md
index 35a307f029..4ddd1d1a7b 100644
--- a/factcast-server-ui/README.md
+++ b/factcast-server-ui/README.md
@@ -16,17 +16,18 @@ into videos that you can find in the target folder, respectively.
 
 Playwrite offers this generative mode which records interactions with the ui and turns them into accessor, which can be
 a great help setting up new integration tests. Make sure to remove <test> scope from the playwrite dependency before.
-`mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="codegen localhost:8080"`                                  
+`mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="codegen localhost:8080"`
 
 ## Report Generation
 
 The UI offers a report generation feature that can be used to generate and save reports based on certain event criteria.
 These reports can be stored either in S3 (`S3ReportStore`) or in your local filesystem (`FileSystemReportStore`).
 
-If you want to use the `S3ReportStore`, you need to provide the configuration property of `factcast.ui.s3.bucket`.
-If you chose to use the `FileSystemReportStore`, you need to set the configuration property of `factcast.ui.reports.path`.
+If you want to use the `S3ReportStore`, you need to provide the configuration property of `factcast.ui.report.store.s3`.
+If you chose to use the `FileSystemReportStore`, you need to set the configuration property of
+`factcast.ui.report.store.path`.
 
 ## Keeping the package.json in correct state
 
 When making changes to the ui code make sure to run the ExampleUiServer once and then execute `mvn clean install`  
-before commiting your changes. This will ensure that the package.json and the created bundle are in sync.
\ No newline at end of file
+before commiting your changes. This will ensure that the package.json and the created bundle are in sync.
diff --git a/factcast-server-ui/src/main/java/org/factcast/server/ui/config/FileSystemReportStoreConfiguration.java b/factcast-server-ui/src/main/java/org/factcast/server/ui/config/FileSystemReportStoreConfiguration.java
index 3eceb0920e..164ed5effe 100644
--- a/factcast-server-ui/src/main/java/org/factcast/server/ui/config/FileSystemReportStoreConfiguration.java
+++ b/factcast-server-ui/src/main/java/org/factcast/server/ui/config/FileSystemReportStoreConfiguration.java
@@ -26,7 +26,7 @@
 
 @Configuration
 public class FileSystemReportStoreConfiguration {
-  @Value("${factcast.ui.reports.path:factcast-ui/reports}")
+  @Value("${factcast.ui.report.store.path:/tmp/factcast-ui/report}")
   String reportsPath;
 
   @Bean
diff --git a/factcast-server-ui/src/test/resources/application.properties b/factcast-server-ui/src/test/resources/application.properties
index d1660d755d..98cb877090 100644
--- a/factcast-server-ui/src/test/resources/application.properties
+++ b/factcast-server-ui/src/test/resources/application.properties
@@ -6,4 +6,4 @@ factcast.security.enabled=false
 factcast.store.schemaRegistryUrl=classpath:example-registry
 factcast.grpc.bandwidth.disabled=true
 spring.datasource.tomcat.connectionProperties=ApplicationName=example-fact-explorer;
-factcast.ui.reports.path=src/test/resources/reports
\ No newline at end of file
+factcast.ui.report.store.path=src/test/resources/reports
diff --git a/factcast-site/documentation-docsy/content/en/Setup/properties.md b/factcast-site/documentation-docsy/content/en/Setup/properties.md
index a7d6a39d31..9caa9347a9 100755
--- a/factcast-site/documentation-docsy/content/en/Setup/properties.md
+++ b/factcast-site/documentation-docsy/content/en/Setup/properties.md
@@ -168,8 +168,10 @@ grpc.server.permit-keep-alive-time=100
 
 ### UI
 
-| Property              | Description                                                                                                            | Default |
-| --------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------ |
-| vaadin.productionMode | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail. | false   |
+| Property                      | Description                                                                                                                  | Default                 |
+| ----------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------- |
+| vaadin.productionMode         | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail.       | false                   |
+| factcast.ui.report.store.path | The path under which reports are stored if no external ReportStore is configured.                                            | /tmp/factcast-ui/report |
+| factcast.ui.report.store.s3   | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. This overrides factcast.ui.report.store.path |                         |
 
 Further details can be found here : `net.devh.boot.grpc.server.config.GrpcServerProperties`.
diff --git a/factcast-site/documentation-docsy/content/en/UI/Setup/_index.md b/factcast-site/documentation-docsy/content/en/UI/Setup/_index.md
index 5e3542a5ef..198d288828 100755
--- a/factcast-site/documentation-docsy/content/en/UI/Setup/_index.md
+++ b/factcast-site/documentation-docsy/content/en/UI/Setup/_index.md
@@ -10,3 +10,6 @@ This section will walk you through the many options of how to setup and operate
 First, decide for a [deployment-option](deployment-options) and configure the [necessary Vaadin property](properties).
 
 Also there are several options regarding [Security](security).
+
+If you want to persist reports generated by users somewhere else than on the instance's filesystem take a look at
+[Report Storage](report-storage).
diff --git a/factcast-site/documentation-docsy/content/en/UI/Setup/properties.md b/factcast-site/documentation-docsy/content/en/UI/Setup/properties.md
index b49f3e07f5..757731ae3a 100755
--- a/factcast-site/documentation-docsy/content/en/UI/Setup/properties.md
+++ b/factcast-site/documentation-docsy/content/en/UI/Setup/properties.md
@@ -9,6 +9,8 @@ description: Properties you want to use to configure FactCast UI.
 
 This setting should be set in every instance that factcast-server-ui is part of.
 
-| Property              | Description                                                                                                            | Default |
-| --------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------ |
-| vaadin.productionMode | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail. | false   |
+| Property                      | Description                                                                                                                  | Default                 |
+| ----------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------- |
+| vaadin.productionMode         | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail.       | false                   |
+| factcast.ui.report.store.path | The path under which reports are stored if no external ReportStore is configured.                                            | /tmp/factcast-ui/report |
+| factcast.ui.report.store.s3   | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. This overrides factcast.ui.report.store.path |                         |
diff --git a/factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md b/factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
new file mode 100644
index 0000000000..8f26d69206
--- /dev/null
+++ b/factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
@@ -0,0 +1,78 @@
+---
+title: "Report Storage"
+type: docs
+weight: 300
+description: "Persist the results of your fact queries for future analysis."
+---
+
+The FactCast-Server UI comes with a report page that saves the result of your query for future usage. Generated reports
+are only visible for the user that created them and can be downloaded and deleted at any time.
+
+### Filesystem Storage
+
+Per default reports are stored on the filesystem of the instance that is running the FactCast-Server UI. The path can be
+configured using the `factcast.ui.report.store.path` property.
+This setup has the downside that reports are lost when the instance is restarted or the filesystem is wiped, as well as
+that large amounts of reports can fill up the disk. Because of this, it is recommended to use an external ReportStore.
+
+### S3 Report Store
+
+The recommended way to use the FactCast-Server UI Reports page is to store reports in an S3 bucket. To enable this, you
+can use the `factcast-server-ui-s3-reportstore` module by importing it as a dependency in your project.
+
+```xml
+
+<dependency>
+    <groupId>org.factcast</groupId>
+    <artifactId>factcast-server-ui-s3-reportstore</artifactId>
+    <version>${factcast.version}</version>
+</dependency>
+```
+
+When setting up the S3 Bucket ensure the following permissions are granted to your server instance:
+
+```json
+[
+  {
+    effect: Effect.ALLOW,
+    actions: [
+      's3:GetObject',
+      's3:GetObjectVersion',
+      's3:PutObject',
+      's3:DeleteObject'
+    ],
+    resources: [
+      `
+    arn: aws
+    :
+    s3:
+    :
+    :
+    <reportBucketName>
+    `
+  ],
+  },
+  {
+    effect: Effect.ALLOW,
+    actions: [
+      's3:ListBucket'
+    ],
+    resources: [
+      `
+    arn: aws
+    :
+    s3:
+    :
+    :
+    <reportBucketName>
+    `
+  ],
+  }
+]
+```
+
+Finally in the `application.properties` file, configure the following properties:
+
+| Property                    | Description                                                                     | Default |
+| --------------------------- | :------------------------------------------------------------------------------ | :------ |
+| factcast.ui.report.store.s3 | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. | -/-     |
diff --git a/factcast-site/documentation-docsy/content/en/UI/ui.png b/factcast-site/documentation-docsy/content/en/UI/ui.png
index a66bae393d..689f0a2602 100644
Binary files a/factcast-site/documentation-docsy/content/en/UI/ui.png and b/factcast-site/documentation-docsy/content/en/UI/ui.png differ


Reviews:
user: login: uweschaefer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-11T09:43:08Z
user: login: uweschaefer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-11T09:47:23Z
user: login: uweschaefer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-11T09:47:57Z
user: login: uweschaefer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-11T09:49:45Z
user: login: mamup11
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T10:06:31Z
user: login: uweschaefer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-11T10:15:13Z

Review comments:
diff_hunk: @@ -0,0 +1,57 @@
+---
+title: "Report Storage"
+type: docs
+weight: 300
+description: "Persist the results of your fact queries for future analysis."
+---
+
+The FactCast-Server UI comes with a report page that saves the result of your query for future usage. Generated reports
+are only visible for the user that created them and can be downloaded and deleted at any time.
+
+### Filesystem Storage
+
+Per default reports are stored on the filesystem of the instance that is running the FactCast-Server UI. The path can be
+configured using the `factcast.ui.reports.path` property.
+This setup has the downside that reports are lost when the instance is restarted or the filesystem is wiped, as well as
+that large amounts of reports can fill up the disk. Because of this, it is recommended to use an external ReportStore.
+
+### S3 Report Store
+
+The recommended way to use the FactCast-Server UI Reports page is to store reports in an S3 bucket. To enable this, you
+can use the `factcast-server-ui-s3-reportstore` module by importing it as a dependency in your project.
+
+```xml
+<dependency>
+    <groupId>org.factcast</groupId>
+    <artifactId>factcast-server-ui-s3-reportstore</artifactId>
+    <version>${factcast.version}</version>
+</dependency>
+```
+
+When setting up the S3 Bucket ensure the following permissions are granted to your server instance:
+
+```json
+[
+  {
+      effect: Effect.ALLOW,
+      actions: [
+        's3:GetObject',
+        's3:GetObjectVersion',
+        's3:PutObject',
+        's3:DeleteObject',
+      ],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    },
+    {
+      effect: Effect.ALLOW,
+      actions: ['s3:ListBucket'],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    }
+]
+```
+
+Finally in the `application.properties` file, configure the following properties:
+
+| Property              | Description                                                                     | Default |
+| --------------------- | :------------------------------------------------------------------------------ | :------ |
+| factcast.ui.s3.bucket | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. | -/-     |
path: factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
user: login: uweschaefer
body: would it be ok, if i renamed that to *factcast.ui.report.store.s3* in another PR?
created_at: 2025-03-11T09:43:07Z
author_association: MEMBER
diff_hunk: @@ -9,6 +9,7 @@ description: Properties you want to use to configure FactCast UI.
 
 This setting should be set in every instance that factcast-server-ui is part of.
 
-| Property              | Description                                                                                                            | Default |
-| --------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------ |
-| vaadin.productionMode | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail. | false   |
+| Property                 | Description                                                                                                                                 | Default             |
+| ------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------ |
+| vaadin.productionMode    | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail.                      | false               |
+| factcast.ui.reports.path | The path under which reports are stored if no external ReportStore is configured. Set to a location within `/tmp` for readonly filesystems. | factcast-ui/reports |
path: factcast-site/documentation-docsy/content/en/UI/Setup/properties.md
user: login: uweschaefer
body: ```suggestion
| factcast.ui.report.path | The path under which reports are stored if no external ReportStore is configured. | /tmp/factcast-ui/report |
```
The readonly aspect is probably internal, you could argue with file-system permission as well. I suggest defaulting to /tmp/. Would need to be updated in the code, of course
created_at: 2025-03-11T09:47:23Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,57 @@
+---
+title: "Report Storage"
+type: docs
+weight: 300
+description: "Persist the results of your fact queries for future analysis."
+---
+
+The FactCast-Server UI comes with a report page that saves the result of your query for future usage. Generated reports
+are only visible for the user that created them and can be downloaded and deleted at any time.
+
+### Filesystem Storage
+
+Per default reports are stored on the filesystem of the instance that is running the FactCast-Server UI. The path can be
+configured using the `factcast.ui.reports.path` property.
+This setup has the downside that reports are lost when the instance is restarted or the filesystem is wiped, as well as
+that large amounts of reports can fill up the disk. Because of this, it is recommended to use an external ReportStore.
+
+### S3 Report Store
+
+The recommended way to use the FactCast-Server UI Reports page is to store reports in an S3 bucket. To enable this, you
+can use the `factcast-server-ui-s3-reportstore` module by importing it as a dependency in your project.
+
+```xml
+<dependency>
+    <groupId>org.factcast</groupId>
+    <artifactId>factcast-server-ui-s3-reportstore</artifactId>
+    <version>${factcast.version}</version>
+</dependency>
+```
+
+When setting up the S3 Bucket ensure the following permissions are granted to your server instance:
+
+```json
+[
+  {
+      effect: Effect.ALLOW,
+      actions: [
+        's3:GetObject',
+        's3:GetObjectVersion',
+        's3:PutObject',
+        's3:DeleteObject',
+      ],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    },
+    {
+      effect: Effect.ALLOW,
+      actions: ['s3:ListBucket'],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    }
+]
+```
+
+Finally in the `application.properties` file, configure the following properties:
+
+| Property              | Description                                                                     | Default |
+| --------------------- | :------------------------------------------------------------------------------ | :------ |
+| factcast.ui.s3.bucket | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. | -/-     |
path: factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
user: login: uweschaefer
body: ```suggestion
| factcast.ui.report.store.s3 | The name of the S3 Bucket in which the reports are stored by the S3ReportStore. | -/-     |
```
created_at: 2025-03-11T09:47:56Z
author_association: MEMBER
diff_hunk: @@ -9,6 +9,7 @@ description: Properties you want to use to configure FactCast UI.
 
 This setting should be set in every instance that factcast-server-ui is part of.
 
-| Property              | Description                                                                                                            | Default |
-| --------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------ |
-| vaadin.productionMode | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail. | false   |
+| Property                 | Description                                                                                                                                 | Default             |
+| ------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------ |
+| vaadin.productionMode    | Should be set to true, otherwise vaadin tries to generate a dev bundle which is not necessary, and probably will fail.                      | false               |
+| factcast.ui.reports.path | The path under which reports are stored if no external ReportStore is configured. Set to a location within `/tmp` for readonly filesystems. | factcast-ui/reports |
path: factcast-site/documentation-docsy/content/en/UI/Setup/properties.md
user: login: uweschaefer
body: factcast.ui.report.store.s3 needs to be mentioned here as well.
created_at: 2025-03-11T09:49:45Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,57 @@
+---
+title: "Report Storage"
+type: docs
+weight: 300
+description: "Persist the results of your fact queries for future analysis."
+---
+
+The FactCast-Server UI comes with a report page that saves the result of your query for future usage. Generated reports
+are only visible for the user that created them and can be downloaded and deleted at any time.
+
+### Filesystem Storage
+
+Per default reports are stored on the filesystem of the instance that is running the FactCast-Server UI. The path can be
+configured using the `factcast.ui.reports.path` property.
+This setup has the downside that reports are lost when the instance is restarted or the filesystem is wiped, as well as
+that large amounts of reports can fill up the disk. Because of this, it is recommended to use an external ReportStore.
+
+### S3 Report Store
+
+The recommended way to use the FactCast-Server UI Reports page is to store reports in an S3 bucket. To enable this, you
+can use the `factcast-server-ui-s3-reportstore` module by importing it as a dependency in your project.
+
+```xml
+<dependency>
+    <groupId>org.factcast</groupId>
+    <artifactId>factcast-server-ui-s3-reportstore</artifactId>
+    <version>${factcast.version}</version>
+</dependency>
+```
+
+When setting up the S3 Bucket ensure the following permissions are granted to your server instance:
+
+```json
+[
+  {
+      effect: Effect.ALLOW,
+      actions: [
+        's3:GetObject',
+        's3:GetObjectVersion',
+        's3:PutObject',
+        's3:DeleteObject',
+      ],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    },
+    {
+      effect: Effect.ALLOW,
+      actions: ['s3:ListBucket'],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    }
+]
+```
+
+Finally in the `application.properties` file, configure the following properties:
+
+| Property                    | Description                                                                     | Default |
path: factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
user: login: mamup11
body: This should be in the properties file, right?
created_at: 2025-03-11T10:06:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+---
+title: "Report Storage"
+type: docs
+weight: 300
+description: "Persist the results of your fact queries for future analysis."
+---
+
+The FactCast-Server UI comes with a report page that saves the result of your query for future usage. Generated reports
+are only visible for the user that created them and can be downloaded and deleted at any time.
+
+### Filesystem Storage
+
+Per default reports are stored on the filesystem of the instance that is running the FactCast-Server UI. The path can be
+configured using the `factcast.ui.reports.path` property.
+This setup has the downside that reports are lost when the instance is restarted or the filesystem is wiped, as well as
+that large amounts of reports can fill up the disk. Because of this, it is recommended to use an external ReportStore.
+
+### S3 Report Store
+
+The recommended way to use the FactCast-Server UI Reports page is to store reports in an S3 bucket. To enable this, you
+can use the `factcast-server-ui-s3-reportstore` module by importing it as a dependency in your project.
+
+```xml
+<dependency>
+    <groupId>org.factcast</groupId>
+    <artifactId>factcast-server-ui-s3-reportstore</artifactId>
+    <version>${factcast.version}</version>
+</dependency>
+```
+
+When setting up the S3 Bucket ensure the following permissions are granted to your server instance:
+
+```json
+[
+  {
+      effect: Effect.ALLOW,
+      actions: [
+        's3:GetObject',
+        's3:GetObjectVersion',
+        's3:PutObject',
+        's3:DeleteObject',
+      ],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    },
+    {
+      effect: Effect.ALLOW,
+      actions: ['s3:ListBucket'],
+      resources: [`arn:aws:s3:::<reportBucketName>`],
+    }
+]
+```
+
+Finally in the `application.properties` file, configure the following properties:
+
+| Property                    | Description                                                                     | Default |
path: factcast-site/documentation-docsy/content/en/UI/Setup/report_storage.md
user: login: uweschaefer
body: added it there as well.
created_at: 2025-03-11T10:15:13Z
author_association: MEMBER

PR comments:
user: login: codecov[bot]
created_at: 2025-03-10T14:03:20Z
body: ## [Codecov](https://app.codecov.io/gh/factcast/factcast/pull/3512?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=factcast) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 89.40%. Comparing base [(`03be437`)](https://app.codecov.io/gh/factcast/factcast/commit/03be437bae1ee6df573560aa01510c3c466f7f8e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=factcast) to head [(`2197c5a`)](https://app.codecov.io/gh/factcast/factcast/commit/2197c5add672f331f01277e9c0a3c8cabc807619?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=factcast).
> Report is 14 commits behind head on master.

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##             master    #3512      +/-   ##
============================================
- Coverage     89.41%   89.40%   -0.01%     
+ Complexity     2323     2322       -1     
============================================
  Files           370      370              
  Lines          8410     8410              
  Branches        612      612              
============================================
- Hits           7519     7518       -1     
- Misses          698      699       +1     
  Partials        193      193              
```

</details>
<details><summary>🚀 New features to boost your workflow: </summary>

- ❄ [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- 📦 [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-03-11T10:39:35Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=factcast&pullRequest=3512) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=factcast&pullRequest=3512&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=factcast&pullRequest=3512&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=factcast&pullRequest=3512&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=factcast&pullRequest=3512&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=factcast&pullRequest=3512&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=factcast&pullRequest=3512)


author_association: NONE