<?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[Bug Report: WordPress package start.sh aborts boot when OIDC plugin is installed-but-inactive]]></title><description><![CDATA[<h1>Bug Report: WordPress package <a href="http://start.sh" target="_blank" rel="noopener noreferrer nofollow ugc">start.sh</a> aborts boot when OIDC plugin is installed-but-inactive</h1>
<p dir="auto"><strong>Package:</strong> <code>org.wordpress.unmanaged.cloudronapp</code> (observed on <strong>3.15.0</strong>; logic also present in the <code>managed</code> package's SSO block)<br />
<strong>File:</strong> <code>/app/pkg/start.sh</code> — OIDC/Cloudron-SSO setup block (~lines 182–204)<br />
<strong>Severity:</strong> High — puts the app into a boot crash-loop / recovery (debug) mode; site goes fully offline.<br />
<strong>Reproduced on:</strong> live app <code>c21masters.com</code> (Cloudron 6.0.0), 2026-06-19.</p>
<hr />
<h2>Symptom</h2>
<p dir="auto">App drops into recovery mode. <code>cloudron logs</code> shows <a href="http://start.sh" target="_blank" rel="noopener noreferrer nofollow ugc">start.sh</a> restarting in a tight loop, each pass ending with:</p>
<pre><code>Success: Installed 1 of 1 plugins.
Warning: Failed to activate plugin. Cloudron SSO requires 1 plugin to be installed and activated: OpenID Connect Generic.
Error: No plugins activated.
</code></pre>
<p dir="auto">…and the web tier never comes up:</p>
<pre><code>=&gt; Healthcheck error: Error: connect ECONNREFUSED 172.18.20.70:80
</code></pre>
<p dir="auto">Apache is never reached because <a href="http://start.sh" target="_blank" rel="noopener noreferrer nofollow ugc">start.sh</a> exits non-zero before the <code>Starting apache</code> step.</p>
<h2>Root cause</h2>
<p dir="auto"><code>start.sh</code> begins with <code>set -eu</code>, so <strong>any</strong> unhandled non-zero exit aborts the whole startup script. The SSO block:</p>
<pre><code class="language-bash"># uninstall old `openid-connect-generic` plugin
if $wp plugin is-installed openid-connect-generic; then
    $wp plugin deactivate openid-connect-generic || true
    $wp plugin uninstall openid-connect-generic || true
fi

if ! $wp plugin is-installed daggerhart-openid-connect-generic; then
    echo "==&gt; Install OIDC plugin"
    $wp plugin install /app/pkg/daggerhart-openid-connect-generic.zip
    $wp plugin activate daggerhart-openid-connect-generic     # (A) only runs on fresh install
fi

$wp plugin install --force /app/pkg/cloudron-sso.zip
$wp plugin activate cloudron-sso                              # (B) hard requirement
</code></pre>
<p dir="auto"><code>cloudron-sso.php</code> declares a WordPress 6.5+ plugin-dependency header:</p>
<pre><code>Requires Plugins:  daggerhart-openid-connect-generic
</code></pre>
<p dir="auto">WordPress refuses to activate <code>cloudron-sso</code> unless <code>daggerhart-openid-connect-generic</code> is <strong>installed <em>and</em> active</strong>.</p>
<p dir="auto">The activation of the dependency (A) lives <strong>inside</strong> the <code>if ! is-installed</code> guard. So if <code>daggerhart-openid-connect-generic</code> is already <strong>installed but inactive</strong> — which happens whenever the plugin was deactivated by a user, by a migration/restore, by a backup import, or by a previous half-completed boot — the guard is false, (A) is skipped, and the dependency stays inactive.</p>
<p dir="auto">(B) then fails the <code>Requires Plugins</code> check → non-zero exit → <code>set -eu</code> aborts <a href="http://start.sh" target="_blank" rel="noopener noreferrer nofollow ugc">start.sh</a> before Apache starts → healthcheck <code>ECONNREFUSED</code> → Cloudron restarts the container → same path again → recovery mode.</p>
<p dir="auto">The "different name" red herring: the historical directory/slug <code>openid-connect-generic</code> was renamed to <code>daggerhart-openid-connect-generic</code>. Installs that carry the plugin from before the rename (or restore it inactive) land exactly in this installed-but-inactive state.</p>
<h2>Why it's easy to hit</h2>
<ul>
<li>The dependency is only <em>activated</em> on the fresh-install path, but it's <em>required-active</em> on every boot.</li>
<li>Any state where the OIDC plugin exists on disk but isn't active is unrecoverable on its own, because each reboot re-runs the same failing sequence.</li>
</ul>
<h2>Fix</h2>
<p dir="auto">Move/guarantee activation of the dependency on <strong>every</strong> boot (idempotent), independent of whether it was just installed, and/or make the SSO activation non-fatal. Minimal change:</p>
<pre><code class="language-bash">if ! $wp plugin is-installed daggerhart-openid-connect-generic; then
    echo "==&gt; Install OIDC plugin"
    $wp plugin install /app/pkg/daggerhart-openid-connect-generic.zip
fi
# Always ensure the dependency is active before activating cloudron-sso (idempotent).
$wp plugin activate daggerhart-openid-connect-generic

$wp plugin install --force /app/pkg/cloudron-sso.zip
$wp plugin activate cloudron-sso
</code></pre>
<p dir="auto">Optional hardening: append <code>|| true</code> (or an explicit warn) to the two SSO <code>activate</code> calls so a future SSO hiccup degrades gracefully instead of taking the entire site offline via <code>set -eu</code>. SSO not activating should not block Apache from serving.</p>
<h2>Workaround (manual recovery, what we did)</h2>
<p dir="auto">From inside the container (<code>cloudron exec --app &lt;id&gt;</code><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f61e.png?v=115767879fc" class="not-responsive emoji emoji-android emoji--disappointed" style="height:23px;width:auto;vertical-align:middle" title="):" alt="😞" /></p>
<pre><code class="language-bash">cd /app/data/public
php -d memory_limit=512M /app/pkg/wp plugin activate daggerhart-openid-connect-generic --allow-root --skip-themes
php -d memory_limit=512M /app/pkg/wp plugin activate cloudron-sso --allow-root --skip-themes
</code></pre>
<p dir="auto">Then take the app out of recovery mode:</p>
<pre><code class="language-bash">cloudron debug --disable --app &lt;id&gt;
</code></pre>
<p dir="auto">After this the next normal boot reaches <code>==&gt; Starting apache</code>, healthcheck passes, app returns to <code>running</code>, site responds HTTP 200.</p>
<h2>Environment</h2>
<ul>
<li>Cloudron: 6.0.0</li>
<li>Package: <code>org.wordpress.unmanaged.cloudronapp@3.15.0</code></li>
<li><code>cloudron-sso</code> 1.0.0, <code>daggerhart-openid-connect-generic</code> (OpenID Connect Generic) 3.11.3</li>
<li>App ID: <code>4b378989-212e-4ca0-921c-2479fa2a0679</code></li>
</ul>
]]></description><link>https://forum.cloudron.io/topic/15630/bug-report-wordpress-package-start.sh-aborts-boot-when-oidc-plugin-is-installed-but-inactive</link><generator>RSS for Node</generator><lastBuildDate>Mon, 22 Jun 2026 00:15:29 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/15630.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Jun 2026 20:18:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bug Report: WordPress package start.sh aborts boot when OIDC plugin is installed-but-inactive on Sun, 21 Jun 2026 20:20:27 GMT]]></title><description><![CDATA[<p dir="auto">Also I'm having trouble logging into my cloudron git account. I haven't logged in for a few years and I think I no longer have access to the email. My username is derintolu. Anyway I could get some help with that??</p>
]]></description><link>https://forum.cloudron.io/post/125945</link><guid isPermaLink="true">https://forum.cloudron.io/post/125945</guid><dc:creator><![CDATA[derin]]></dc:creator><pubDate>Sun, 21 Jun 2026 20:20:27 GMT</pubDate></item></channel></rss>