You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by bb...@apache.org on 2019/05/21 16:47:36 UTC
svn commit: r1859662 [1/4] - in /nifi/site/trunk/docs/nifi-registry-docs: ./
css/ html/ images/ rest-api/
Author: bbende
Date: Tue May 21 16:47:35 2019
New Revision: 1859662
URL: http://svn.apache.org/viewvc?rev=1859662&view=rev
Log:
NIFIREG-272
Added:
nifi/site/trunk/docs/nifi-registry-docs/html/rest-api.html
nifi/site/trunk/docs/nifi-registry-docs/images/registry-favicon.png (with props)
nifi/site/trunk/docs/nifi-registry-docs/rest-api/rest-api.html
Modified:
nifi/site/trunk/docs/nifi-registry-docs/css/component-usage.css
nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html
nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html
nifi/site/trunk/docs/nifi-registry-docs/html/user-guide.html
nifi/site/trunk/docs/nifi-registry-docs/index.html
Modified: nifi/site/trunk/docs/nifi-registry-docs/css/component-usage.css
URL: http://svn.apache.org/viewvc/nifi/site/trunk/docs/nifi-registry-docs/css/component-usage.css?rev=1859662&r1=1859661&r2=1859662&view=diff
==============================================================================
--- nifi/site/trunk/docs/nifi-registry-docs/css/component-usage.css (original)
+++ nifi/site/trunk/docs/nifi-registry-docs/css/component-usage.css Tue May 21 16:47:35 2019
@@ -26,6 +26,7 @@ body {
margin: 0 auto;
display: block;
font-family: "Open Sans","DejaVu Sans",sans-serif;
+ padding-left: 20px;
}
.title {
@@ -113,14 +114,22 @@ table tr:last-child td:last-child {
border-bottom-right-radius:3px;
}
-td#allowable-values, td#default-value, td#name, td#value {
+td#default-value, td#name, td#value {
max-width: 200px;
}
+td#allowable-values {
+ max-width: 300px;
+}
+
td#description {
vertical-align: middle;
}
+td#bundle-info {
+ max-width: 50px;
+}
+
/* links */
a, a:link, a:visited {
@@ -180,4 +189,4 @@ pre {
color: #555;
margin-bottom: 10px;
padding: 5px 8px;
-}
\ No newline at end of file
+}
Modified: nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html
URL: http://svn.apache.org/viewvc/nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html?rev=1859662&r1=1859661&r2=1859662&view=diff
==============================================================================
--- nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html (original)
+++ nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html Tue May 21 16:47:35 2019
@@ -468,6 +468,7 @@ body.book #toc,body.book #preamble,body.
<ul class="sectlevel2">
<li><a href="administration-guide.html#authorizer-configuration">Authorizer Configuration</a></li>
<li><a href="administration-guide.html#authorizers-setup">Authorizers.xml Setup</a></li>
+<li><a href="administration-guide.html#access-policies">Access Policies</a></li>
</ul>
</li>
<li><a href="administration-guide.html#encrypted-passwords-in-configuration-files">Encrypted Passwords in Configuration Files</a>
@@ -487,18 +488,23 @@ body.book #toc,body.book #preamble,body.
<ul class="sectlevel2">
<li><a href="administration-guide.html#web-properties">Web Properties</a></li>
<li><a href="administration-guide.html#security-properties">Security Properties</a></li>
+<li><a href="administration-guide.html#identity-mapping-properties">Identity Mapping Properties</a></li>
<li><a href="administration-guide.html#providers-properties">Providers Properties</a></li>
+<li><a href="administration-guide.html#alias-properties">Alias Properties</a></li>
<li><a href="administration-guide.html#database-properties">Database Properties</a></li>
<li><a href="administration-guide.html#extension-directories">Extension Directories</a></li>
<li><a href="administration-guide.html#kerberos_properties">Kerberos Properties</a></li>
</ul>
</li>
+<li><a href="administration-guide.html#metadata-database">Metadata Database</a></li>
+<li><a href="administration-guide.html#h2">H2</a></li>
+<li><a href="administration-guide.html#postgres">Postgres</a></li>
+<li><a href="administration-guide.html#mysql">MySQL</a></li>
+<li><a href="administration-guide.html#schema-differences-limitations">Schema Differences & Limitations</a></li>
<li><a href="administration-guide.html#persistence-providers">Persistence Providers</a>
<ul class="sectlevel2">
-<li><a href="administration-guide.html#filesystemflowpersistenceprovider">FileSystemFlowPersistenceProvider</a></li>
-<li><a href="administration-guide.html#gitflowpersistenceprovider">GitFlowPersistenceProvider</a></li>
-<li><a href="administration-guide.html#switching-from-other-persistence-provider">Switching from other Persistence Provider</a></li>
-<li><a href="administration-guide.html#data-model-version-of-serialized-flow-snapshots">Data model version of serialized Flow snapshots</a></li>
+<li><a href="administration-guide.html#flow-persistence-providers">Flow Persistence Providers</a></li>
+<li><a href="administration-guide.html#bundle-persistence-providers">Bundle Persistence Providers</a></li>
</ul>
</li>
<li><a href="administration-guide.html#event-hooks">Event Hooks</a>
@@ -508,6 +514,15 @@ body.book #toc,body.book #preamble,body.
<li><a href="administration-guide.html#loggingeventhookprovider">LoggingEventHookProvider</a></li>
</ul>
</li>
+<li><a href="administration-guide.html#url-aliasing">URL Aliasing</a></li>
+<li><a href="administration-guide.html#backup-recovery">Backup & Recovery</a>
+<ul class="sectlevel2">
+<li><a href="administration-guide.html#metadata-database-2">Metadata Database</a></li>
+<li><a href="administration-guide.html#persistence-providers-2">Persistence Providers</a></li>
+<li><a href="administration-guide.html#bundle-persistence">Bundle Persistence</a></li>
+<li><a href="administration-guide.html#configuration-files">Configuration Files</a></li>
+</ul>
+</li>
</ul>
</div>
</div>
@@ -1665,6 +1680,131 @@ from an attribute in a LDAP entry based
</div>
</div>
</div>
+<div class="sect2">
+<h3 id="access-policies"><a class="anchor" href="administration-guide.html#access-policies"></a>Access Policies</h3>
+<div class="paragraph">
+<p>You can manage the ability for users and groups to view or modify NiFi Registry resources using 'access policies'. Access policies can be created to control access to buckets, as well as to grant special privileges to users for managing a NiFi Registry instance.</p>
+</div>
+<div class="sect3">
+<h4 id="bucket-policies"><a class="anchor" href="administration-guide.html#bucket-policies"></a>Bucket Policies</h4>
+<div class="paragraph">
+<p>Bucket policies govern the following bucket level authorizations:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 33%;">
+<col style="width: 33%;">
+<col style="width: 33%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Policy</th>
+<th class="tableblock halign-left valign-top">Privilege</th>
+<th class="tableblock halign-left valign-top">Resource Descriptor</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Read Bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to read items in the bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets/<bucket-UUID>" action="R"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Write Bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to write items to the bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets/<bucket-UUID>" action="W"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Delete Bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to delete the bucket</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets/<bucket-UUID>" action="D"</code></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect3">
+<h4 id="special-privilege-policies"><a class="anchor" href="administration-guide.html#special-privilege-policies"></a>Special Privilege Policies</h4>
+<div class="paragraph">
+<p>Special privilege policies govern the following system level authorizations:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 33%;">
+<col style="width: 33%;">
+<col style="width: 33%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Policy</th>
+<th class="tableblock halign-left valign-top">Privilege</th>
+<th class="tableblock halign-left valign-top">Resource Descriptor</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Buckets (Read)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to read from all buckets</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets" action="R"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Buckets (Write)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to write to all buckets</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets" action="W"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Buckets (Delete)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to delete all buckets</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/buckets" action="D"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Users (Read)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to view users</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/tenants" action="R"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Users (Write)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to create and modify users</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/tenants" action="W"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Users (Delete)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to delete users</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/tenants" action="D"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Policies (Read)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to view policies</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/policies" action="R"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Policies (Write)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to create and modify policies</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/policies" action="W"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Manage Policies (Delete)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to delete policies</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/policies" action="D"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Can Proxy Requests</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to proxy requests</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/proxy" action="W"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">View Swagger</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to access the self-hosted Swagger UI</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/swagger" action="R"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">View Actuator</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows users to access the Spring Boot Actuator end-points</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>resource="/actuator" action="R"</code></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
</div>
</div>
<div class="sect1">
@@ -2180,6 +2320,65 @@ Values for periods of time and data size
</table>
</div>
<div class="sect2">
+<h3 id="identity-mapping-properties"><a class="anchor" href="administration-guide.html#identity-mapping-properties"></a>Identity Mapping Properties</h3>
+<div class="paragraph">
+<p>These properties can be utilized to normalize user identities. When implemented, identities authenticated by different identity providers (certificates, LDAP, Kerberos) are treated the same internally in NiFi Registry. As a result, duplicate users are avoided and user-specific configurations such as authorizations only need to be setup once per user.</p>
+</div>
+<div class="paragraph">
+<p>The following examples demonstrate normalizing DNs from certificates and principals from Kerberos:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>nifi.registry.security.identity.mapping.pattern.dn=^CN=(.*?), OU=(.*?), O=(.*?), L=(.*?), ST=(.*?), C=(.*?)$
+nifi.registry.security.identity.mapping.value.dn=$1@$2
+nifi.registry.security.identity.mapping.transform.dn=NONE
+nifi.registry.security.identity.mapping.pattern.kerb=^(.*?)/instance@(.*?)$
+nifi.registry.security.identity.mapping.value.kerb=$1@$2
+nifi.registry.security.identity.mapping.transform.kerb=NONE</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The last segment of each property is an identifier used to associate the pattern with the replacement value. When a user makes a request to NiFi Registry, their identity is checked to see if it matches each of those patterns in lexicographical order. For the first one that matches, the replacement specified in the <code>nifi.registry.security.identity.mapping.value.xxxx</code> property is used. So a login with <code>CN=localhost, OU=Apache NiFi, O=Apache, L=Santa Monica, ST=CA, C=US</code> matches the DN mapping pattern above and the DN mapping value <code>$1@$2</code> is applied. The user is normalized to <code>localhost@Apache NiFi</code>.</p>
+</div>
+<div class="paragraph">
+<p>In addition to mapping, a transform may be applied. The supported versions are <code>NONE</code> (no transform applied), <code>LOWER</code> (identity lowercased), and <code>UPPER</code> (identity uppercased). If not specified, the default value is <code>NONE</code>.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+These mappings are also applied to the "Initial Admin Identity" in the <em>authorizers.xml</em> file, as well as users imported from LDAP (See <a href="administration-guide.html#authorizers-setup">Authorizers.xml Setup</a>).
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Group names can also be mapped. The following example will accept the existing group name but will lowercase it. This may be helpful when used in conjunction with an external authorizer.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>nifi.registry.security.group.mapping.pattern.anygroup=^(.*)$
+nifi.registry.security.group.mapping.value.anygroup=$1
+nifi.registry.security.group.mapping.transform.anygroup=LOWER</pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+These mappings are applied to groups imported from LDAP.
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect2">
<h3 id="providers-properties"><a class="anchor" href="administration-guide.html#providers-properties"></a>Providers Properties</h3>
<div class="paragraph">
<p>These properties pertain to flow persistence providers. NiFi Registry uses a pluggable flow persistence provider to store the
@@ -2203,6 +2402,28 @@ content of the flows saved to the regist
</table>
</div>
<div class="sect2">
+<h3 id="alias-properties"><a class="anchor" href="administration-guide.html#alias-properties"></a>Alias Properties</h3>
+<div class="paragraph">
+<p>These properties pertain to the support for URL aliasing. For further details, refer to <a href="administration-guide.html#url-aliasing">URL Aliasing</a>.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.registry.alias.configuration.file</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">This is the location of the file where URL aliases are configured. The default value is <code>./conf/registry-aliases.xml</code>.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
<h3 id="database-properties"><a class="anchor" href="administration-guide.html#database-properties"></a>Database Properties</h3>
<div class="paragraph">
<p>These properties define the settings for the Registry database, which keeps track of metadata about buckets and all items stored in buckets.</p>
@@ -2257,15 +2478,15 @@ is configured via the following properti
<td class="tableblock halign-left valign-top"><p class="tableblock">An optional directory containing one or more JARs to add to the classpath. If not specified, it is assumed that the driver JAR is already on the classpath by copying it to the <code>lib</code> directory. The H2 driver is bundled with Registry so it is not necessary to do anything for the default case.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.driver.username</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.username</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The username for the database. The default value is <code>nifireg</code>.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.driver.password</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.password</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The password for the database. The default value is <code>nifireg</code>.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.driver.maxConnections</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>nifi.registry.db.maxConnections</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The max number of connections for the connection pool. The default value is <code>5</code>.</p></td>
</tr>
<tr>
@@ -2364,35 +2585,283 @@ providing 2 total locations, including <
</div>
</div>
<div class="sect1">
+<h2 id="metadata-database"><a class="anchor" href="administration-guide.html#metadata-database"></a>Metadata Database</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The metadata database maintains the knowledge of which buckets exist, which versioned items belong to which buckets, as well as the version history for each item.</p>
+</div>
+<div class="paragraph">
+<p>Currently, NiFi Registry supports using H2, Postgres 9.x, and MySQL (5.6, 5.7, 8.0) for the relational database engine.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+NiFi Registry 0.1.0 only supports H2.
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="h2"><a class="anchor" href="administration-guide.html#h2"></a>H2</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>H2 is an embedded database that is pre-configured in the default <em>nifi-registry.properties</em> file. The contents of the H2 database are stored in a file on the local filesystem.</p>
+</div>
+<div class="paragraph">
+<p>For NiFi Registry 0.1.0, the location of the H2 database is specified by the property:</p>
+</div>
+<div class="paragraph">
+<p><code>nifi.registry.db.directory=./database</code></p>
+</div>
+<div class="paragraph">
+<p>For NiFi Registry 0.2.0 and forward, the location of the H2 database is specified as part of the JDBC URL property:</p>
+</div>
+<div class="paragraph">
+<p><code>nifi.registry.db.url=jdbc:h2:./database/nifi-registry-primary;</code></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="postgres"><a class="anchor" href="administration-guide.html#postgres"></a>Postgres</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Postgres provides the option to use an externally located database that also supports high availability.</p>
+</div>
+<div class="paragraph">
+<p>The following steps are required to use Postgres:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Download the Postgres JDBC driver and place it somewhere accessible to NiFi Registry</p>
+<div class="literalblock">
+<div class="content">
+<pre>/path/to/drivers/postgresql-42.2.2.jar</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Create a database inside Postgres</p>
+<div class="literalblock">
+<div class="content">
+<pre>createdb nifireg</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Create a database user and grant privileges</p>
+<div class="literalblock">
+<div class="content">
+<pre>psql nifireg
+CREATE USER nifireg WITH PASSWORD 'changeme';
+GRANT ALL PRIVILEGES ON DATABASE nifireg to nifireg;
+\q</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Configure the database properties in <em>nifi-registry.properties</em></p>
+<div class="literalblock">
+<div class="content">
+<pre>nifi.registry.db.url=jdbc:postgresql://<POSTGRES-HOSTNAME>/nifireg
+nifi.registry.db.driver.class=org.postgresql.Driver
+nifi.registry.db.driver.directory=/path/to/drivers
+nifi.registry.db.username=nifireg
+nifi.registry.db.password=changeme</pre>
+</div>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="mysql"><a class="anchor" href="administration-guide.html#mysql"></a>MySQL</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>MySQL also provides the option to use an externally located database that also supports high availability.</p>
+</div>
+<div class="paragraph">
+<p>The following steps are required to use MySQL:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Download the MySQL JDBC driver and place it somewhere accessible to NiFi Registry</p>
+<div class="literalblock">
+<div class="content">
+<pre>/path/to/drivers/mysql-connector-java-8.0.16.jar</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Create a database inside MySQL (enter mysql shell using <code>mysql -u root -p</code></p>
+<div class="literalblock">
+<div class="content">
+<pre>CREATE DATABASE nifi_registry;</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Create a database user and grant privileges (for remote users, use <code>nifireg'@'<IP-ADDRESS></code>, or <code>nifireg'@'%</code> for any remote host)</p>
+<div class="literalblock">
+<div class="content">
+<pre>GRANT ALL PRIVILEGES ON nifi_registry.* TO 'nifireg'@'localhost' IDENTIFIED BY 'changeme';</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Configure the database properties in <em>nifi-registry.properties</em></p>
+<div class="literalblock">
+<div class="content">
+<pre>nifi.registry.db.url=jdbc:mysql://<MYSQL-HOSTNAME>/nifi_registry
+nifi.registry.db.driver.class=com.mysql.cj.jdbc.Driver
+nifi.registry.db.driver.directory=/path/to/drivers
+nifi.registry.db.username=nifireg
+nifi.registry.db.password=changeme</pre>
+</div>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="schema-differences-limitations"><a class="anchor" href="administration-guide.html#schema-differences-limitations"></a>Schema Differences & Limitations</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Due to differences across database implementations, there are two versions of the schema for NiFi Registry’s metadata database. The original version supports H2 and Postgres, and a second versions supports MySQL.</p>
+</div>
+<div class="paragraph">
+<p>MySQL has limitations on the maximum size of text columns that are part of an index, or unique key. This means the maximum length of some columns is significantly less when using MySQL vs. H2/Postgres.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+If choosing to use MySQL it is important to understand these limitations and accept them.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The following tables summarizes the schema differences in column lengths:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 33%;">
+<col style="width: 33%;">
+<col style="width: 33%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Table.Column</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>H2/Postgres</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>MySQL</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUCKET.NAME</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1000</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">767</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">FLOW_SNAPSHOT.CREATED_BY</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4096</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">767</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">SIGNING_KEY.TENANT_IDENTITY</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4096</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">767</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE.GROUP_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE.ARTIFACT_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE_VERSION.CREATED_BY</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4096</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">767</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE_VERSION.BUILT_BY</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4096</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">767</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE_VERSION_DEPENDENCY.GROUP_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BUNDLE_VERSION_DEPENDENCY.ARTIFACT_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">EXTENSION_PROVIDED_SERVICE_API.CLASS_NAME</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">EXTENSION_PROVIDED_SERVICE_API.GROUP_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">EXTENSION_PROVIDED_SERVICE_API.ARTIFACT_ID</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect1">
<h2 id="persistence-providers"><a class="anchor" href="administration-guide.html#persistence-providers"></a>Persistence Providers</h2>
<div class="sectionbody">
<div class="paragraph">
-<p>NiFi Registry uses a pluggable flow persistence provider to store the content of the flows saved to the registry. NiFi Registry provides <code><a href="administration-guide.html#filesystemflowpersistenceprovider">FileSystemFlowPersistenceProvider</a></code> and <code><a href="administration-guide.html#gitflowpersistenceprovider">GitFlowPersistenceProvider</a></code>.</p>
+<p>NiFi Registry uses a pluggable persistence provider to store the content of each versioned item. Each type of versioned item, such as a versioned flow or extension bundle, has its own persistence provider.</p>
</div>
<div class="paragraph">
-<p>Each persistence provider has its own configuration parameters, those can be configured in a XML file specified in <em><a href="administration-guide.html#providers-properties">nifi-registry.properties</a></em>.</p>
+<p>Each persistence provider has its own configuration parameters, which can be configured in an XML file specified in <em><a href="administration-guide.html#providers-properties">nifi-registry.properties</a></em>.</p>
+</div>
+<div class="sect2">
+<h3 id="flow-persistence-providers"><a class="anchor" href="administration-guide.html#flow-persistence-providers"></a>Flow Persistence Providers</h3>
+<div class="paragraph">
+<p>The flow persistence provider stores the content of the flows saved to the registry. NiFi Registry provides <code><a href="administration-guide.html#filesystemflowpersistenceprovider">FileSystemFlowPersistenceProvider</a></code> and <code><a href="administration-guide.html#gitflowpersistenceprovider">GitFlowPersistenceProvider</a></code>.</p>
</div>
<div class="paragraph">
<p>The XML configuration file looks like below. It has a <code>flowPersistenceProvider</code> element in which qualified class name of a persistence provider implementation and its configuration properties are defined. See following sections for available configurations for each provider.</p>
</div>
<div class="listingblock">
-<div class="title">Example providers.xml</div>
+<div class="title">Example flow persistence provider in providers.xml</div>
<div class="content">
-<pre class="highlight"><code class="language-xml" data-lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<providers>
-
- <flowPersistenceProvider>
- <class>persistence-provider-qualified-class-name</class>
- <property name="property-1">property-value-1</property>
- <property name="property-2">property-value-2</property>
- <property name="property-n">property-value-n</property>
- </flowPersistenceProvider>
-
-</providers></code></pre>
+<pre class="highlight"><code class="language-xml" data-lang="xml"><flowPersistenceProvider>
+ <class>persistence-provider-qualified-class-name</class>
+ <property name="property-1">property-value-1</property>
+ <property name="property-2">property-value-2</property>
+ <property name="property-n">property-value-n</property>
+</flowPersistenceProvider></code></pre>
</div>
</div>
-<div class="sect2">
-<h3 id="filesystemflowpersistenceprovider"><a class="anchor" href="administration-guide.html#filesystemflowpersistenceprovider"></a>FileSystemFlowPersistenceProvider</h3>
+<div class="sect3">
+<h4 id="filesystemflowpersistenceprovider"><a class="anchor" href="administration-guide.html#filesystemflowpersistenceprovider"></a>FileSystemFlowPersistenceProvider</h4>
<div class="paragraph">
<p>FileSystemFlowPersistenceProvider simply stores serialized Flow contents into <code>{bucket-id}/{flow-id}/{version}</code> directories.</p>
</div>
@@ -2431,8 +2900,8 @@ providing 2 total locations, including <
</tbody>
</table>
</div>
-<div class="sect2">
-<h3 id="gitflowpersistenceprovider"><a class="anchor" href="administration-guide.html#gitflowpersistenceprovider"></a>GitFlowPersistenceProvider</h3>
+<div class="sect3">
+<h4 id="gitflowpersistenceprovider"><a class="anchor" href="administration-guide.html#gitflowpersistenceprovider"></a>GitFlowPersistenceProvider</h4>
<div class="paragraph">
<p><code>GitFlowPersistenceProvider</code> stores flow contents under a Git directory.</p>
</div>
@@ -2488,21 +2957,21 @@ flows:
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Remote To Push</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When a new flow snapshot is created, this persistence provider updated files in the specified Git directory, then create a commit to the local repository. If <code>Remote To Push</code> is defined, it also pushes to the specified remote repository. E.g. <code>origin</code>. To define more detailed remote spec such as branch names, use <code>Refspec</code>. See
-<a href="https://git-scm.com/book/en/v2/Git-Internals-The-Refspec" target="_blank">https://git-scm.com/book/en/v2/Git-Internals-The-Refspec</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When a new flow snapshot is created, this persistence provider updates files in the specified Git directory, then creates a commit to the local repository. If <code>Remote To Push</code> is defined, it also pushes to the specified remote repository (e.g. <code>origin</code>). To define more detailed remote spec such as branch names, use <code>Refspec</code> (see
+<a href="https://git-scm.com/book/en/v2/Git-Internals-The-Refspec" target="_blank">https://git-scm.com/book/en/v2/Git-Internals-The-Refspec</a>).</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Remote Access User</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This user name is used to make push requests to the remote repository when <code>Remote To Push</code> is enabled, and the remote repository is accessed by HTTP protocol. If SSH is used, user authentication is done with SSH keys.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">This username is used to make push requests to the remote repository when <code>Remote To Push</code> is enabled, and the remote repository is accessed by HTTP protocol. If SSH is used, user authentication is done with SSH keys.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Remote Access Password</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Used with <code>Remote Access User</code>.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The password for the <code>Remote Access User</code>.</p></td>
</tr>
</tbody>
</table>
-<div class="sect3">
-<h4 id="initialize-git-directory"><a class="anchor" href="administration-guide.html#initialize-git-directory"></a>Initialize Git directory</h4>
+<div class="sect4">
+<h5 id="initialize-git-directory"><a class="anchor" href="administration-guide.html#initialize-git-directory"></a>Initialize Git directory</h5>
<div class="paragraph">
<p>In order to use <code>GitFlowPersistenceRepository</code>, you need to prepare a Git directory on the local file system. You can do so by initializing a directory with <code>git init</code> command, or clone an existing Git project from a remote Git repository by <code>git clone</code> command.</p>
</div>
@@ -2519,8 +2988,8 @@ flows:
</ul>
</div>
</div>
-<div class="sect3">
-<h4 id="git-user-configuration"><a class="anchor" href="administration-guide.html#git-user-configuration"></a>Git user configuration</h4>
+<div class="sect4">
+<h5 id="git-user-configuration"><a class="anchor" href="administration-guide.html#git-user-configuration"></a>Git user configuration</h5>
<div class="paragraph">
<p>This persistence provider uses preconfigured Git user name and user email address when it creates Git commits. NiFi Registry user name is added to commit messages.</p>
</div>
@@ -2548,8 +3017,8 @@ Date: Tue May 8 14:30:31 2018 +0900
</ul>
</div>
</div>
-<div class="sect3">
-<h4 id="git-user-authentication"><a class="anchor" href="administration-guide.html#git-user-authentication"></a>Git user authentication</h4>
+<div class="sect4">
+<h5 id="git-user-authentication"><a class="anchor" href="administration-guide.html#git-user-authentication"></a>Git user authentication</h5>
<div class="paragraph">
<p>By default, this persistence repository only create commits to local repository. No user authentication is needed to do so. However, if 'Commit To Push' is enabled, user authentication to the remote Git repository is required.</p>
</div>
@@ -2577,10 +3046,10 @@ Host bitbucket.org
</div>
</div>
</div>
-<div class="sect2">
-<h3 id="switching-from-other-persistence-provider"><a class="anchor" href="administration-guide.html#switching-from-other-persistence-provider"></a>Switching from other Persistence Provider</h3>
+<div class="sect3">
+<h4 id="switching-from-other-flow-persistence-provider"><a class="anchor" href="administration-guide.html#switching-from-other-flow-persistence-provider"></a>Switching from other Flow Persistence Provider</h4>
<div class="paragraph">
-<p>In order to switch the Persistence Provider to use, it is necessary to reset NiFi Registry.
+<p>In order to switch the Flow Persistence Provider, it is necessary to reset NiFi Registry.
For example, to switch from <code>FileSystemFlowPersistenceProvider</code> to <code>GitFlowPersistenceProvider</code>, follow these steps:</p>
</div>
<div class="olist arabic">
@@ -2609,8 +3078,8 @@ For example, to switch from <code>FileSy
</ol>
</div>
</div>
-<div class="sect2">
-<h3 id="data-model-version-of-serialized-flow-snapshots"><a class="anchor" href="administration-guide.html#data-model-version-of-serialized-flow-snapshots"></a>Data model version of serialized Flow snapshots</h3>
+<div class="sect3">
+<h4 id="data-model-version-of-serialized-flow-snapshots"><a class="anchor" href="administration-guide.html#data-model-version-of-serialized-flow-snapshots"></a>Data model version of serialized Flow snapshots</h4>
<div class="paragraph">
<p>Serialized Flow snapshots saved by these persistence providers have versions, so that the data format and schema can evolve over time. Data model version update is done automatically by NiFi Registry when it reads and stores each Flow content.</p>
</div>
@@ -2643,6 +3112,147 @@ For example, to switch from <code>FileSy
</table>
</div>
</div>
+<div class="sect2">
+<h3 id="bundle-persistence-providers"><a class="anchor" href="administration-guide.html#bundle-persistence-providers"></a>Bundle Persistence Providers</h3>
+<div class="paragraph">
+<p>The bundle persistence provider stores the content of extension bundles saved to the registry. NiFi Registry provides <code><a href="administration-guide.html#filesystembundlepersistenceprovider">FileSystemBundlePersistenceProvider</a></code> and <code><a href="administration-guide.html#s3bundlepersistenceprovider">S3BundlePersistenceProvider</a></code>.</p>
+</div>
+<div class="paragraph">
+<p>The XML configuration file looks like below. It has a <code>extensionBundlePersistenceProvider</code> element in which the qualified class name of a persistence provider implementation and its configuration properties are defined. See following sections for available configurations for each provider.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example extension bundle persistence provider in providers.xml</div>
+<div class="content">
+<pre class="highlight"><code class="language-xml" data-lang="xml"><extensionBundlePersistenceProvider>
+ <class>persistence-provider-qualified-class-name</class>
+ <property name="property-1">property-value-1</property>
+ <property name="property-2">property-value-2</property>
+ <property name="property-n">property-value-n</property>
+</extensionBundlePersistenceProvider></code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="filesystembundlepersistenceprovider"><a class="anchor" href="administration-guide.html#filesystembundlepersistenceprovider"></a>FileSystemBundlePersistenceProvider</h4>
+<div class="paragraph">
+<p>The <code>FileSystemBundlePersistenceProvider</code> stores the content of extension bundles on the local file system. The bundles are organized in directories according to bucket id, group, artifact, and version.</p>
+</div>
+<div class="paragraph">
+<p>Example of persisted extension bundles:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>Extension Bundle Storage Directory/
+âââ {bucket-id}/
+ âââ {group-id}/
+ âââ {artifact-id}
+ âââ {version}/{artifact-id}-{version}.{extension}
+âââ d1beba88-32e9-45d1-bfe9-057cc41f7ce8/
+ âââ org.apache.nifi
+ âââ nifi-example-nar
+ âââ 1.0.0/nifi-example-nar-1.0.0.nar
+ âââ 2.0.0/nifi-example-nar-2.0.0.nar</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="configuration"><a class="anchor" href="administration-guide.html#configuration"></a>Configuration</h5>
+<div class="paragraph">
+<p>Qualified class name: <code>org.apache.nifi.registry.provider.extension.FileSystemBundlePersistenceProvider</code></p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Extension Bundle Storage Directory</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED: File system path for a directory where extension bundle contents files are persisted to. If the directory does not exist when NiFi Registry starts, it will be created. If the directory exists, it must be readable and writable from NiFi Registry.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="s3bundlepersistenceprovider"><a class="anchor" href="administration-guide.html#s3bundlepersistenceprovider"></a>S3BundlePersistenceProvider</h4>
+<div class="paragraph">
+<p>The <code>S3BundlePersistenceProvider</code> stores the content of extension bundles in a AWS S3 bucket. The bucket is expected to already exist and be accessible to the credentials provided to the persistence providcer.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This provider must be added to the classpath by specifying a custom extension directory in <em>nifi-registry.properties</em>, such as <code>nifi.registry.extension.dir.aws=./ext/aws/lib</code>, where <code>./ext/aws/</code> contains the contents of the extracted <em>nifi-registry-aws-assembly-<version>-bin.zip</em>.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The key of an extension bundle in the S3 bucket will be the following:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>/{registry-bucket-id}/{group-id}/{artifact-id}/{version}/{artifact-id}-{version}.{extension}</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If an optional Key Prefix is specified, then that prefix will be applied to the beginning of the above key.</p>
+</div>
+<div class="sect4">
+<h5 id="configuration-2"><a class="anchor" href="administration-guide.html#configuration-2"></a>Configuration</h5>
+<div class="paragraph">
+<p>Qualified class name: <code>org.apache.nifi.registry.aws.S3BundlePersistenceProvider</code></p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Region</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED: The name of the S3 region where the bucket exists.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Bucket Name</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED: The name of an existing bucket to store extension bundles.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Key Prefix</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">An optional prefix that if specified will be added to the beginning of all S3 keys.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Credentials Provider</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED: Indicates how credentials will be provided, must be a value of <code>DEFAULT_CHAIN</code> or <code>STATIC</code>. <code>DEFAULT_CHAIN</code> will consider in order: Java system properties, environment variables, credential profiles (<code>~/.aws/credentials</code>). <code>STATIC</code> requires that <code>Access Key</code> and <code>Secret Access Key</code> be specified directly in this file.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Access Key</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The access key to use when using <code>STATIC</code> credentials provider.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Secret Access Key</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The secret access key to use when using <code>STATIC</code> credentials provider.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Endpoint URL</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">An optional URL that overrides the default AWS S3 endpoint URL. Set this when using an AWS S3 API compatible service hosted at a different URL.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
</div>
<div class="sect1">
<h2 id="event-hooks"><a class="anchor" href="administration-guide.html#event-hooks"></a>Event Hooks</h2>
@@ -2718,8 +3328,8 @@ their purpose are listed below.</p>
<tfoot>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Whitelisted Event Type</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">EventTypes the hook provider configured with this property should respond to. If this property is left blank or not provided all events will fire for the configured hook provider. Multiple 'Whitelisted Event Type' can be specified and often are.
-EX: <property name="Whitelisted Event Type 1">CREATE_FLOW</property> and <property name="Whitelisted Event Type 2">UPDATE_FLOW</property> would invoke the configured hook provider for the CREATE_FLOW and UPDATE_FLOW EventTypes.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Event types the hook provider configured with this property should respond to. If this property is left blank or not provided, all events will fire for the configured hook provider. Multiple <code>Whitelisted Event Type</code> can be specified and often are. For example,
+<code><property name="Whitelisted Event Type 1">CREATE_FLOW</property></code> and <code><property name="Whitelisted Event Type 2">UPDATE_FLOW</property></code> would invoke the configured hook provider for the <code>CREATE_FLOW</code> and <code>UPDATE_FLOW</code> event types.</p></td>
</tr>
</tfoot>
</table>
@@ -2727,7 +3337,7 @@ EX: <property name="Whitelisted Event
<div class="sect2">
<h3 id="scripteventhookprovider"><a class="anchor" href="administration-guide.html#scripteventhookprovider"></a>ScriptEventHookProvider</h3>
<div class="paragraph">
-<p>Hook provider for invoking a shell script that has been written by a user and placed on a file system that is accessible
+<p>The <code>ScriptEventHookProvider</code> invokes a shell script that has been written by a user and placed on a file system that is accessible
by the NiFi Registry instance that the provider is configured for.</p>
</div>
<div class="literalblock">
@@ -2772,8 +3382,8 @@ by the NiFi Registry instance that the p
<div class="sect2">
<h3 id="loggingeventhookprovider"><a class="anchor" href="administration-guide.html#loggingeventhookprovider"></a>LoggingEventHookProvider</h3>
<div class="paragraph">
-<p>The LoggingEventHookProvider logs a string representation of each event using an SLF4J logger. The logger can be configured
-via NiFi Registryâs logback.xml, which by default contains an appender that writes to a log file named nifi-registry-event.log in the logs directory.</p>
+<p>The <code>LoggingEventHookProvider</code> logs a string representation of each event using an SLF4J logger. The logger can be configured
+via NiFi Registryâs <em>logback.xml</em>, which by default contains an appender that writes to a log file named <em>nifi-registry-event.log</em> in the <code>logs</code> directory.</p>
</div>
<div class="literalblock">
<div class="content">
@@ -2787,10 +3397,156 @@ via NiFi Registryâs logback.xml, wh
</div>
</div>
</div>
+<div class="sect1">
+<h2 id="url-aliasing"><a class="anchor" href="administration-guide.html#url-aliasing"></a>URL Aliasing</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A versioned item may contain the URL of a registry instance embedded in the content of the item. For example, flows with nested versioning contain the URL of the registry where the nested versioned flow is located. If the location of the registry instances changes, then the content is no longer accurate.</p>
+</div>
+<div class="paragraph">
+<p>URL aliasing can be used to dynamically handle this situation so that URLs are never written to the stored content, and can be re-written with the correct value when being retrieved by a client.</p>
+</div>
+<div class="paragraph">
+<p>The aliases are configured in an XML file which can be specified in <em><a href="administration-guide.html#alias-properties">nifi-registry.properties</a></em>.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example aliases in registry-aliases.xml</div>
+<div class="content">
+<pre class="highlight"><code class="language-xml" data-lang="xml"><aliases>
+ <alias>
+ <internal>NIFI_REGISTRY_1</internal>
+ <external>http://registry1.nifi.apache.org:18080</external>
+ </alias>
+ <alias>
+ <internal>NIFI_REGISTRY_2</internal>
+ <external>http://registry2.nifi.apache.org:18080</external>
+ </alias>
+</aliases></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If a flow is saved to registry with two child process groups, each under version control, the incoming flow would contain something like the following:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>"processGroups" : [ {
+ ...
+ "versionedFlowCoordinates" : {
+ "bucketId" : "ca20e058-f6e7-404c-aee0-e30833e792c7",
+ "flowId" : "178a6657-e1a7-4cce-8f83-4e615e38f57a",
+ "registryUrl" : "http://registry1.nifi.apache.org:18080",
+ "version" : 1
+ },
+ {
+ ...
+ "versionedFlowCoordinates" : {
+ "bucketId" : "ca20e058-f6e7-404c-aee0-e30833e792c7",
+ "flowId" : "985cb44b-3aec-32be-860f-d2a0f2c72aac",
+ "registryUrl" : "http://registry2.nifi.apache.org:18080",
+ "version" : 1
+ }
+]</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With the example aliases configuration above, the URLs would be written to the flow persistence provider as the following:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>"processGroups" : [ {
+ ...
+ "versionedFlowCoordinates" : {
+ "bucketId" : "ca20e058-f6e7-404c-aee0-e30833e792c7",
+ "flowId" : "178a6657-e1a7-4cce-8f83-4e615e38f57a",
+ "registryUrl" : "NIFI_REGISTRY_1",
+ "version" : 1
+ },
+ {
+ ...
+ "versionedFlowCoordinates" : {
+ "bucketId" : "ca20e058-f6e7-404c-aee0-e30833e792c7",
+ "flowId" : "985cb44b-3aec-32be-860f-d2a0f2c72aac",
+ "registryUrl" : "NIFI_REGISTRY_2",
+ "version" : 1
+ }
+]</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When this flow is retrieved from any API call, the internal values would be rewritten to the external values.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="backup-recovery"><a class="anchor" href="administration-guide.html#backup-recovery"></a>Backup & Recovery</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>In order to prevent data loss it is important to consider backup and recovery options. The data that needs to be considered is the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Metadata Database</p>
+</li>
+<li>
+<p>Persistence providers</p>
+</li>
+<li>
+<p>Configuration files</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="metadata-database-2"><a class="anchor" href="administration-guide.html#metadata-database-2"></a>Metadata Database</h3>
+<div class="paragraph">
+<p>If using H2, the database file should be backed up periodically to an external location. In order to ensure a proper backup, NiFi Registry should be stopped to ensure no write operations are occurring while copying the file.</p>
+</div>
+<div class="paragraph">
+<p>If using Postgres, backups may be taken on the Postgres database, or Postgres may be configured for high availability such that there is a failover or backup instance.</p>
+</div>
+<div class="paragraph">
+<p>If starting a brand new NiFi Registry instance, the metadata database can be automatically rebuilt from the information in the <code>GitFlowPersistenceProvider</code>. This is a one-time operation during the first start of the application, and is not meant to keep the DB in sync with external changes made in Git. This feature only applies to flows and would not be able to restore information about extension bundles.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="persistence-providers-2"><a class="anchor" href="administration-guide.html#persistence-providers-2"></a>Persistence Providers</h3>
+<div class="paragraph">
+<p>Each persistence provider may have its own option for backup & recovery.</p>
+</div>
+<div class="sect3">
+<h4 id="flow-persistence"><a class="anchor" href="administration-guide.html#flow-persistence"></a>Flow Persistence</h4>
+<div class="paragraph">
+<p>If using the <code>FileSystemFlowPersistenceProvider</code>, the directory where flows are stored should be backed up periodically to an external location. In order to ensure a proper backup, NiFi Registry should be stopped to ensure no flows are being written to disk. If using H2 for metadata, H2 should be backed up at the same time to ensure consistency between the flows on disk and the contents in H2.</p>
+</div>
+<div class="paragraph">
+<p>If using the <code>GitFlowPersistenceProvider</code>, the ability to automatically push to a remote may be configured. This provides an automatic backup of the data in the remote repo.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="bundle-persistence"><a class="anchor" href="administration-guide.html#bundle-persistence"></a>Bundle Persistence</h3>
+<div class="paragraph">
+<p>If using the <code>FileSystemBundlePersistenceProvider</code>, the directory where bundles are stored should be backed up periodically to an external location. In order to ensure a proper backup, NiFi Registry should be stopped to ensure no bundles are being written to disk. If using H2 for metadata, H2 should be backed up at the same time to ensure consistency between the bundles on disk and the contents in H2.</p>
+</div>
+<div class="paragraph">
+<p>If using the <code>S3BundlePersistenceProvider</code>, data will be stored remotely and automatically replicated.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="configuration-files"><a class="anchor" href="administration-guide.html#configuration-files"></a>Configuration Files</h3>
+<div class="paragraph">
+<p>If using NiFi Registry’s policy based authorization, the users, groups, and policies are stored in files on disk named <em>users.xml</em> and <em>authorizations.xml</em>. These files should be periodically backed up to an external location. In order to ensure a proper backup, NiFi Registry should be stopped to ensure no authorization data is being written to disk.</p>
+</div>
+<div class="paragraph">
+<p>If using Ranger, then all authorization information is stored externally and there is nothing to back up.</p>
+</div>
+</div>
+</div>
+</div>
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2018-09-22 09:25:14 -04:00
+Last updated 2019-05-16 16:37:59 -04:00
</div>
</div>
</body>
Modified: nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html
URL: http://svn.apache.org/viewvc/nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html?rev=1859662&r1=1859661&r2=1859662&view=diff
==============================================================================
--- nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html (original)
+++ nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html Tue May 21 16:47:35 2019
@@ -755,7 +755,7 @@ the versioned flow you just saved (a ref
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2018-09-22 09:25:14 -04:00
+Last updated 2019-05-16 16:37:59 -04:00
</div>
</div>
</body>