| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <title>Distributed James Server — blobstore.properties :: Apache James</title> |
| <meta name="generator" content="Antora 3.1.2"> |
| <link rel="stylesheet" href="../../../_/css/site.css"> |
| </head> |
| <body class="article"> |
| <header class="header"> |
| <nav class="navbar"> |
| <div class="navbar-brand"> |
| <a class="navbar-item" href="https://james.apache.org"><img src="/_/img/james.svg" alt="james logo"> Apache James</a> |
| <button class="navbar-burger" data-target="topbar-nav"> |
| <span></span> |
| <span></span> |
| <span></span> |
| </button> |
| </div> |
| <div id="topbar-nav" class="navbar-menu"> |
| <div class="navbar-end"> |
| <a class="navbar-item" href="#">Home</a> |
| <div class="navbar-item has-dropdown is-hoverable"> |
| <a class="navbar-link" href="#">Products</a> |
| <div class="navbar-dropdown"> |
| <div class="navbar-item"><strong>James server</strong></div> |
| <a class="navbar-item" href="https://github.com/apache/james-project">Repository</a> |
| <a class="navbar-item" href="https://issues.apache.org/jira/projects/JAMES/issues">Issue Tracker</a> |
| <hr class="navbar-divider"> |
| <a class="navbar-item" href="https://james.apache.org/mime4j/index.html">Mime4J</a> |
| <a class="navbar-item" href="https://james.apache.org/jsieve/index.html">jSieve</a> |
| <a class="navbar-item" href="https://james.apache.org/jspf/index.html">jSPF</a> |
| <a class="navbar-item" href="https://james.apache.org/jdkim/index.html">jDKIM</a> |
| <a class="navbar-item" href="https://james.apache.org/hupa/index.html">HUPA</a> |
| </div> |
| </div> |
| <div class="navbar-item has-dropdown is-hoverable"> |
| <a class="navbar-link" href="#">Community</a> |
| <div class="navbar-dropdown"> |
| <!-- Not ideal but dropping the version in the href requires tweaking james-projet docs module first --> |
| <a class="navbar-item" href="/james-project/3.6.0/community/mailing-lists.html">Mailing lists</a> |
| <a class="navbar-item" href="https://gitter.im/apache/james-project"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" class="logo-gitter-sign" data-v-44ebcb1a=""><rect x="15" y="5" width="2" height="10"></rect> <rect x="10" y="5" width="2" height="20"></rect> <rect x="5" y="5" width="2" height="20"></rect> <rect width="2" height="15"></rect></svg> Gitter</a> |
| <a class="navbar-item" href="https://twitter.com/ApacheJames"> |
| <span class="icon"> |
| <svg aria-hidden="true" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> |
| <path fill="#57aaee" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> |
| </svg> |
| </span> Twitter |
| </a> |
| <a class="navbar-item" href="#"> <svg class="octicon octicon-mark-github v-align-middle" viewBox="0 0 16 16" version="1.1" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg> Github</a> |
| </div> |
| </div> |
| <!-- <div class="navbar-item"> |
| <span class="control"> |
| <a class="button is-primary" href="#">Download</a> |
| </span> |
| </div> --> |
| </div> |
| </div> |
| </nav> |
| </header> |
| <div class="body"> |
| <div class="nav-container" data-component="james-distributed-app" data-version="3.8.0"> |
| <aside class="nav"> |
| <div class="panels"> |
| <div class="nav-panel-menu is-active" data-panel="menu"> |
| <nav class="nav-menu"> |
| <button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button> |
| <h3 class="title"><a href="../index.html">Apache James Distributed Server</a></h3> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="0"> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../index.html">Distributed James Application</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../objectives.html">Objectives and motivation</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../architecture/index.html">Architecture</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../architecture/implemented-standards.html">Implemented standards</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../architecture/consistency-model.html">Consistency Model</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../architecture/specialized-instances.html">Specialized instances</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../run/index.html">Run</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../run/run-java.html">Run with Java</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../run/run-docker.html">Run with Docker</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../run/run-kubernetes.html">Run with Kubernetes</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../run/k8s-checklist.html">Deployment Checklist</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../run/k8s-logsMetrics.html">Logs & Metrics</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../run/k8s-values.html">values.yaml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../run/k8s-secrets.html">secrets.yaml</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="index.html">Configuration</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Protocols</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="imap.html">imapserver.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="jmap.html">jmap.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="jmx.html">jmx.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="smtp.html">smtpserver.xml & lmtpserver.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="smtp-hooks.html">Packaged SMTP hooks</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="pop3.html">pop3server.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="webadmin.html">webadmin.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="ssl.html">SSL & TLS</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="sieve.html">Sieve & ManageSieve</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Storage dependencies</span> |
| <ul class="nav-list"> |
| <li class="nav-item is-current-page" data-depth="4"> |
| <a class="nav-link" href="blobstore.html">blobstore.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="cassandra.html">cassandra.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="opensearch.html">opensearch.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="rabbitmq.html">rabbitmq.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="redis.html">redis.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="tika.html">tika.properties</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Core components</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="batchsizes.html">batchsizes.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="dns.html">dnsservice.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="domainlist.html">domainlist.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="healthcheck.html">healthcheck.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="mailetcontainer.html">mailetcontainer.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="mailets.html">Packaged Mailets</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="matchers.html">Packaged Matchers</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="mailrepositorystore.html">mailrepositorystore.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="recipientrewritetable.html">recipientrewritetable.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="search.html">search.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="usersrepository.html">usersrepository.xml</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Extensions</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="vault.html">deletedMessageVault.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="extensions.html">extensions.properties</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="listeners.html">listeners.xml</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="spam.html">Anti-Spam setup</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="remote-delivery-error-handling.html">About RemoteDelivery error handling</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="collecting-contacts.html">Contact collection</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="collecting-events.html">Event collection</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="dsn.html">ESMTP DSN support</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../operate/index.html">Operate</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/guide.html">Operator guide</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/performanceChecklist.html">Performance checklist</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/logging.html">Logging</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/webadmin.html">WebAdmin REST administration API</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/metrics.html">Metrics</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/migrating.html">Migrating existing data</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/cli.html">Command Line Interface</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/cassandra-migration.html">Cassandra migration</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../operate/security.html">Security checklist</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../extending/index.html">Extending server behavior</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../extending/mail-processing.html">Custom mail processing components</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../extending/mailbox-listeners.html">Custom Mailbox Listeners</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../extending/smtp-hooks.html">Custom SMTP hooks</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../extending/webadmin-routes.html">Custom WebAdmin routes</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../extending/imap.html">Custom IMAP processing</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../benchmark/index.html">Performance benchmark</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../benchmark/db-benchmark.html">Database benchmarks</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../benchmark/james-benchmark.html">James benchmarks</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </nav> |
| </div> |
| <div class="nav-panel-explore" data-panel="explore"> |
| <div class="context"> |
| <span class="title">Apache James Distributed Server</span> |
| <span class="version">3.8.0 SNAPSHOT</span> |
| </div> |
| <ul class="components"> |
| <li class="component is-current"> |
| <div class="title"><a href="../index.html">Apache James Distributed Server</a></div> |
| <ul class="versions"> |
| <li class="version is-current is-latest"> |
| <a href="../index.html">3.8.0 SNAPSHOT</a> |
| </li> |
| </ul> |
| </li> |
| <li class="component"> |
| <div class="title"><a href="../../../james-project/3.8.0/index.html">Apache James Server</a></div> |
| <ul class="versions"> |
| <li class="version is-latest"> |
| <a href="../../../james-project/3.8.0/index.html">3.8.0 SNAPSHOT</a> |
| </li> |
| <li class="version"> |
| <a href="../../../james-project/3.6.0/index.html">3.6.0 Snapshot</a> |
| </li> |
| </ul> |
| </li> |
| <li class="component"> |
| <div class="title"><a href="../../../james-site/latest/index.html">Apache James Site</a></div> |
| <ul class="versions"> |
| <li class="version is-latest"> |
| <a href="../../../james-site/latest/index.html">latest</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </aside> |
| </div> |
| <main class="article"> |
| <div class="toolbar" role="navigation"> |
| <button class="nav-toggle"></button> |
| <a href="../../../james-site/latest/homepage.html" class="home-link"></a> |
| <nav class="breadcrumbs" aria-label="breadcrumbs"> |
| <ul> |
| <li><a href="../index.html">Apache James Distributed Server</a></li> |
| <li><a href="../index.html">Distributed James Application</a></li> |
| <li><a href="index.html">Configuration</a></li> |
| <li>Storage dependencies</li> |
| <li><a href="blobstore.html">blobstore.properties</a></li> |
| </ul> |
| </nav> |
| <div class="edit-this-page"><a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docs/modules/ROOT/pages/configure/blobstore.adoc">Edit this Page</a></div> |
| </div> |
| <div class="content"> |
| <aside class="toc sidebar" data-title="Contents" data-levels="2"> |
| <div class="toc-menu"></div> |
| </aside> |
| <article class="doc"> |
| <h1 class="page">Distributed James Server — blobstore.properties</h1> |
| <div class="sect1"> |
| <h2 id="_blobstore"><a class="anchor" href="#_blobstore"></a>BlobStore</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This file is optional. If omitted, the <strong>cassandra</strong> blob store will be used.</p> |
| </div> |
| <div class="paragraph"> |
| <p>BlobStore is the dedicated component to store blobs, non-indexable content. |
| James uses the BlobStore for storing blobs which are usually mail contents, attachments, deleted mails…​</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can choose the underlying implementation of BlobStore to fit with your James setup.</p> |
| </div> |
| <div class="paragraph"> |
| <p>It could be the implementation on top of Cassandra or file storage service S3 compatible like Openstack Swift and AWS S3.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Consult <a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/blob.properties">blob.properties</a> |
| in GIT to get some examples and hints.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_implementation_choice"><a class="anchor" href="#_implementation_choice"></a>Implementation choice</h3> |
| <div class="paragraph"> |
| <p><strong>implementation</strong> :</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>cassandra: use cassandra based BlobStore</p> |
| </li> |
| <li> |
| <p>objectstorage: use Swift/AWS S3 based BlobStore</p> |
| </li> |
| <li> |
| <p>file: (experimental) use directly the file system. Useful for legacy architecture based on shared ISCI SANs and/or |
| distributed file system with no object store available.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock warning"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-warning" title="Warning"></i> |
| </td> |
| <td class="content"> |
| JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to |
| Alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>The generated startup warning log can be deactivated via the <code>cassandra.blob.store.disable.startup.warning</code> environment |
| variable being positioned to <code>false</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>deduplication.enable</strong>: Mandatory. Supported value: true and false.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If you choose to enable deduplication, the mails with the same content will be stored only once.</p> |
| </div> |
| <div class="admonitionblock warning"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-warning" title="Warning"></i> |
| </td> |
| <td class="content"> |
| Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all |
| the mails sharing the same content once one is deleted. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| If you are upgrading from James 3.5 or older, the deduplication was enabled. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Deduplication requires a garbage collector mechanism to effectively drop blobs. A first implementation |
| based on bloom filters can be used and triggered using the WebAdmin REST API. See |
| <a href="../operate/webadmin.html#_running_blob_garbage_collection" class="xref page">Running blob garbage collection</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In order to avoid concurrency issues upon garbage collection, we slice the blobs in generation, the two more recent |
| generations are not garbage collected.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>deduplication.gc.generation.duration</strong>: Allow controlling the duration of one generation. Longer implies better deduplication |
| but deleted blobs will live longer. Duration, defaults on 30 days, the default unit is in days.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>deduplication.gc.generation.family</strong>: Every time the duration is changed, this integer counter must be incremented to avoid |
| conflicts. Defaults to 1.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_encryption_choice"><a class="anchor" href="#_encryption_choice"></a>Encryption choice</h3> |
| <div class="paragraph"> |
| <p>Data can be optionally encrypted with a symmetric key using AES before being stored in the blobStore. As many user relies |
| on third party for object storage, a compromised third party will not escalate to a data disclosure. Of course, a |
| performance price have to be paid, as encryption takes resources.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>encryption.aes.enable</strong> : Optional boolean, defaults to false.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If AES encryption is enabled, then the following properties MUST be present:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>encryption.aes.password</strong> : String</p> |
| </li> |
| <li> |
| <p><strong>encryption.aes.salt</strong> : Hexadecimal string</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The following properties CAN be supplied:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>encryption.aes.private.key.algorithm</strong> : String, defaulting to PBKDF2WithHmacSHA512. Previously was |
| PBKDF2WithHmacSHA1.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock warning"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-warning" title="Warning"></i> |
| </td> |
| <td class="content"> |
| Once chosen this choice can not be reverted, all the data is either clear or encrypted. Mixed encryption |
| is not supported. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Here is an example of how you can generate the above values (be mindful to customize the byte lengths in order to add |
| enough entropy.</p> |
| </div> |
| <div class="literalblock"> |
| <div class="content"> |
| <pre># Password generation |
| openssl rand -base64 64 |
| |
| # Salt generation |
| generate salt with : openssl rand -hex 16</pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_cassandra_blobstore_cache"><a class="anchor" href="#_cassandra_blobstore_cache"></a>Cassandra BlobStore Cache</h3> |
| <div class="paragraph"> |
| <p>A Cassandra cache can be enabled to reduce latency when reading small blobs frequently. |
| A dedicated keyspace with a replication factor of one is then used. |
| Cache eviction policy is TTL based. |
| Only blobs below a given threshold will be stored. |
| To be noted that blobs are stored within a single Cassandra row, hence a low threshold should be used.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 1. blobstore.properties cache related content</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Property name</th> |
| <th class="tableblock halign-left valign-top">explanation</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">cache.enable</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">DEFAULT: false, optional, must be a boolean. Whether the cache should be enabled.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">cache.cassandra.ttl</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">DEFAULT: 7 days, optional, must be a duration. Cache eviction policy is TTL based.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">cache.sizeThresholdInBytes</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">DEFAULT: 8192, optional, must be a positive integer. Unit: bytes. |
| Supported units: bytes, Kib, MiB, GiB, TiB |
| Maximum size of stored objects expressed in bytes.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="_object_storage_configuration"><a class="anchor" href="#_object_storage_configuration"></a>Object storage configuration</h3> |
| <div class="sect3"> |
| <h4 id="_aws_s3_configuration"><a class="anchor" href="#_aws_s3_configuration"></a>AWS S3 Configuration</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 2. blobstore.properties S3 related properties</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Property name</th> |
| <th class="tableblock halign-left valign-top">explanation</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.endPoint</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">S3 service endpoint</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.region</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">S3 region</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.accessKeyId</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys">S3 access key id</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.secretKey</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys">S3 access key secret</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.http.concurrency</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Allow setting the number of concurrent HTTP requests allowed by the Netty driver.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.truststore.path</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Verify the S3 server certificate against this trust store file.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.truststore.type</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Specify the type of the trust store, e.g. JKS, PKCS12</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.truststore.secret</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Use this secret/password to access the trust store; default none</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.truststore.algorithm</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Use this specific trust store algorithm; default SunX509</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.trustall</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: boolean. Defaults to false. Cannot be set to true with other trustore options. Wether James should validate |
| S3 endpoint SSL certificates.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.read.timeout</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: HTTP read timeout. duration, default value being second. Leaving it empty relies on S3 driver defaults.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.write.timeout</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: HTTP write timeout. duration, default value being second. Leaving it empty relies on S3 driver defaults.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.connection.timeout</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: HTTP connection timeout. duration, default value being second. Leaving it empty relies on S3 driver defaults.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.in.read.limit</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Object read in memory will be rejected if they exceed the size limit exposed here. Size, exemple <code>100M</code>. |
| Supported units: K, M, G, defaults to B if no unit is specified. If unspecified, big object won’t be prevented |
| from being loaded in memory. This settings complements protocol limits.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.upload.retry.maxAttempts</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Integer. Default is zero. This property specifies the maximum number of retry attempts allowed for failed upload operations.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.s3.upload.retry.backoffDurationMillis</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">optional: Long (Milliseconds). Default is 10 (miliseconds). |
| Only takes effect when the "objectstorage.s3.upload.retry.maxAttempts" property is declared. |
| This property determines the duration (in milliseconds) to wait between retry attempts for failed upload operations. |
| This delay is known as backoff. The jitter factor is 0.5</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect3"> |
| <h4 id="_buckets_configuration"><a class="anchor" href="#_buckets_configuration"></a>Buckets Configuration</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 3. Bucket configuration</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Property name</th> |
| <th class="tableblock halign-left valign-top">explanation</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.bucketPrefix</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Bucket is a concept in James and similar to Containers in Swift or Buckets in AWS S3. |
| BucketPrefix is the prefix of bucket names in James BlobStore</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">objectstorage.namespace</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">BlobStore default bucket name. Most of blobs storing in BlobStore are inside the default bucket. |
| Unless a special case like storing blobs of deleted messages.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_blob_export"><a class="anchor" href="#_blob_export"></a>Blob Export</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Blob Exporting is the mechanism to help James to export a blob from an user to another user. |
| It is commonly used to export deleted messages (consult <a href="/server/config-vault">configuring deleted messages vault</a>). |
| The deleted messages are transformed into a blob and James will export that blob to the target user.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This configuration helps you choose the blob exporting mechanism fit with your James setup and it is only applicable with Guice products.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Consult <a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/blob.properties">blob.properties</a> |
| in GIT to get some examples and hints.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Configuration for exporting blob content:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 4. blobstore.properties content</caption> |
| <colgroup> |
| <col style="width: 100%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">blob.export.implementation</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">localFile: Local File Exporting Mechanism (explained below). Default: localFile</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">linshare: LinShare Exporting Mechanism (explained below)</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="sect2"> |
| <h3 id="_local_file_blob_export_configuration"><a class="anchor" href="#_local_file_blob_export_configuration"></a>Local File Blob Export Configuration</h3> |
| <div class="paragraph"> |
| <p>For each request, this mechanism retrieves the content of a blob and save it to a distinct local file, then send an email containing the absolute path of that file to the target mail address.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Note: that absolute file path is the file location on James server. Therefore, if there are two or more James servers connected, it should not be considered an option.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>blob.export.localFile.directory</strong>: The directory URL to store exported blob data in files, and the URL following |
| <a href="http://james.apache.org/server/3/apidocs/org/apache/james/filesystem/api/FileSystem.html">James File System scheme</a>. |
| Default: <a href="file://var/blobExporting" class="bare">file://var/blobExporting</a></p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_linshare_blob_export_configuration"><a class="anchor" href="#_linshare_blob_export_configuration"></a>LinShare Blob Export Configuration</h3> |
| <div class="paragraph"> |
| <p>Instead of exporting blobs in local file system, using <a href="https://www.linshare.org">LinShare</a> |
| helps you upload your blobs and people you have been shared to can access those blobs by accessing to |
| LinShare server and download them.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This way helps you to share via whole network as long as they can access to LinShare server.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To get an example or details explained, visit <a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/blob.properties">blob.properties</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>blob.export.linshare.url</strong>: The URL to connect to LinShare</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>blob.export.linshare.token</strong>: The authentication token to connect to LinShare</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </article> |
| </div> |
| </main> |
| </div> |
| <footer class="footer"> |
| <p>This page was built using the Antora default UI.</p> |
| <p>The source code for this UI is licensed under the terms of the MPL-2.0 license.</p> |
| </footer> |
| <script id="site-script" src="../../../_/js/site.js" data-ui-root-path="../../../_"></script> |
| <script async src="../../../_/js/vendor/highlight.js"></script> |
| </body> |
| </html> |