<?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[🚀 Semaphore UI: community package now available]]></title><description><![CDATA[<p dir="auto">Semaphore UI is a web interface for Ansible. Playbooks, inventories, repositories, environments and schedules get a browser front end, so routine automation can be run and reviewed by people who are<br />
not sitting at a terminal, and by people you would rather did not have your SSH keys.</p>
<p dir="auto">It is <strong>not</strong> Semaphore CI. The name is shared with an unrelated continuous-integration product.</p>
<p dir="auto"><img src="/assets/uploads/files/1787339588275-semaphore-task-templates-1280-resized.png" alt="semaphore-task-templates-1280.png" class=" img-fluid img-markdown" width="1280" height="660" /></p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/2728.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--sparkles" style="height:23px;width:auto;vertical-align:middle" title="✨" alt="✨" /> Headline features</h3>
<ul>
<li><strong>Ansible is in the image, not a prerequisite.</strong> The Ansible community bundle 9.2.0<br />
(<code>ansible-core</code> 2.16.3) and <code>git</code> ship inside, so a fresh install can clone a playbook repository<br />
and run it with nothing else installed anywhere.</li>
<li><strong>Cloudron single sign-on through the application's own OIDC support</strong>, not <code>proxyAuth</code>. That<br />
matters here: Semaphore has a full REST API and webhook triggers, and fencing the whole app behind<br />
a proxy would have broken both.</li>
<li><strong>Every install generates its own encryption keyring at first run.</strong> Upstream's default is either<br />
no key at all, which stores your SSH keys base64-encoded and calls it done, or the literal key<br />
published in their compose file. Neither ships here.</li>
<li><strong>Schedules, webhook integrations and a REST API</strong>, so playbooks can run on a cron, be triggered by<br />
another service, or be driven from your own tooling.</li>
<li><strong>Task concurrency capped at 10.</strong> Upstream defaults to 9999; since every task forks its own<br />
Ansible process, that default makes any memory limit theoretical.</li>
<li><strong>PostgreSQL through the platform addon.</strong> No bundled database to back up separately.</li>
</ul>
<h3>Links</h3>
<p dir="auto">Package repository: <a href="https://github.com/OrcVole/semaphore-cloudron" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/OrcVole/semaphore-cloudron</a></p>
<p dir="auto">Versions feed: <a href="https://raw.githubusercontent.com/OrcVole/semaphore-cloudron/main/CloudronVersions.json" target="_blank" rel="noopener noreferrer nofollow ugc">https://raw.githubusercontent.com/OrcVole/semaphore-cloudron/main/CloudronVersions.json</a></p>
<p dir="auto">Upstream project: <a href="https://semaphoreui.com" target="_blank" rel="noopener noreferrer nofollow ugc">https://semaphoreui.com</a> — source at <a href="https://github.com/semaphoreui/semaphore" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/semaphoreui/semaphore</a></p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4e5.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--inbox_tray" style="height:23px;width:auto;vertical-align:middle" title="📥" alt="📥" /> How to install</h3>
<p dir="auto">The easiest route, and the one that gets you automatic updates: in the App Store, open the <strong>Add<br />
custom app</strong> dropdown at the top right, choose <strong>Community app</strong>, and paste the versions URL above<br />
into the box that appears.</p>
<pre><code>https://raw.githubusercontent.com/OrcVole/semaphore-cloudron/main/CloudronVersions.json
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1782552307466-community-package.jpeg" alt="community-package.jpeg" class=" img-fluid img-markdown" width="1024" height="471" /></p>
<p dir="auto"><img src="/assets/uploads/files/1782552321764-cloudronversions.jpeg" alt="cloudronversions.jpeg" class=" img-fluid img-markdown" width="631" height="249" /></p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/2699.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--gear" style="height:23px;width:auto;vertical-align:middle" title="⚙" alt="⚙" />️ Requirements and first run</h3>
<p dir="auto"><strong>Minimums:</strong> 1 GiB memory, addons <code>localstorage</code>, <code>postgresql</code>, <code>oidc</code>. No extra subdomain.</p>
<p dir="auto"><strong>First run:</strong> an administrator is created for you. Open a Terminal for the app and run<br />
<code>cat /app/data/.initial-admin</code> to get the password, sign in as <code>admin</code>, change it, then promote your<br />
own account from <strong>Team → Users</strong>.</p>
<p dir="auto">That last step is not optional bookkeeping. Accounts arriving through Cloudron single sign-on are <em>external</em> users and are never administrators, and upstream does not let non-administrators create<br />
projects, so without promoting yourself, signing in with SSO leaves you looking at an empty app.</p>
<p dir="auto">One more thing worth knowing: Semaphore's "disable password login" setting only hides the password<br />
form. The login endpoint keeps accepting credentials. Treat the <code>admin</code> password as live.</p>
<p dir="auto"><strong>Back up <code>/app/data/keys</code>.</strong> It holds the key that decrypts every credential the app stores. It is<br />
inside Cloudron's normal backups, so the only way to lose it is to restore selectively, but if it does go, the app keeps running and looks healthy while every stored credential is permanently<br />
unreadable. <code>semaphore vaults check --config /run/semaphore/config.json</code> tells you the truth; every<br />
key should say <code>active</code>.</p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f464.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--bust_in_silhouette" style="height:23px;width:auto;vertical-align:middle" title="👤" alt="👤" /> For users</h3>
<p dir="auto"><strong>Why try it:</strong> you have playbooks, and the people who need to run them keep asking you to run them.</p>
<p dir="auto">What you get: a browser front end for playbooks, inventories and credentials; scheduled runs and webhook triggers; per-project members and permissions, so someone can run the deploy without holding the keys it uses.</p>
<p dir="auto"><strong>Cloudron wins:</strong> single sign-on, TLS, backups and updates all handled by the platform, and the encryption key is generated per install rather than shared with everyone who downloaded the same compose file.</p>
<h3>🧰 For packagers: what we learned</h3>
<p dir="auto"><strong>What helped</strong> the platform's <code>postgresql</code> and <code>oidc</code> addons covered the whole dependency list; nothing needed bundling. Existing community packages were the reference for the versions feed shape.</p>
<p dir="auto"><strong>What was tricky:</strong></p>
<ul>
<li>The runtime user's home is read-only, and Ansible wants <code>$HOME/.ansible/tmp</code>. It needs <code>HOME</code>, and<br />
separately <strong><code>ANSIBLE_REMOTE_TEMP</code></strong> — the second is the one that breaks module transfer, and a<br />
playbook using only <code>debug</code> will happily pass without revealing it.</li>
<li>Semaphore runs tasks with a <strong>sanitised environment</strong>, forwarding only variables it is told to. So<br />
exporting from the start script does not reach Ansible; the configuration has to live somewhere the<br />
package owns, which is <code>/etc/ansible/ansible.cfg</code>.</li>
<li>A platform restore returns <code>/app/data</code> owned by a different uid. Git then refuses every stored<br />
repository as "dubious ownership" and every task fails at the clone — while row counts, checksums,<br />
health and login all look perfect. The start script takes ownership of the whole volume.</li>
<li>The PostgreSQL port belongs <em>inside</em> the host value as <code>host:port</code>; there is no separate port<br />
setting, and <code>sslmode=disable</code> is needed because the addon serves no TLS.</li>
</ul>
<p dir="auto"><strong>Still rough</strong> We would welcome a second pair of eyes on a cold install from the feed onto a fresh subdomain, and on behaviour with a large existing playbook repository.</p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f6e0.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--hammer_and_wrench" style="height:23px;width:auto;vertical-align:middle" title="🛠" alt="🛠" />️ For the Cloudron team</h3>
<p dir="auto"><strong>Maintenance burden:</strong> low. The package is a build of one Go binary plus Ansible from the distribution, with no patched application code, upstream releases drop straight in with a version bump. Upstream ships often, roughly fortnightly with point releases between.</p>
<p dir="auto"><strong>Why it suits the App Store:</strong> Ansible is the obvious automation tool for exactly the audience that runs a Cloudron, and until now running it meant a terminal and a laptop that happened to be on. It uses the platform's own identity rather than reimplementing users, and it has no bundled datastore.</p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4bb.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--computer" style="height:23px;width:auto;vertical-align:middle" title="💻" alt="💻" /> For Semaphore's developers</h3>
<p dir="auto">Thank you! The configuration surface is clean, the OIDC support is in the community build, and the keyring with <code>vaults check</code> and <code>vaults rekey</code> is a good piece of design that made the custody decision easy.</p>
<p dir="auto">Two things we would raise: <code>password_login_disable</code> is not enforced at the login endpoint, only in the interface; and <code>web/src/assets/logo.svg</code> is a leftover from the Vue<br />
scaffold rather than your mark, which is a small trap for anyone packaging you.</p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f513.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--unlock" style="height:23px;width:auto;vertical-align:middle" title="🔓" alt="🔓" /> Unlocks</h3>
<p dir="auto">Server maintenance that someone other than you can run. Patch windows as a scheduled task rather than an evening. Credentials that live in one encrypted store instead of on four laptops.</p>
<h3><img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f517.png?v=a9807027800" class="not-responsive emoji emoji-android emoji--link" style="height:23px;width:auto;vertical-align:middle" title="🔗" alt="🔗" /> Synergies</h3>
<p dir="auto"><strong>Semaphore + Gitea or Forgejo:</strong> keep playbook repositories on the same box that runs them; Semaphore clones over the internal network and never needs an outside git host.</p>
<p dir="auto"><strong>Semaphore + Uptime Kuma:</strong> point a Kuma alert at a Semaphore webhook integration so a failed check triggers the remediation playbook instead of a notification you read in the morning.</p>
<p dir="auto"><strong>Semaphore + n8n:</strong> n8n handles the branching and the approvals, Semaphore does the part that needs Ansible, called through its REST API.</p>
<p dir="auto"><strong>Semaphore + Grafana:</strong> dashboards for the fleet, and the tool that changes the fleet, on the same<br />
login.</p>
<p dir="auto"><strong>Semaphore + ntfy:</strong> task results pushed to your phone, which is the difference between a scheduled<br />
playbook you trust and one you check.</p>
]]></description><link>https://forum.cloudron.io/topic/15849/semaphore-ui-community-package-now-available</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 02:41:09 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/15849.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Aug 2026 19:19:13 GMT</pubDate><ttl>60</ttl></channel></rss>