<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package]]></title><description><![CDATA[<p dir="auto">This guide configures Nextcloud Full Text Search (FTS) to use Elasticsearch over the <strong>Cloudron-internal app network</strong>.</p>
<p dir="auto">The Elasticsearch REST API is not public. The public app URL exposes only a minimal health endpoint; Nextcloud connects directly to Elasticsearch on internal port <code>9200</code>.</p>
<h2>1. Install Elasticsearch from the community catalog</h2>
<p dir="auto">In Cloudron, open:</p>
<pre><code class="language-text">App Store → Settings → Community Apps
</code></pre>
<p dir="auto">Add this catalog URL:</p>
<pre><code class="language-text">https://git.due.ren/andreas/elasticsearch-cloudron/-/raw/main/CloudronVersions.json
</code></pre>
<p dir="auto">Or install through the Cloudron CLI:</p>
<pre><code class="language-bash">cloudron install \
  --versions-url https://git.due.ren/andreas/elasticsearch-cloudron/-/raw/main/CloudronVersions.json \
  --location elasticsearch.example.com
</code></pre>
<p dir="auto">Installing from this catalog makes the app community-tracked, allowing Cloudron to discover later package releases through its normal update mechanism.</p>
<p dir="auto">Allocate at least <strong>4 GB RAM</strong> where possible. The package sizes Elasticsearch's JVM heap from the app memory limit.</p>
<h2>2. Obtain the internal Elasticsearch address and credential</h2>
<p dir="auto">Open the Elasticsearch app's Web Terminal and run:</p>
<pre><code class="language-bash">hostname
cat /app/data/credentials.txt
</code></pre>
<p dir="auto"><code>hostname</code> prints the Cloudron app ID. This is the internal hostname that other Cloudron apps can resolve for the lifetime of this installed app.</p>
<p dir="auto">Use the app-ID hostname, <strong>not</strong> the container IP. Container IP addresses are not a supported configuration value and can change.</p>
<p dir="auto">The internal Elasticsearch endpoint is:</p>
<pre><code class="language-text">http://&lt;APP_ID_HOSTNAME&gt;:9200
</code></pre>
<p dir="auto">For example:</p>
<pre><code class="language-text">http://210f8b84-f417-4697-80b7-efefd18e7329:9200
</code></pre>
<p dir="auto">The generated password is also available at:</p>
<pre><code class="language-text">/app/data/secrets/elastic_password
</code></pre>
<p dir="auto">Treat it as a secret. A Cloudron app that has both this password and the internal hostname can query Elasticsearch.</p>
<blockquote>
<p dir="auto"><strong>Important:</strong> If the Elasticsearch app is removed and installed again, it receives a new app ID. Update the Nextcloud <code>elastic_host</code> configuration after such a migration.</p>
</blockquote>
<h2>3. Enable the Nextcloud FTS apps</h2>
<p dir="auto">Open the Nextcloud app's Web Terminal and run:</p>
<pre><code class="language-bash">sudo -u www-data php /app/code/occ app:enable fulltextsearch
sudo -u www-data php /app/code/occ app:enable fulltextsearch_elasticsearch
sudo -u www-data php /app/code/occ app:enable files_fulltextsearch
</code></pre>
<h2>4. Configure Nextcloud</h2>
<p dir="auto">Set the FTS platform and the index name:</p>
<pre><code class="language-bash">sudo -u www-data php /app/code/occ config:app:set \
  fulltextsearch app_navigation --value "1"

sudo -u www-data php /app/code/occ config:app:set \
  fulltextsearch search_platform \
  --value "OCA\\FullTextSearch_Elasticsearch\\Platform\\ElasticSearchPlatform"

sudo -u www-data php /app/code/occ config:app:set \
  fulltextsearch_elasticsearch elastic_index --value "nextcloud"
</code></pre>
<p dir="auto">Set the Elasticsearch connection. The password must be URL-encoded if it contains URL-reserved characters such as <code>@</code>, <code>:</code>, <code>/</code>, <code>?</code>, <code>#</code>, or <code>%</code>.</p>
<pre><code class="language-bash">sudo -u www-data php /app/code/occ config:app:set \
  fulltextsearch_elasticsearch elastic_host \
  --value "http://elastic:URL_ENCODED_PASSWORD@APP_ID_HOSTNAME:9200"
</code></pre>
<p dir="auto">Replace:</p>
<ul>
<li><code>URL_ENCODED_PASSWORD</code> with the generated Elasticsearch password, URL-encoded where necessary.</li>
<li><code>APP_ID_HOSTNAME</code> with the value returned by <code>hostname</code> in the Elasticsearch app.</li>
</ul>
<p dir="auto">Example shape:</p>
<pre><code class="language-text">http://elastic:REDACTED@210f8b84-f417-4697-80b7-efefd18e7329:9200
</code></pre>
<h2>5. Test and build the index</h2>
<pre><code class="language-bash">sudo -u www-data php /app/code/occ fulltextsearch:test
sudo -u www-data php /app/code/occ fulltextsearch:index
</code></pre>
<p dir="auto">The first indexing run can take time, depending on the number and size of files.</p>
<p dir="auto">Elasticsearch's built-in <code>german</code> analyzer is available. No separate ICU plugin is required for the standard German analyzer.</p>
<h2>6. Verify Elasticsearch and the public boundary</h2>
<p dir="auto">Inside the Elasticsearch app:</p>
<pre><code class="language-bash">curl -u elastic:$(cat /app/data/secrets/elastic_password) \
  http://localhost:9200/_cat/indices?v
</code></pre>
<p dir="auto">You should see the <code>nextcloud</code> index after indexing.</p>
<p dir="auto">From outside the Cloudron, verify that Elasticsearch API routes are not public:</p>
<pre><code class="language-bash">curl -i https://elasticsearch.example.com/_cat/indices
</code></pre>
<p dir="auto">Expected result:</p>
<pre><code class="language-text">HTTP 404
{"status":"not_found"}
</code></pre>
<p dir="auto">The harmless public health endpoint should remain available:</p>
<pre><code class="language-bash">curl -i https://elasticsearch.example.com/health
</code></pre>
<p dir="auto">Expected result:</p>
<pre><code class="language-text">HTTP 200
{"status":"green","service":"elasticsearch-cloudron"}
</code></pre>
<h2>Security and operational notes</h2>
<ul>
<li>Elasticsearch REST runs on internal port <code>9200</code>; it is not routed through the public Cloudron reverse proxy.</li>
<li>The public Cloudron <code>httpPort</code> serves only <code>/health</code>.</li>
<li>The Elasticsearch transport port <code>9300</code> has no external Cloudron port mapping.</li>
<li>HTTP CORS is disabled by default.</li>
<li>Elasticsearch data persists in <code>/app/data</code>; routine package updates do not normally require a re-index.</li>
<li>Do not use container IP addresses in Nextcloud configuration.</li>
</ul>
]]></description><link>https://forum.cloudron.io/topic/15745/how-to-nextcloud-full-text-search-with-the-cloudron-elasticsearch-community-package</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 17:12:03 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/15745.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jul 2026 21:24:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package on Fri, 31 Jul 2026 17:34:27 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/andreasdueren" aria-label="Profile: andreasdueren">@<bdi>andreasdueren</bdi></a> good catch, I have pushed doc fix. The networking issue is fixed in Cloudron 10 , yes <img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=df184f34222" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
]]></description><link>https://forum.cloudron.io/post/127559</link><guid isPermaLink="true">https://forum.cloudron.io/post/127559</guid><dc:creator><![CDATA[girish]]></dc:creator><pubDate>Fri, 31 Jul 2026 17:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package on Fri, 31 Jul 2026 15:36:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/girish" aria-label="Profile: girish">@<bdi>girish</bdi></a> That was the missing piece, thank you. I mistakenly had concluded from the <code>backupCommand</code> docs alone that there was no restore-side hook. <code>restoreCommand</code> is documented, it just isn't cross-linked from <code>backupCommand</code>.</p>
<p dir="auto">One thing I hit that may be a bug in <code>9.2.0</code>: the docs state the <code>backupCommand</code> container shares the app container's network namespace, so services on <code>localhost</code> are reachable. On my install that did not work. <code>curl</code> to <code>127.0.0.1:9200</code> failed with exit code 7 (connection refused / could not connect) during <code>backupCommand</code>, on two separate package releases, including one with <code>--retry 30 --retry-delay 2 --retry-connrefused</code> retrying for roughly a minute. The identical command run inside the live app container via <code>cloudron exec</code> succeeded immediately, and the app was healthy throughout.</p>
<p dir="auto">I worked around it for now by having <code>backupCommand</code> talk to the live container over a Unix socket in <code>/app/data/run</code> instead of TCP. Happy to provide logs or a minimal reproducer if that's unexpected. <code>restoreCommand</code> shouldn't care since the app isn't running at that point, but <code>backupCommand</code> does depend on it.</p>
]]></description><link>https://forum.cloudron.io/post/127550</link><guid isPermaLink="true">https://forum.cloudron.io/post/127550</guid><dc:creator><![CDATA[andreasdueren]]></dc:creator><pubDate>Fri, 31 Jul 2026 15:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package on Fri, 31 Jul 2026 11:17:21 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/andreasdueren" aria-label="Profile: andreasdueren">@<bdi>andreasdueren</bdi></a> there is a companion command called <code>restoreCommand</code> which will restore from the snapshot into the filesystem . You also don't need to back up the raw elastic files, you can use <a href="https://docs.cloudron.io/packaging/manifest#persistentdirs" target="_blank" rel="noopener noreferrer nofollow ugc">persistentDirs</a></p>
]]></description><link>https://forum.cloudron.io/post/127537</link><guid isPermaLink="true">https://forum.cloudron.io/post/127537</guid><dc:creator><![CDATA[girish]]></dc:creator><pubDate>Fri, 31 Jul 2026 11:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package on Wed, 29 Jul 2026 14:08:11 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/girish" aria-label="Profile: girish">@<bdi>girish</bdi></a> Thanks, didn't know about this feature and implemented what I understood to be best practice in the latest version:</p>
<p dir="auto">The package now uses Cloudron’s <code>backupCommand</code> to create an Elasticsearch filesystem snapshot before Cloudron copies <code>/app/data</code>.</p>
<p dir="auto">That snapshot is created by Elasticsearch, waits for <code>SUCCESS</code>, and is included in the normal Cloudron app backup under:</p>
<p dir="auto"><code>/app/data/snapshots</code></p>
<p dir="auto">So the current situation is:</p>
<pre><code>Cloudron backup
├── normal /app/data filesystem copy
└── completed Elasticsearch snapshot
</code></pre>
<p dir="auto">If the restored raw Elasticsearch data starts normally, nothing else is required. If it does not, the Elasticsearch snapshot is the supported recovery source.</p>
<p dir="auto">I considered stopping Elasticsearch for the entire Cloudron filesystem-copy phase to make the raw copy consistent, but that would add backup downtime and probably be less robust than Elasticsearch’s own snapshot mechanism.</p>
]]></description><link>https://forum.cloudron.io/post/127408</link><guid isPermaLink="true">https://forum.cloudron.io/post/127408</guid><dc:creator><![CDATA[andreasdueren]]></dc:creator><pubDate>Wed, 29 Jul 2026 14:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to How-to: Nextcloud Full Text Search with the Cloudron Elasticsearch community package on Wed, 29 Jul 2026 06:54:25 GMT]]></title><description><![CDATA[<p dir="auto">Thanks for the write up.</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/andreasdueren" aria-label="Profile: andreasdueren">@<bdi>andreasdueren</bdi></a> do you think the elasticsearch package can make use of <a href="https://docs.cloudron.io/packaging/manifest#backupcommand" target="_blank" rel="noopener noreferrer nofollow ugc">https://docs.cloudron.io/packaging/manifest#backupcommand</a> ? Since filesystem backup is not atomic on Cloudron, this might bring more consistency to the elasticsearch backups (since elastic is a "database").</p>
]]></description><link>https://forum.cloudron.io/post/127386</link><guid isPermaLink="true">https://forum.cloudron.io/post/127386</guid><dc:creator><![CDATA[girish]]></dc:creator><pubDate>Wed, 29 Jul 2026 06:54:25 GMT</pubDate></item></channel></rss>