<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Cloudron - Complete solution for self-hosting</title><link>https://blog.cloudron.io/</link><description>Self-hosting has never been simpler</description><language>en-US</language><atom:link href="https://blog.cloudron.io/rss.xml" rel="self" type="application/rss+xml"/><item><title>Cloudron Calendar</title><link>https://blog.cloudron.io/calendar/</link><guid>https://blog.cloudron.io/calendar/</guid><pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We announced the Cloudron Calendar app &lt;a href="https://forum.cloudron.io/topic/15634/contacts-calendar"&gt;on the forum&lt;/a&gt; a while ago, but we never really wrote about it. This post is that write-up.&lt;/p&gt;&#10;&lt;p&gt;Calendar is a web app for managing calendars. It is an alternative to Google Calendar on your own server. It has the usual features that you would expect in a modern calendar app: multiple calendars, a schedule, sharing, public pages, holiday calendars, subscriptions, and CalDAV sync. It even has &lt;a href="/booking-pages/"&gt;booking pages&lt;/a&gt;, which we cover in another post.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We announced the Cloudron Calendar app <a href="https://forum.cloudron.io/topic/15634/contacts-calendar">on the forum</a> a while ago, but we never really wrote about it. This post is that write-up.</p>
<p>Calendar is a web app for managing calendars. It is an alternative to Google Calendar on your own server. It has the usual features that you would expect in a modern calendar app: multiple calendars, a schedule, sharing, public pages, holiday calendars, subscriptions, and CalDAV sync. It even has <a href="/booking-pages/">booking pages</a>, which we cover in another post.</p>
<h2 id="calendars">Calendars
  <a class="heading-anchor" href="#calendars" aria-label="Link to this section">#</a>
</h2>
<p>At its core, events are organized into calendars. For example, you would create one for work, another one for personal, and another for a project.</p>
<p>Each calendar has its own color. You can view the events in the month, week, day, and year views.</p>
<p><img src="/content/images/2026/11/calendar-month.png" alt="Month view with several calendars"></p>
<p>You can choose which calendars are shown by selecting them in the sidebar.</p>
<h2 id="schedule-view">Schedule view
  <a class="heading-anchor" href="#schedule-view" aria-label="Link to this section">#</a>
</h2>
<p>The schedule view shows upcoming events from the calendars you have selected.</p>
<p><img src="/content/images/2026/11/calendar-schedule.png" alt="Schedule view"></p>
<h2 id="sharing">Sharing
  <a class="heading-anchor" href="#sharing" aria-label="Link to this section">#</a>
</h2>
<p>A calendar can be shared with another <a href="https://docs.cloudron.io/user-management">Cloudron user or group</a>.</p>
<p><img src="/content/images/2026/11/calendar-share.png" alt="Sharing a calendar"></p>
<p>Each user or group is either read only or read and write.</p>
<h2 id="share-links">Share links
  <a class="heading-anchor" href="#share-links" aria-label="Link to this section">#</a>
</h2>
<p>A share link is a read-only ICS URL for one of your calendars. You can send the link by email. The recipient pastes the URL into a calendar app and subscribes.</p>
<p><img src="/content/images/2026/11/calendar-ics.png" alt="Sharing as iCalendar"></p>
<h2 id="public-sharing">Public sharing
  <a class="heading-anchor" href="#public-sharing" aria-label="Link to this section">#</a>
</h2>
<p>A calendar can be made public. Anyone with the link can view it on the web. The same page can be embedded in another website.</p>
<p><img src="/content/images/2026/11/calendar-public.png" alt="Public sharing"></p>
<h2 id="holidays-calendar">Holidays calendar
  <a class="heading-anchor" href="#holidays-calendar" aria-label="Link to this section">#</a>
</h2>
<p>A holiday calendar lists the public holidays for a country. The dates come from the <a href="https://www.thunderbird.net/calendar/holidays/">Thunderbird holiday calendar</a>. They stay up to date, and the events cannot be edited.</p>
<img src="/content/images/2026/11/calendar-holiday-add.png" alt="Adding a holidays calendar" width="420">
<p><img src="/content/images/2026/11/calendar-holidays.png" alt="German holidays in October"></p>
<h2 id="subscribe-to-an-external-calendar">Subscribe to an external calendar
  <a class="heading-anchor" href="#subscribe-to-an-external-calendar" aria-label="Link to this section">#</a>
</h2>
<p>You can subscribe to an external calendar with its ICS URL. If you have an iCalendar (.ics) file instead of a URL, import the events from that calendar&rsquo;s settings.</p>
<h2 id="sync">Sync
  <a class="heading-anchor" href="#sync" aria-label="Link to this section">#</a>
</h2>
<p>The calendars are exposed over CalDAV. You can use clients such as DAVx5, Thunderbird, and macOS Calendar to sync them onto your devices. The sync settings page shows the server URL, the username, and the well-known URL. For the password, you have to generate an <a href="https://docs.cloudron.io/profile#app-passwords">App password</a> in the Cloudron dashboard.</p>
<p><img src="/content/images/2026/11/calendar-sync.png" alt="CalDAV sync settings"></p>
<h2 id="feature-request">Feature request?
  <a class="heading-anchor" href="#feature-request" aria-label="Link to this section">#</a>
</h2>
<p>Want to see something else? One reason we built this app is that we can change it ourselves and keep the experience polished. Please file any feature requests in the <a href="https://forum.cloudron.io/category/224/calendar">Calendar forum</a>.</p>
]]></content:encoded></item><item><title>Cloudron Contacts</title><link>https://blog.cloudron.io/contacts/</link><guid>https://blog.cloudron.io/contacts/</guid><pubDate>Wed, 04 Nov 2026 00:00:00 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We announced the Cloudron Contacts app &lt;a href="https://forum.cloudron.io/topic/15634/contacts-calendar"&gt;on the forum&lt;/a&gt; a while ago, but we never really wrote about it. This post is that write-up.&lt;/p&gt;&#10;&lt;p&gt;Contacts is a web app for managing contacts. It is an alternative to Google Contacts on your own server. It has all the features that you would expect from a modern contacts app: address books, labels, photos, notes, search, and sync across devices.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We announced the Cloudron Contacts app <a href="https://forum.cloudron.io/topic/15634/contacts-calendar">on the forum</a> a while ago, but we never really wrote about it. This post is that write-up.</p>
<p>Contacts is a web app for managing contacts. It is an alternative to Google Contacts on your own server. It has all the features that you would expect from a modern contacts app: address books, labels, photos, notes, search, and sync across devices.</p>
<h2 id="address-books">Address books
  <a class="heading-anchor" href="#address-books" aria-label="Link to this section">#</a>
</h2>
<p>At its core, contacts are organized into address books. For example, you would create one for work, another one for family, and so on.</p>
<p><img src="/content/images/2026/11/contacts-addressbook.png" alt="An address book"></p>
<p>You can import contacts from other apps as vCard (VCF) or LDIF.</p>
<h2 id="labels">Labels
  <a class="heading-anchor" href="#labels" aria-label="Link to this section">#</a>
</h2>
<p>Labels group contacts across address books. A contact can belong to one or more labels.</p>
<p><img src="/content/images/2026/11/contacts-label.png" alt="The Friends label"></p>
<p>Pro tip: You can drag a contact from the list onto the label in the sidebar!</p>
<h2 id="sharing">Sharing
  <a class="heading-anchor" href="#sharing" aria-label="Link to this section">#</a>
</h2>
<p>An address book can be shared with another <a href="https://docs.cloudron.io/user-management">Cloudron user or group</a>.</p>
<p><img src="/content/images/2026/11/contacts-share.png" alt="Sharing an address book"></p>
<p>Each user or group is either a viewer (read access), an editor (add or remove contacts), or an admin (delete the address book).</p>
<h2 id="sync">Sync
  <a class="heading-anchor" href="#sync" aria-label="Link to this section">#</a>
</h2>
<p>The address books are exposed over CardDAV. You can use clients such as DAVx5, Thunderbird, and macOS Contacts to sync the address book
into your devices. The sync settings page shows the server URL and username. For the password, you have to generate an <a href="https://docs.cloudron.io/profile#app-passwords">App password</a> in the Cloudron dashboard.</p>
<p><img src="/content/images/2026/11/contacts-sync.png" alt="CardDAV sync settings"></p>
<h2 id="duplicate-finder">Duplicate finder
  <a class="heading-anchor" href="#duplicate-finder" aria-label="Link to this section">#</a>
</h2>
<p>The duplicate finder looks through an address book for contacts with similar names. It also matches contacts that share an email address or a phone number. You can merge a group into one contact.</p>
<p><img src="/content/images/2026/11/contacts-duplicates.png" alt="Duplicate contacts ready to merge"></p>
<h2 id="api">API
  <a class="heading-anchor" href="#api" aria-label="Link to this section">#</a>
</h2>
<p>Contacts has a JSON API, and every part of the app is programmable. Address books, contacts, search, labels, sharing, and merging duplicates are all calls. A workflow can organize and update contacts through that API.</p>
<p>The reference is the <a href="https://docs.cloudron.io/apps/contacts-api">Contacts API</a>.</p>
<h2 id="feature-request">Feature request?
  <a class="heading-anchor" href="#feature-request" aria-label="Link to this section">#</a>
</h2>
<p>Want to see something else? One reason we built this app is that we can change it ourselves and keep the experience polished. Please file any feature requests in the <a href="https://forum.cloudron.io/category/221/contacts">Contacts forum</a>.</p>
]]></content:encoded></item><item><title>Cloudron 10.1</title><link>https://blog.cloudron.io/cloudron-10-1/</link><guid>https://blog.cloudron.io/cloudron-10-1/</guid><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 10.1!&lt;/p&gt;&#10;&lt;p&gt;Last week was a frantic one, with multiple security vulnerabilities.&#10;&lt;a href="https://cert.europa.eu/publications/security-advisories/2026-018/"&gt;PHP RCE&lt;/a&gt;, the &lt;a href="https://emudhra.we-have-a-problem.com"&gt;eMudhra cert compromise&lt;/a&gt; and &lt;a href="https://app.opencve.io/cve/CVE-2026-110264"&gt;GitLab CVE-2026-110264&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;We have been on top of all this. All our app packages have been updated to fix the issues. We were also posting as we went on &lt;a href="https://social.cloudron.io/@cloudron"&gt;social.cloudron.io&lt;/a&gt; and &lt;a href="https://x.com/CloudronIO"&gt;X&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 10.1!</p>
<p>Last week was a frantic one, with multiple security vulnerabilities.
<a href="https://cert.europa.eu/publications/security-advisories/2026-018/">PHP RCE</a>, the <a href="https://emudhra.we-have-a-problem.com">eMudhra cert compromise</a> and <a href="https://app.opencve.io/cve/CVE-2026-110264">GitLab CVE-2026-110264</a>.</p>
<p>We have been on top of all this. All our app packages have been updated to fix the issues. We were also posting as we went on <a href="https://social.cloudron.io/@cloudron">social.cloudron.io</a> and <a href="https://x.com/CloudronIO">X</a>.</p>
<p>Cloudron 10.1 brings a major image update, new database versions, an improved installation flow, tons of bug fixes, and an updated Node.js that fixes the eMudhra security issue.</p>
<h2 id="base-image-update">Base image update
  <a class="heading-anchor" href="#base-image-update" aria-label="Link to this section">#</a>
</h2>
<p>The Cloudron app base image, which is shared across all apps, is now based on Ubuntu 26.04.</p>
<p>We have rebuilt all the App Store packages on it. If you still have pending app updates sitting on the dashboard, install those.</p>
<p>If you build your own packages, please move to the latest images. The full table is in the <a href="https://docs.cloudron.io/packaging/cheat-sheet#base-images">packaging cheat sheet</a>.</p>
<h2 id="database-updates">Database updates
  <a class="heading-anchor" href="#database-updates" aria-label="Link to this section">#</a>
</h2>
<p>PostgreSQL is now 18 and MongoDB is 8.3. On the mail side, Dovecot moved to 2.4.</p>
<p>We had to do the Postgres jump because some apps like GitLab and Moodle already require the newer version. Cloudron migrates existing databases automatically as part of the platform update. You do not have to dump or restore anything by hand.</p>
<h2 id="improved-installation-flow">Improved installation flow
  <a class="heading-anchor" href="#improved-installation-flow" aria-label="Link to this section">#</a>
</h2>
<p>Until now, you hit a self-signed certificate after installing Cloudron. Thanks to <a href="https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability">Let&rsquo;s Encrypt IP address certificates</a>, the installation page now gets a valid trusted certificate.</p>
<p><img src="/content/images/2026/10/image.png" alt="Domain setup with a trusted IP certificate"></p>
<h2 id="sqlite-backups">SQLite backups
  <a class="heading-anchor" href="#sqlite-backups" aria-label="Link to this section">#</a>
</h2>
<p>We used to back up SQLite databases as SQL text dumps. That format does not carry the whole database. Header bits like PRAGMA settings were missing, and restores could come back wrong.</p>
<p>We have switched to a backup-style dump (<code>VACUUM INTO</code>). That writes a real SQLite file, so the header and pragmas survive restore.</p>
<h2 id="other-notable-changes">Other notable changes
  <a class="heading-anchor" href="#other-notable-changes" aria-label="Link to this section">#</a>
</h2>
<ul>
<li>Email when the mail status check fails</li>
<li>Invite and password reset links expire after 24 hours</li>
<li>API tokens and login tokens are stored hashed</li>
<li>Users are edited on their own page, not a dialog</li>
<li>LDAP users and groups get a badge</li>
<li>Token exchange so first-party apps can talk to mail and each other without passing the user&rsquo;s token around</li>
<li>HSTS and related headers on error pages</li>
<li>Redis backup and restore with the non-persistent flag</li>
<li>Mail no longer keeps the previous hostname in SPF after a rename</li>
<li>Fix crash when stopping an integrity check</li>
</ul>
<h2 id="whats-coming-next">What&rsquo;s coming next
  <a class="heading-anchor" href="#whats-coming-next" aria-label="Link to this section">#</a>
</h2>
<p>Head over to our forum to learn more about What’s coming in <a href="https://forum.cloudron.io/topic/15974">our next release - 10.2</a>.</p>
<h2 id="install-cloudron">Install Cloudron
  <a class="heading-anchor" href="#install-cloudron" aria-label="Link to this section">#</a>
</h2>
<p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://cloudron.io/cloudron-setup
</span></span><span style="display:flex;"><span>chmod +x ./cloudron-setup
</span></span><span style="display:flex;"><span>./cloudron-setup
</span></span></code></pre></div>]]></content:encoded></item><item><title>Cloudron 10 - A decade of self-hosting</title><link>https://blog.cloudron.io/cloudron-10-a-decade-of-self-hosting/</link><guid>https://blog.cloudron.io/cloudron-10-a-decade-of-self-hosting/</guid><pubDate>Thu, 17 Sep 2026 14:31:44 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;I used to be quite a big Google Reader fanboy. I had a large RSS collection that I carefully assembled over many years, and Google Reader was the main way I read articles on the internet. It was quite a shock when the service was shut down. I think I was more annoyed that there was nothing I could do but accept the terms set by this big co, which couldn&amp;rsquo;t care less.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I used to be quite a big Google Reader fanboy. I had a large RSS collection that I carefully assembled over many years, and Google Reader was the main way I read articles on the internet. It was quite a shock when the service was shut down. I think I was more annoyed that there was nothing I could do but accept the terms set by this big co, which couldn&rsquo;t care less.</p>
<p>This episode got Johannes and me building Cloudron. A way to run apps on our servers without becoming full-time sysadmins. Ten years on, we have been lucky to build a stable company and a <a href="https://forum.cloudron.io">great community</a> that actually cares about self-hosting. Thank you for that!</p>
<p>Now, on to Cloudron 10 already!</p>
<h2 id="mail-server">Mail server
  <a class="heading-anchor" href="#mail-server" aria-label="Link to this section">#</a>
</h2>
<p>Mail is the piece of self-hosting people give up on first, given the complexity. Stubborn as we are, we keep investing in it to make it simple. If you think email cannot be reliably self-hosted, give us a try! You will have a working mail server in under 20 mins - batteries included. Most of that time will be spent trying to get an API token for your DNS 😀</p>
<p>In v10, forwarding lives on the mailbox. We also add <a href="https://www.rfc-editor.org/info/rfc8617/">ARC</a> (Authenticated Received Chain) headers, so forwarded mail can still prove it was genuine.</p>
<p><img src="/content/images/2026/09/image-12.png" alt=""></p>
<p><a href="https://docs.cloudron.io/email/#smtp-relay">Relay tokens</a> let apps and scripts send through the server without a mailbox password.</p>
<p><img src="/content/images/2026/09/image-6.png" alt="SMTP relay"></p>
<p>There is a <a href="https://docs.cloudron.io/email/#spam-filtering">global allow and deny list</a> for spam, and you can attach <a href="https://docs.cloudron.io/email/#admin-notes">notes</a> to mailboxes.</p>
<p><img src="/content/images/2026/09/image-7.png" alt="Global spam filtering options"></p>
<h2 id="webmail">Webmail
  <a class="heading-anchor" href="#webmail" aria-label="Link to this section">#</a>
</h2>
<p>The webmail apps we enjoyed like <a href="https://github.com/RainLoop/rainloop-webmail">Rainloop</a>, then <a href="https://github.com/the-djmaze/snappymail">SnappyMail</a> have unfortunately been abandoned ☹️. We decided it was about time to build our own webmail client.</p>
<p><a href="https://www.cloudron.io/store/#app/mail">Mail</a> is a new webmail client specifically made for Cloudron.</p>
<p><img src="/content/images/2026/09/image-8.png" alt="Cloudron webmail"></p>
<p>Fast search. One-click spam control. Create filters from a message. Integration with <a href="https://www.cloudron.io/store/#app/contacts">Contacts</a> and <a href="https://www.cloudron.io/store/#app/calendar">Calendar</a>. You know, the things you expect from modern web mail. Right now we are playing catch up and simply making it feature complete before starting to work on ideas that a generic IMAP client cannot do. We will write that up in a separate post.</p>
<h2 id="vpn-protection">VPN protection
  <a class="heading-anchor" href="#vpn-protection" aria-label="Link to this section">#</a>
</h2>
<p>These days you can point an agent at the source repository of an app and find vulnerabilities in a jiffy. Keeping apps updated is good, but sealing internal apps off the internet is better. We built VPN protection to restrict specific apps to WireGuard or OpenVPN.</p>
<p>First, install the <a href="https://www.cloudron.io/store/#app/vpn">VPN</a> app. It is self-service - users generate their own device keys.</p>
<p><img src="/content/images/2026/09/image-10.png" alt=""></p>
<p>Then <a href="https://docs.cloudron.io/network#vpn-protection">protect</a> specific apps with that VPN.</p>
<p><img src="/content/images/2026/09/image-9.png" alt="VPN protection"></p>
<p>When connecting without a VPN:</p>
<p><img src="/content/images/2026/09/image-13.png" alt="VPN connection required"></p>
<h2 id="container-registry">Container Registry
  <a class="heading-anchor" href="#container-registry" aria-label="Link to this section">#</a>
</h2>
<p>Cloudron’s app <a href="https://docs.cloudron.io/packaging/tutorial">deployment workflow</a> was built primarily for the Cloudron team. With AI, it is easier than ever to create custom packages and share them with other users. So we built Container registry: an OCI-compatible registry with a build server in the same app. <a href="/container-registry/">Read more about it</a>. And oh, the <a href="https://ca.cloudron.io/">Community Appstore</a> is nearing 100 apps!</p>
<p><img src="/content/images/2026/09/image-11.png" alt="Container registry"></p>
<h2 id="ubuntu-2604">Ubuntu 26.04
  <a class="heading-anchor" href="#ubuntu-2604" aria-label="Link to this section">#</a>
</h2>
<p>We have added support for Ubuntu 26.04 LTS Resolute Raccoon. It is the default for new installations. Existing servers can follow the <a href="https://docs.cloudron.io/guides/upgrade-ubuntu-26/">upgrade guide</a>. Note: Ubuntu 22.04 and 24.04 are still fully supported.</p>
<h2 id="single-sign-on">Single Sign-on
  <a class="heading-anchor" href="#single-sign-on" aria-label="Link to this section">#</a>
</h2>
<p>Ideally, after logging into the Cloudron dashboard, a user can use mail, Cubby and GitLab immediately, without entering a new password in each app.</p>
<p>LDAP got us part of the way, but it is not proper SSO. The app still sees the raw username and password. From a security standpoint, this was &ldquo;acceptable&rdquo; when we packaged everything ourselves, but not so good with all the new third-party packages.</p>
<p>So we have been moving packages to OpenID Connect (OIDC) where only Cloudron sees the password. As of this writing, 93 packages are on OIDC, the 11 <a href="https://docs.cloudron.io/packaging/addons#proxyauth">proxyAuth</a> apps already moved, about 25 still on LDAP. Getting there! 😄</p>
<p>You can also see which apps a user can access, and why.</p>
<p><img src="/content/images/2026/09/image-15.png" alt="App access"></p>
<h2 id="login-sessions">Login sessions
  <a class="heading-anchor" href="#login-sessions" aria-label="Link to this section">#</a>
</h2>
<p>The profile now lists Cloudron browser and CLI login sessions.</p>
<p><img src="/content/images/2026/09/image-14.png" alt="Login sessions"></p>
<h3 id="other-notable-changes">Other notable changes
  <a class="heading-anchor" href="#other-notable-changes" aria-label="Link to this section">#</a>
</h3>
<ul>
<li><a href="https://www.infomaniak.com/en">Infomaniak</a> as a DNS provider</li>
<li>Personal access tokens are now called <a href="https://docs.cloudron.io/settings#api-tokens">API tokens</a></li>
<li>Admins can create an <a href="https://docs.cloudron.io/profile#app-passwords">app password</a> that authenticates as another user</li>
<li>Password reset accepts a passkey as 2FA</li>
<li>TOTP backup codes</li>
<li>Email notification when an app updates successfully</li>
<li>Certificates and DNS sync show last run time and status</li>
<li>Backups preserve file modification times</li>
<li><a href="https://docs.cloudron.io/packaging/addons#redis">Redis</a>: <code>maxmemory</code> policy and a persistence flag</li>
<li><a href="https://docs.cloudron.io/packaging/addons#scim">SCIM</a> can list groups and admin roles</li>
<li>Security: sanitize HTML and markdown in the dashboard, enforce 2FA with the external LDAP connector, app links can no longer point at internal IPs</li>
</ul>
<h2 id="whats-coming-next">What&rsquo;s coming next
  <a class="heading-anchor" href="#whats-coming-next" aria-label="Link to this section">#</a>
</h2>
<p>Head over to our forum to learn more about what&rsquo;s <a href="https://forum.cloudron.io/topic/15974/what-s-coming-in-10.1">coming in our next release - 10.1</a>.</p>
<h2 id="install-cloudron">Install Cloudron
  <a class="heading-anchor" href="#install-cloudron" aria-label="Link to this section">#</a>
</h2>
<p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://cloudron.io/cloudron-setup
</span></span><span style="display:flex;"><span>chmod +x ./cloudron-setup
</span></span><span style="display:flex;"><span>./cloudron-setup
</span></span></code></pre></div>]]></content:encoded></item><item><title>Container registry</title><link>https://blog.cloudron.io/container-registry/</link><guid>https://blog.cloudron.io/container-registry/</guid><pubDate>Tue, 15 Sep 2026 07:39:49 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;The app story in Cloudron is changing, slowly but surely. Traditionally, app packages were built by the Cloudron team on our build servers, and users simply installed those prebuilt packages from the &lt;a href="https://docs.cloudron.io/packages/docker-registry"&gt;App Store&lt;/a&gt;. Creating a custom package meant installing the &lt;a href="https://docs.cloudron.io/packages/docker-builder"&gt;Docker Builder&lt;/a&gt; app and pushing the result to the &lt;a href="https://docs.cloudron.io/packages/docker-registry"&gt;Docker Registry&lt;/a&gt; app.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The app story in Cloudron is changing, slowly but surely. Traditionally, app packages were built by the Cloudron team on our build servers, and users simply installed those prebuilt packages from the <a href="https://docs.cloudron.io/packages/docker-registry">App Store</a>. Creating a custom package meant installing the <a href="https://docs.cloudron.io/packages/docker-builder">Docker Builder</a> app and pushing the result to the <a href="https://docs.cloudron.io/packages/docker-registry">Docker Registry</a> app.</p>
<p>With the rise of AI, it is easier than ever to experiment with custom apps and packages. We have made it a priority to simplify deploying and sharing them.</p>
<h2 id="source-builds">Source builds
  <a class="heading-anchor" href="#source-builds" aria-label="Link to this section">#</a>
</h2>
<p>In Cloudron 9.1, we made a fundamental change: packages can be built on the server itself, without the Docker Builder. New versions of the CLI default to this server-side workflow (<code>cloudron install</code> / <code>cloudron update</code> upload the source and build there), while still supporting the dedicated builder.</p>
<h2 id="community-app-store">Community App Store
  <a class="heading-anchor" href="#community-app-store" aria-label="Link to this section">#</a>
</h2>
<p>For sharing, we introduced <a href="https://docs.cloudron.io/packaging/versions">Community packages</a>. Third-party packagers publish a URL that anyone can use to install the package. As with the App Store, community packages pick up updates when the packager releases them.</p>
<p>To help people find those URLs, we launched the <a href="https://ca.cloudron.io/">Community App Store</a>. This has been an enormous success. Over 89 packages at the time of writing, all published in the last two months!</p>
<h2 id="introducing-the-container-registry">Introducing the Container Registry
  <a class="heading-anchor" href="#introducing-the-container-registry" aria-label="Link to this section">#</a>
</h2>
<p>The remaining gap was hosting. A community package still needs a Docker image that other Cloudrons can pull. The old <code>cloudron build</code> command was written mainly for our own app store workflow - building in a standalone builder, pushing the build into a registry and then submitting the package.</p>
<p>In Cloudron 10, that split goes away. The new <a href="https://docs.cloudron.io/packages/container-registry/">Container Registry</a> app both builds and hosts images, just like any modern registry. <code>cloudron build</code> is gone. The new <code>cloudron builder build</code> (similar to the Docker CLI) builds on the Container Registry and stores the image there.</p>
<p>Some features of the new Container Registry:</p>
<h3 id="dockeroci-compatible-registry">Docker/OCI compatible registry
  <a class="heading-anchor" href="#dockeroci-compatible-registry" aria-label="Link to this section">#</a>
</h3>
<p>It speaks the usual registry protocol. <code>docker login/push/pull</code> as you would with any other registry. It is a general-purpose container registry and can be used outside Cloudron i.e. the Cloudron CLI is only needed for deploying on Cloudron.</p>
<h3 id="browsable-catalog">Browsable catalog
  <a class="heading-anchor" href="#browsable-catalog" aria-label="Link to this section">#</a>
</h3>
<p>Repositories and tags are visible in the web UI: digests, sizes, platforms (including multi-arch), pull counts, and last pushed or pulled times. Search in the top bar finds repositories, tags, and builds.</p>
<p><img src="/content/images/2026/09/image.png" alt="Repository browser"></p>
<h3 id="repository-settings">Repository settings
  <a class="heading-anchor" href="#repository-settings" aria-label="Link to this section">#</a>
</h3>
<p>Each repository can be public (anonymous pull) or private (login required for pull and push). Tags can be mutable or immutable.</p>
<p><img src="/content/images/2026/09/image-1.png" alt="Repository settings"></p>
<h3 id="builds">Builds
  <a class="heading-anchor" href="#builds" aria-label="Link to this section">#</a>
</h3>
<p><code>cloudron builder login</code> and <code>cloudron builder build</code> send the build context to the registry. It builds with BuildKit and hosts the image in the same app. Builds appear in the UI with live logs and status.</p>
<p>This is also a security improvement over the old Docker Builder. That app built on the host Docker daemon, so a build could affect the rest of the server. Here, BuildKit runs inside the Container Registry app itself. <strong>Builds are sandboxed to the app and never touch the host Docker daemon.</strong></p>
<p><img src="/content/images/2026/09/image-2.png" alt="Builds"></p>
<p><img src="/content/images/2026/09/image-3.png" alt="Build logs live stream"></p>
<h3 id="build-from-triggers-or-webhooks">Build from triggers or webhooks
  <a class="heading-anchor" href="#build-from-triggers-or-webhooks" aria-label="Link to this section">#</a>
</h3>
<p>Builds can be automatically triggered on a source code push using the GitHub/GitLab integration.</p>
<p><img src="/content/images/2026/09/image-4.png" alt="Build triggers"></p>
<h3 id="tag-expiry">Tag expiry
  <a class="heading-anchor" href="#tag-expiry" aria-label="Link to this section">#</a>
</h3>
<p>A common issue with self-hosting a registry is running out of disk. Tag expiry keeps only the newest N tags in each repository and deletes the rest. This is currently a global setting but future versions will support it per repository.</p>
<p><img src="/content/images/2026/09/image-5.png" alt="Tag expiry"></p>
<h2 id="give-it-a-try">Give it a try!
  <a class="heading-anchor" href="#give-it-a-try" aria-label="Link to this section">#</a>
</h2>
<p><a href="https://www.cloudron.io/store/#app/container-registry">Cloudron Registry</a> can be installed from the App Store on Cloudron 10. Use the latest Cloudron CLI (v9.0.3) to point <code>cloudron builder</code> at it.</p>
]]></content:encoded></item><item><title>No one cares about failed SSH authentications, but what about successful ones?</title><link>https://blog.cloudron.io/no-one-cares-about-failed-ssh-authentifications-but-what-about-successful-ones/</link><guid>https://blog.cloudron.io/no-one-cares-about-failed-ssh-authentifications-but-what-about-successful-ones/</guid><pubDate>Mon, 10 Aug 2026 10:35:38 GMT</pubDate><dc:creator>Elias Hackradt</dc:creator><description>&lt;p&gt;Someone accessed your server and you don&amp;rsquo;t know about it!&lt;/p&gt;&#10;&lt;p&gt;Every server with an open SSH port is subjected to brute force attacks and there are many ways to prevent these.&lt;/p&gt;&#10;&lt;p&gt;Fail2Ban, obfuscating the port from 22 to something else, configuring SSHD:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PermitRootLogin no&#10;PasswordAuthentication no&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Awesome!&lt;/p&gt;&#10;&lt;p&gt;You have done your due diligence to ensure no one can access your server except you.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Someone accessed your server and you don&rsquo;t know about it!</p>
<p>Every server with an open SSH port is subjected to brute force attacks and there are many ways to prevent these.</p>
<p>Fail2Ban, obfuscating the port from 22 to something else, configuring SSHD:</p>
<pre tabindex="0"><code>PermitRootLogin no
PasswordAuthentication no
</code></pre><p>Awesome!</p>
<p>You have done your due diligence to ensure no one can access your server except you.</p>
<p>But remember this Hackathon you attended? You went to grab a drink and left your Notebook unlocked and someone swiftly stole your SSH private keys.</p>
<p>Since that day this person accessed your server and you never noticed.</p>
<h2 id="get-information-about-successful-ssh-authentications">Get information about successful SSH authentications
  <a class="heading-anchor" href="#get-information-about-successful-ssh-authentications" aria-label="Link to this section">#</a>
</h2>
<p>You could set up a monitoring solution like <a href="https://www.zabbix.com/">Zabbix</a> to get alerts or similar software.</p>
<p>But now you have to maintain another system.</p>
<p>Start simple, let the system itself send you notifications about successful SSH authentications!</p>
<p>Edit your SSHD config <code>/etc/ssh/sshd_config</code> and ensure the following is configured:</p>
<pre tabindex="0"><code>UsePAM yes
ExposeAuthInfo yes
</code></pre><p>Now create a <code>/usr/local/bin/ssh-notify.sh</code> file:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo touch /usr/local/bin/ssh-notify.sh
</span></span><span style="display:flex;"><span>sudo chmod <span style="color:#0550ae">755</span> /usr/local/bin/ssh-notify.sh
</span></span></code></pre></div><p>Edit the <code>/etc/pam.d/sshd</code> file and append at the end:</p>
<pre tabindex="0"><code>session optional pam_exec.so quiet /usr/local/bin/ssh-notify.sh
</code></pre><p>Test and restart your sshd service:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo sshd -t
</span></span><span style="display:flex;"><span>sudo systemctl restart ssh
</span></span></code></pre></div><p>Now we can code whatever we want in the <code>/usr/local/bin/ssh-notify.sh</code> file.</p>
<p>For example we could send a mail:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#57606a">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#0550ae">[</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_TYPE</span><span style="color:#0a3069">&#34;</span> <span style="color:#0550ae">=</span> <span style="color:#0a3069">&#34;open_session&#34;</span> <span style="color:#0550ae">]</span> <span style="color:#0550ae">||</span> <span style="color:#6639ba">exit</span> <span style="color:#0550ae">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#953800">TIME</span><span style="color:#0550ae">=</span><span style="color:#cf222e">$(</span>date -Is<span style="color:#cf222e">)</span>
</span></span><span style="display:flex;"><span><span style="color:#953800">HOST</span><span style="color:#0550ae">=</span><span style="color:#cf222e">$(</span>hostname<span style="color:#cf222e">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#953800">MAIL_FROM</span><span style="color:#0550ae">=</span><span style="color:#0a3069">&#34;ssh-alerts@domain.tld&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#953800">MAIL_TO</span><span style="color:#0550ae">=</span><span style="color:#0a3069">&#34;you@domain.tld&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#953800">SMTP_URL</span><span style="color:#0550ae">=</span><span style="color:#0a3069">&#34;smtps://smtp.your-provider.com:465&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#953800">SMTP_USER</span><span style="color:#0550ae">=</span><span style="color:#0a3069">&#34;ssh-alerts@domain.tld&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#953800">SMTP_PASS</span><span style="color:#0550ae">=</span><span style="color:#0a3069">&#34;your-smtp-password&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#953800">MAIL</span><span style="color:#0550ae">=</span><span style="color:#cf222e">$(</span><span style="color:#6639ba">printf</span> <span style="color:#0a3069">&#39;From: %s\nTo: %s\nSubject: SSH login: %s@%s from %s\nDate: %s\n\nTime:    %s\nUser:    %s\nHost:    %s\nFrom IP: %s\nTTY:     %s\nService: %s\n&#39;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  <span style="color:#0a3069">&#34;</span><span style="color:#953800">$MAIL_FROM</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$MAIL_TO</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_USER</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$HOST</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_RHOST</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>date -R<span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  <span style="color:#0a3069">&#34;</span><span style="color:#953800">$TIME</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_USER</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$HOST</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_RHOST</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_TTY</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_SERVICE</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6639ba">printf</span> <span style="color:#0a3069">&#39;%s&#39;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$MAIL</span><span style="color:#0a3069">&#34;</span> <span style="color:#1f2328">|</span> curl -s -m <span style="color:#0550ae">10</span> --url <span style="color:#0a3069">&#34;</span><span style="color:#953800">$SMTP_URL</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  --user <span style="color:#0a3069">&#34;</span><span style="color:#953800">$SMTP_USER</span><span style="color:#0a3069">:</span><span style="color:#953800">$SMTP_PASS</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  --mail-from <span style="color:#0a3069">&#34;</span><span style="color:#953800">$MAIL_FROM</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  --mail-rcpt <span style="color:#0a3069">&#34;</span><span style="color:#953800">$MAIL_TO</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  --upload-file - &gt;/dev/null 2&gt;<span style="color:#1f2328">&amp;</span><span style="color:#0550ae">1</span> <span style="color:#1f2328">&amp;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6639ba">exit</span> <span style="color:#0550ae">0</span>
</span></span></code></pre></div><p>Now you get a mail every time a successful SSH authentication happens and it looks like this:</p>
<pre tabindex="0"><code>Time:    2026-08-06T09:04:43+00:00
User:    root
Host:    my-domain.tld
From IP: I Am Not Publishing my IP here!
TTY:     ssh
Service: sshd
</code></pre><h2 id="send-the-data-elsewhere">Send the data elsewhere!
  <a class="heading-anchor" href="#send-the-data-elsewhere" aria-label="Link to this section">#</a>
</h2>
<p>Instead of writing more complex BASH script we can just send the data somewhere else for example <a href="https://n8n.io/">N8N</a>.</p>
<p>With a <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook">N8N Webhook node</a> we can receive data, so here is the BASH script to send the data to a N8N Webhook:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#57606a">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#0550ae">[</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_TYPE</span><span style="color:#0a3069">&#34;</span> <span style="color:#0550ae">=</span> <span style="color:#0a3069">&#34;open_session&#34;</span> <span style="color:#0550ae">]</span> <span style="color:#0550ae">||</span> <span style="color:#6639ba">exit</span> <span style="color:#0550ae">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>esc<span style="color:#0550ae">()</span> <span style="color:#0550ae">{</span> <span style="color:#6639ba">printf</span> <span style="color:#0a3069">&#39;%s&#39;</span> <span style="color:#0a3069">&#34;</span><span style="color:#953800">$1</span><span style="color:#0a3069">&#34;</span> <span style="color:#1f2328">|</span> sed <span style="color:#0a3069">&#39;s/\\/\\\\/g; s/&#34;/\\&#34;/g&#39;</span> <span style="color:#1f2328">|</span> tr -d <span style="color:#0a3069">&#39;\n&#39;</span><span style="color:#1f2328">;</span> <span style="color:#0550ae">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#953800">BODY</span><span style="color:#0550ae">=</span><span style="color:#cf222e">$(</span><span style="color:#6639ba">printf</span> <span style="color:#0a3069">&#39;{&#34;time&#34;:&#34;%s&#34;,&#34;user&#34;:&#34;%s&#34;,&#34;rhost&#34;:&#34;%s&#34;,&#34;tty&#34;:&#34;%s&#34;,&#34;service&#34;:&#34;%s&#34;,&#34;host&#34;:&#34;%s&#34;}&#39;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>date -Is<span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>esc <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_USER</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>esc <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_RHOST</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>esc <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_TTY</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>esc <span style="color:#0a3069">&#34;</span><span style="color:#953800">$PAM_SERVICE</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span> <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>esc <span style="color:#0a3069">&#34;</span><span style="color:#cf222e">$(</span>hostname<span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span><span style="color:#0a3069">&#34;</span><span style="color:#cf222e">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>curl -sk -m <span style="color:#0550ae">5</span> -X POST <span style="color:#0a3069">&#34;https://n8n.domain.tld/webhook/b234e48d-9ad3-4cf3-a2ab-4586d1b6755e&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#0a3069">&#34;Content-Type: application/json&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#0a3069">&#34;Authorization: ae46c075fe6a629efb1eaa5c5b1672a7&#34;</span> <span style="color:#0a3069">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#0a3069">&#34;</span><span style="color:#953800">$BODY</span><span style="color:#0a3069">&#34;</span> &gt;/dev/null 2&gt;<span style="color:#1f2328">&amp;</span><span style="color:#0550ae">1</span> <span style="color:#1f2328">&amp;</span>
</span></span><span style="display:flex;"><span><span style="color:#6639ba">exit</span> <span style="color:#0550ae">0</span>
</span></span></code></pre></div><p>From there we can do whatever we want with the data like store them in a SQLITE database and send a Telegram notification.</p>
<p><img src="/content/images/2026/08/image.png" alt=""></p>
]]></content:encoded></item><item><title>Cloudron 9.2</title><link>https://blog.cloudron.io/cloudron-9-2/</link><guid>https://blog.cloudron.io/cloudron-9-2/</guid><pubDate>Tue, 19 May 2026 10:45:40 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 9.2!&lt;/p&gt;&#10;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&#10;&lt;p&gt;Cloudron 9.2 adds a new SCIM addon, MySQL 8.4 and notification emails improvements.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 9.2!</p>
<p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p>
<p>Cloudron 9.2 adds a new SCIM addon, MySQL 8.4 and notification emails improvements.</p>
<h2 id="scim-addon">SCIM addon
  <a class="heading-anchor" href="#scim-addon" aria-label="Link to this section">#</a>
</h2>
<p><a href="https://www.rfc-editor.org/rfc/rfc7644">System for Cross-domain Identity Management API</a> provides user listing access to apps. With this change, apps are immediately aware of all users without requiring users to log in first.</p>
<p>We have implemented SCIM v2. See the <a href="https://docs.cloudron.io/packaging/addons#scim">documentation</a> for more information.</p>
<h2 id="mysql-84">MySQL 8.4
  <a class="heading-anchor" href="#mysql-84" aria-label="Link to this section">#</a>
</h2>
<p>MySQL 8.0 has reached end of life, and Cloudron now upgrades installations automatically to MySQL 8.4. We have tested all app packages with MySQL 8.4 to ensure compatibility, so the transition is seamless and requires no manual intervention from users.</p>
<h2 id="html-notification-emails">HTML notification emails
  <a class="heading-anchor" href="#html-notification-emails" aria-label="Link to this section">#</a>
</h2>
<p>Notification emails now include HTML variants in addition to the existing plain text format, resulting in a more polished and readable experience across mail clients. Email templates can also be tested directly from the “Send test email” button.</p>
<h2 id="other-notable-changes">Other Notable Changes
  <a class="heading-anchor" href="#other-notable-changes" aria-label="Link to this section">#</a>
</h2>
<ul>
<li>postgresql: remove old vecto.rs extension</li>
<li>Move configure/admin page link if any into the info view</li>
<li>dyndns: randomize the cron job that syncs the dns</li>
</ul>
<h2 id="whats-coming-next">What&rsquo;s coming next
  <a class="heading-anchor" href="#whats-coming-next" aria-label="Link to this section">#</a>
</h2>
<p>Head over to our forum to learn more about What&rsquo;s <a href="https://forum.cloudron.io/topic/15391/what-s-coming-in-cloudron-10">coming in our next release - 10</a>.</p>
<h2 id="install-cloudron">Install Cloudron
  <a class="heading-anchor" href="#install-cloudron" aria-label="Link to this section">#</a>
</h2>
<p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://cloudron.io/cloudron-setup
</span></span><span style="display:flex;"><span>chmod +x ./cloudron-setup
</span></span><span style="display:flex;"><span>./cloudron-setup
</span></span></code></pre></div>]]></content:encoded></item><item><title>Cloudron 9.1</title><link>https://blog.cloudron.io/cloudron-9-1/</link><guid>https://blog.cloudron.io/cloudron-9-1/</guid><pubDate>Tue, 14 Apr 2026 07:20:11 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 9.1!&lt;/p&gt;&#10;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like n8n, WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&#10;&lt;h2 id="notifications-view"&gt;Notifications view&#10; &lt;a class="heading-anchor" href="#notifications-view" aria-label="Link to this section"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;The notifications panel has been redesigned with read/unread state management.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 9.1!</p>
<p>For those unaware, Cloudron is a platform that makes it easy to run web apps like n8n, WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p>
<h2 id="notifications-view">Notifications view
  <a class="heading-anchor" href="#notifications-view" aria-label="Link to this section">#</a>
</h2>
<p>The notifications panel has been redesigned with read/unread state management.</p>
<p><img src="/content/images/2026/04/image-2.png" alt="Notifications view"></p>
<p>Two new notifications help you stay on top of updates:</p>
<ul>
<li><strong>Automatic app update failure</strong> - when an app fails to auto-update (e.g., due to an add-on incompatibility or resource constraint)</li>
<li><strong>Manual platform and app update required</strong> - when Cloudron platform or an installed app has a pending update that requires manual intervention</li>
</ul>
<h2 id="lets-encrypt-ari-support">Let&rsquo;s Encrypt ARI support
  <a class="heading-anchor" href="#lets-encrypt-ari-support" aria-label="Link to this section">#</a>
</h2>
<p>Certificates are renewed automatically based on suggested renewal times provided via <a href="https://www.rfc-editor.org/rfc/rfc9773.txt">ACME Renewal Information</a> (ARI). Benefits of ARI include reducing load spikes at the CA, faster revocation response, and smarter scheduling. Renewals typically occur 1 month before expiry.</p>
<h2 id="community-apps">Community apps
  <a class="heading-anchor" href="#community-apps" aria-label="Link to this section">#</a>
</h2>
<p>Third-party developers can now publish app packages independently using a <a href="https://docs.cloudron.io/packaging/publishing">CloudronVersions.json</a> file. Community apps receive automatic updates when the developer publishes new versions. Around 25 community apps are <a href="https://forum.cloudron.io/topic/15172/community-apps">already available</a>.</p>
<p><img src="/content/images/2026/04/image-4.png" alt="App store"></p>
<h2 id="packaging-backup-hooks--persistent-dirs">Packaging: Backup Hooks &amp; Persistent Dirs
  <a class="heading-anchor" href="#packaging-backup-hooks--persistent-dirs" aria-label="Link to this section">#</a>
</h2>
<p>Three new <a href="https://docs.cloudron.io/packaging/manifest/">manifest</a> fields (<code>backupCommand</code>, <code>restoreCommand</code>, and <code>persistentDirs</code>) have been added to make it possible to package database apps properly. Directories like <code>/var/lib/postgresql</code> can now persist across container updates, while backup and restore hooks can export and import logical database dumps so that snapshots are always consistent and portable across versions.</p>
<h2 id="source-builds">Source builds
  <a class="heading-anchor" href="#source-builds" aria-label="Link to this section">#</a>
</h2>
<p>Apps can now be built directly on the server using cloudron install and cloudron update. The CLI uploads the source directory to the server, which builds the Docker image and starts the app, eliminating the need for a local Docker setup or external build service. For those who prefer building locally or offloading to a dedicated server, <a href="https://docs.cloudron.io/packaging/tutorial#alternative-build-methods">alternative build methods</a> are still available.</p>
<h2 id="backup-integrity-check-ui">Backup Integrity Check UI
  <a class="heading-anchor" href="#backup-integrity-check-ui" aria-label="Link to this section">#</a>
</h2>
<p>The &ldquo;<a href="https://docs.cloudron.io/backups#check-integrity">Check integrity</a>&rdquo; action in the backup menu downloads the backup metadata from remote storage, verifies its signature, and validates all backup files against recorded checksums and sizes.</p>
<p><img src="/content/images/2026/04/image-11.png" alt=""></p>
<h2 id="filemanager-treeview">Filemanager Treeview
  <a class="heading-anchor" href="#filemanager-treeview" aria-label="Link to this section">#</a>
</h2>
<p>The file manager has a tree view in the left panel, making it easy to navigate deeply nested directory structures. Drag and drop across different folders is much simpler since both the source and destination can be visible at the same time.</p>
<p><img src="/content/images/2026/04/image-5.png" alt="Filemanager Treeview"></p>
<h2 id="passkeys">Passkeys
  <a class="heading-anchor" href="#passkeys" aria-label="Link to this section">#</a>
</h2>
<p>Passkeys enable passwordless login using a hardware security key, platform authenticator (fingerprint, Face ID), or password manager. A passkey can also serve as a second factor alongside a password.</p>
<p>Click <code>Set up</code> next to Passkey in the profile view to begin the registration process.</p>
<p><img src="/content/images/2026/04/image-6.png" alt="Enable passkey"></p>
<p>The login screen provides a &ldquo;Log in with a passkey&rdquo; option that authenticates without requiring a username or password.</p>
<p><img src="/content/images/2026/04/image-8.png" alt="Login with passkey"></p>
<h2 id="event-log-contextual-search">Event Log: Contextual Search
  <a class="heading-anchor" href="#event-log-contextual-search" aria-label="Link to this section">#</a>
</h2>
<p>Searching the email and system event logs now highlights matching entries in place instead of filtering out non-matching ones. This preserves the surrounding context, making it easier to understand what happened before and after each hit. Next and previous buttons allow quick navigation between matches.</p>
<p><img src="/content/images/2026/04/image-10.png" alt="Event Log Contextual search"></p>
<h2 id="lazy-service-start">Lazy Service Start
  <a class="heading-anchor" href="#lazy-service-start" aria-label="Link to this section">#</a>
</h2>
<p>Services like MongoDB, MySQL, PostgreSQL, and TURN are now started lazily, only spinning up when an installed app requires them. This significantly conserves memory and CPU on servers where not all services are in use.</p>
<p><img src="/content/images/2026/04/image-7.png" alt=""></p>
<h2 id="automatic-update-policy">Automatic Update Policy
  <a class="heading-anchor" href="#automatic-update-policy" aria-label="Link to this section">#</a>
</h2>
<p>Updates can now be configured with three policies: Disabled, Apps only, or Platform &amp; Apps. When enabled, a schedule controls which days and hours updates are applied.</p>
<p><img src="/content/images/2026/04/image-9.png" alt="Automatic update policy"></p>
<h2 id="other-notable-changes">Other Notable Changes
  <a class="heading-anchor" href="#other-notable-changes" aria-label="Link to this section">#</a>
</h2>
<ul>
<li>App passwords now support expiry dates</li>
<li>DigitalOcean Spaces: added missing ATL1, BLR1, and SYD1 regions</li>
<li>File manager: the terminal button automatically changes to the current directory</li>
<li>Support for CardDAV/CalDAV well-known endpoints</li>
<li>CLI: switched to a web-based browser login flow, leveraging existing 2FA and passkey authentication without caching passwords locally</li>
<li>i18n: added Czech translations. Thanks to <a href="https://forum.cloudron.io/user/archos">archos</a></li>
<li>Backup logs are now more terse and concise</li>
<li>App operator: fixed display of backup progress and logs</li>
<li>Location: the UI now shows which DNS records are being overwritten</li>
<li>Backup storage: removed the local disk provider</li>
</ul>
<h2 id="whats-coming-next">What&rsquo;s coming next
  <a class="heading-anchor" href="#whats-coming-next" aria-label="Link to this section">#</a>
</h2>
<p>Head over to our forum to learn more about What&rsquo;s <a href="https://forum.cloudron.io/topic/15391/what-s-coming-in-9.2">coming in our next release - 9.2</a>.</p>
<h2 id="install-cloudron">Install Cloudron
  <a class="heading-anchor" href="#install-cloudron" aria-label="Link to this section">#</a>
</h2>
<p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://cloudron.io/cloudron-setup
</span></span><span style="display:flex;"><span>chmod +x ./cloudron-setup
</span></span><span style="display:flex;"><span>./cloudron-setup
</span></span></code></pre></div><p>If you made it till here, here&rsquo;s a bonus - starting from Cloudron 9, you don&rsquo;t need to sign up anymore for a Cloudron.io account 🤗.</p>
]]></content:encoded></item><item><title>Cloudron 9</title><link>https://blog.cloudron.io/cloudron-9/</link><guid>https://blog.cloudron.io/cloudron-9/</guid><pubDate>Mon, 02 Feb 2026 15:34:35 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 9!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;h2 id="new-ui"&gt;New UI&lt;/h2&gt;&lt;p&gt;Cloudron 9 introduces a completely redesigned interface. The new UI is mobile-first by design, working seamlessly across phones, tablets, and desktops.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 9!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><h2 id="new-ui">New UI</h2><p>Cloudron 9 introduces a completely redesigned interface. The new UI is mobile-first by design, working seamlessly across phones, tablets, and desktops.</p><p>After a year of development, we've rebuilt the dashboard from the ground up using Vue.js 3.5, replacing 10 years of Angular 1.x code. To power the new interface, we developed <a href="https://git.cloudron.io/utils/pankow" rel="noreferrer">Pankow</a>—our open-source component library.</p><p>Some screenshots:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/image-7.png" class="kg-image" alt="" loading="lazy" width="2000" height="1083"><figcaption><span style="white-space: pre-wrap;">Dashboard</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/image-6.png" class="kg-image" alt="" loading="lazy" width="2000" height="1021"><figcaption><span style="white-space: pre-wrap;">Appstore view</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/image-4.png" class="kg-image" alt="" loading="lazy" width="1874" height="1489"><figcaption><span style="white-space: pre-wrap;">Login view</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/image-5.png" class="kg-image" alt="" loading="lazy" width="1841" height="586"><figcaption><span style="white-space: pre-wrap;">Users view</span></figcaption></figure><h2 id="multiple-backup-sites">Multiple backup sites</h2><p>Cloudron can now back up to multiple destinations. Each destination, also known as <a href="https://docs.cloudron.io/backups/#backup-sites" rel="noreferrer">Backup site</a>, can use a different storage provider and schedule. You can also choose what to store on each site - everything, only selected apps or everything except some apps. For example, back up everything to your primary Digital Ocean Spaces bucket daily, while sending some critical apps to a secondary attached disk storage for extra redundancy.</p><figure class="kg-card kg-image-card"><img src="/content/images/2026/02/backups-sites-list.webp" class="kg-image" alt="" loading="lazy" width="1855" height="933"></figure><h2 id="live-graphs">Live graphs</h2><p>The Server view now displays real-time and historical graphs for CPU, memory, disk I/O, and network I/O with selectable timeframes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/image-1.png" class="kg-image" alt="" loading="lazy" width="1874" height="1290"><figcaption><span style="white-space: pre-wrap;">Live graphs</span></figcaption></figure><h2 id="backup-stats-integrity">Backup stats &amp; integrity</h2><p>Cloudron 9 now tracks backup statistics for every backup. You can see the backup size, backup contents (file count &amp; app count), and the time it took to create the backup in the backup info dialog.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2026/02/backups-stats.webp" class="kg-image" alt="" loading="lazy" width="1189" height="1470"><figcaption><span style="white-space: pre-wrap;">Backup info</span></figcaption></figure><p>A hidden feature is that <a href="https://docs.cloudron.io/backups/#backup-integrity" rel="noreferrer">integrity information</a> is now stored alongside the backups. Each backup includes a SHA256 checksum and file size for verification. This allows detection of corrupted backups before restoration, ensuring only valid backups are used. The verification UI is coming in Cloudron 9.1, which will allow you to manually verify backup integrity at any time.</p><h2 id="multiple-docker-registries">Multiple docker registries</h2><p>Multiple private Docker registries can now be configured (previously limited to one), with credentials automatically selected based on the image's registry hostname.</p><figure class="kg-card kg-image-card"><img src="/content/images/2026/02/docker-registry-list.webp" class="kg-image" alt="" loading="lazy" width="1851" height="538"></figure><h2 id="hetzner-cloud-dns">Hetzner Cloud DNS</h2><p>Hetzner is migrating its DNS Console into Hetzner Cloud. We have added support for the new Hetzner Cloud DNS API. <a href="https://docs.hetzner.com/networking/dns/migration-to-hetzner-console/process" rel="noreferrer">Migrate</a> your domain first and then choose the new provider in the <code>Domains</code> view.</p><figure class="kg-card kg-image-card"><img src="/content/images/2026/02/image-2.png" class="kg-image" alt="" loading="lazy" width="1185" height="676"></figure><h2 id="synology-c2">Synology C2</h2><p><a href="https://c2.synology.com/en-us/object-storage/overview" rel="noreferrer">Synology C2</a> is now a supported backup destination. Create a backup site with C2 credentials to store your backups.</p><figure class="kg-card kg-image-card"><img src="/content/images/2026/02/backups-synology-c2.webp" class="kg-image" alt="" loading="lazy" width="1190" height="1152"></figure><h2 id="vanity-nameservers">Vanity nameservers</h2><p>Domains can now use custom (vanity) nameservers like <code>ns1.yourdomain.com</code> instead of provider defaults. Enable the option in advanced settings to bypass nameserver verification checks.</p><figure class="kg-card kg-image-card"><img src="/content/images/2026/02/image-3.png" class="kg-image" alt="" loading="lazy" width="1185" height="1111"></figure><h2 id="sshfs-optimizations">SSHFS optimizations</h2><p>Hetzner Storage Box is a widely used SSHFS backup destination. Performance optimizations have been made to the SSHFS storage backend to skip FUSE calls and use SSH directly. Users can expect 10-100x speed improvements when using the <code>rsync</code> backup format.</p><h2 id="new-docs">New docs</h2><p><a href="https://docs.cloudron.io" rel="noreferrer">Documentation</a> has been migrated from MkDocs to <a href="https://docusaurus.io/" rel="noreferrer">Docusaurus</a>. The <a href="https://docs.cloudron.io/api/" rel="noreferrer">API</a> is now fully documented with complete endpoint references and examples</p><h2 id="notifications">Notifications</h2><p>New email notifications: server reboot required, update failures, and low disk space alerts (triggered at 90% capacity).</p><p>We are also working on a new Notifications view for 9.1 .</p><h2 id="other-notable-changes">Other Notable Changes</h2><ul><li>Software updates: Haraka (3.1.2), Docker (28.1.1), Redis (8.2.2), MongoDB (7.0.28 - this fixes mongobleed)</li><li>Support for Ubuntu 20.04 is deprecated</li><li>API keys of domains are periodically validated</li><li>Optional addons are disabled by default for new installations</li><li>mail: Brevo mail relay</li><li>App backup runs separately in a background and does not block app operations</li><li>Security: <a href="https://docs.cloudron.io/profile#api-tokens" rel="noreferrer">API tokens</a> can now be restricted to specific IP addresses or subnets</li><li>Gravatar support for profile pictures is dropped</li><li>Admins can manage profile pictures of users</li><li>OCSP support has been removed. Let's Encrypt <a href="https://letsencrypt.org/2024/12/05/ending-ocsp" rel="noreferrer">now uses CRLs</a>.</li><li>OpenID: <a href="https://docs.cloudron.io/user-directory/#endpoints" rel="noreferrer">Workaround</a> bug in Cloudflare Access</li><li>CSP/Robots has common patterns</li><li>mail: add rbl6 check</li></ul><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/14976/what-s-coming-in-9.1" rel="noreferrer">coming in our next release - 9.1</a>.</p><h2 id="install-cloudron">Install Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>wget https://cloudron.io/cloudron-setup<br>chmod +x ./cloudron-setup<br>./cloudron-setup</p><p>If you made it till here, here's a bonus - starting from Cloudron 9, you don't need to sign up anymore for a Cloudron.io account 🤗.</p>
]]></content:encoded></item><item><title>Cloudron 8.3 released</title><link>https://blog.cloudron.io/cloudron-8-3-released/</link><guid>https://blog.cloudron.io/cloudron-8-3-released/</guid><pubDate>Mon, 07 Apr 2025 08:14:16 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 8.3!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;p&gt;Cloudron 8.3 upgrades the base docker image and provides seamless upgrade of the databases.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 8.3!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><p>Cloudron 8.3 upgrades the base docker image and provides seamless upgrade of the databases.</p><h2 id="new-base-image">New base image</h2><p>Cloudron apps and <a href="https://docs.cloudron.io/packaging/addons/" rel="noreferrer">addons</a> use an Ubuntu 24.04 LTS based image. The new docker image ID is <code>cloudron/base:5.0.0@sha256:04fd70dbd8ad6149c19de39e35718e024417c3e01dc9c6637eaf4a41ec4e596c</code>. Please update the Dockerfile of your custom apps to use this as the base .</p><h2 id="database-upgrades">Database upgrades</h2><p>A core part of Cloudron's self-hosting approach is that users shouldn't have to worry about database choices or database versions that are used by apps. The app packaging mechanism makes the appropriate choices based on the app's preferences.</p><p>This release contains many upgrades to the underlying databases and frameworks. The upgrade procedure is entirely transparent and hands-off.</p><ul><li>PostgreSQL is upgraded from v14 to v16</li><li>MySQL is upgraded to v8.0.41</li><li>MongoDB upgraded from v6 to v7</li><li>Redis is upgraded to v7.4</li><li>PHP 8.3 is now the minimum in all apps</li><li>Default node version is 22.14.0 TLS</li><li>Solr, used by mail server for FTS, is upgraded to v9</li><li>Default python is 3.12</li></ul><h2 id="database-connection-commands">Database connection commands</h2><p>You can now use <code>cloudron_&lt;db&gt;</code> to connect to the database from the <a href="https://docs.cloudron.io/apps/#web-terminal" rel="noreferrer">Web Terminal</a>. So, you can cloudron exec and then <code>cloudron_mysql</code> to connect to mysql without having to type out those <a href="https://docs.cloudron.io/packaging/addons/#mysql" rel="noreferrer">pesky env vars</a>.</p><figure class="kg-card kg-image-card"><img src="/content/images/2025/04/image.png" class="kg-image" alt="" loading="lazy" width="806" height="373"></figure><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/13113/what-s-coming-in-cloudron-9" rel="noreferrer">coming in our next release - 9</a>.</p><h2 id="install-or-update-cloudron">Install or update Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>To update an existing installation, simply click on the 'Update now' button on your dashboard.</p>
]]></content:encoded></item><item><title>Cloudron 8.2 Released</title><link>https://blog.cloudron.io/cloudron-8-2-released/</link><guid>https://blog.cloudron.io/cloudron-8-2-released/</guid><pubDate>Mon, 13 Jan 2025 09:50:25 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 8.2!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;p&gt;Cloudron 8.2 includes support for Sqlite addon, Mail attachment search, OIDC Provider Name Customization, Device Mounts, App Archive, Parallel Tasks, Email notifications, Quay fallback &amp;amp; many bug fixes.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 8.2!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><p>Cloudron 8.2 includes support for Sqlite addon, Mail attachment search, OIDC Provider Name Customization, Device Mounts, App Archive, Parallel Tasks, Email notifications, Quay fallback &amp; many bug fixes.</p><h2 id="sqlite-addon">Sqlite Addon</h2><p>We are seeing more self-hosted applications support Sqlite. Sqlite databases have to be backed up carefully since a simple <code>cp</code> might copy a corrupt database when it's not in <a href="https://www.sqlite.org/wal.html" rel="noreferrer">WAL</a> mode.</p><p>We have added support for <a href="https://docs.cloudron.io/packaging/addons/#sqlite" rel="noreferrer">Sqlite addon</a>. Like with other databases, Cloudron now takes portable backups of Sqlite databases listed in <code>CloudronManifest.json</code>.</p><h2 id="oidc-provider-name-customization">OIDC Provider Name Customization</h2><p>The <a href="https://docs.cloudron.io/branding/#overview" rel="noreferrer">Cloudron Name</a> set in the <code>Branding</code> view is now automatically set as the OIDC Provider Name.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-2.png" class="kg-image" alt="" loading="lazy" width="750" height="241"></figure><p>App packages can use the new <code>CLOUDRON_OIDC_PROVIDER_NAME</code> environment variable to customize the text of their login buttons. Here's Immich and Grafana making use of the OIDC Provider Name in their login buttons.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="/content/images/2024/12/image-3.png" width="565" height="772" loading="lazy" alt=""></div><div class="kg-gallery-image"><img src="/content/images/2024/12/image-4.png" width="451" height="537" loading="lazy" alt=""></div></div></div></figure><h2 id="device-mounts">Device Mounts</h2><p>Apps like OpenHAB, Home Assistant, Emby, Jellyfin have device integrations and require access to devices on the host. A list of host devices to be made available to the app can now be specified in the <code>Devices</code> section.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-5.png" class="kg-image" alt="" loading="lazy" width="819" height="671"></figure><h2 id="parallel-tasks">Parallel Tasks</h2><p>Cloudron had a global lock (in code) preventing operations like backups, updates and app operations from proceeding in parallel. We have removed this global lock and replaced it with a more granular app level lock. A full backup or a Cloudron update can now run in parallel with app operations.</p><h2 id="app-archive">App Archive</h2><p>The <a href="https://docs.cloudron.io/apps/#archive" rel="noreferrer">App Archive</a> feature provides a way to uninstall an app and have the safety mechanism of easily restoring it later. When an app is archived, it is uninstalled from the server, but its latest backup is stored in the <code>App Archive</code>.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-6.png" class="kg-image" alt="" loading="lazy" width="822" height="666"></figure><p>The <code>App Archive</code> is located in the Backups view.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-7.png" class="kg-image" alt="" loading="lazy" width="736" height="401"></figure><h2 id="mail-attachment-search">Mail Attachment Search</h2><p>Cloudron Mail will index mail attachments using Apache Tika when <a href="https://docs.cloudron.io/email/#full-text-search" rel="noreferrer">Full Text Search</a> is enabled.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-10.png" class="kg-image" alt="" loading="lazy" width="592" height="182"></figure><h2 id="email-notifications">Email Notifications</h2><p>In older Cloudron versions, we used to send email notifications by default to all admins. This was considered too spammy and was removed. We have brought email notifications back with the ability for each user to control what emails they want to receive.</p><p>Personal email notification preferences can be configured in the <code>Notifications</code> view:</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-8.png" class="kg-image" alt="" loading="lazy" width="589" height="307"></figure><h2 id="quay-fallback">Quay Fallback</h2><p>DockerHub seems to use <a href="https://www.docker.com/blog/beta-ipv6-support-on-docker-hub-registry/" rel="noreferrer">first 64 bits of IPv6 address</a> for rate limiting. Unfortunately, this results in many Cloudrons hitting rate limits incorrectly. As a workaround, we have started pushing our app images to Quay.io under the username <code>cloudron</code> . When a pull from DockerHub fails, the code fallsback to pulling from Quay.io .</p><h2 id="other-notable-changes">Other Notable Changes</h2><ul><li>mail: Update Haraka to 3.0.5</li><li>Update docker to 27.3.1</li><li>Security: Samy Mahi reported a critical vulnerability which allows Cloudron admins to get SSH access. We thank Samy for making a responsible disclosure to us (<a href="https://www.cloudron.io/security/sami-mahi-readme.pdf" rel="noreferrer">README</a> and <a href="https://www.cloudron.io/security/samy-mahi-last-report.pdf" rel="noreferrer">REPORT</a>).</li><li>Slow disks can be <a href="https://docs.cloudron.io/system/#disk-usage" rel="noreferrer">excluded</a> from periodic disk usage collection.</li><li>postgres: add support for <a href="https://github.com/pgvector/pgvector" rel="noreferrer"><code>vector</code> extension</a>.</li><li>groups: add events to eventlog</li><li>Hetzner: add Helsinki location for backups</li><li>scheduler: create jobs with Cloudron Time Zone setting</li><li>Gandi: add support for <a href="https://docs.gandi.net/en/managing_an_organization/organizations/personal_access_token.html" rel="noreferrer">Personal Access Tokens</a></li></ul><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-7-6"><a href="https://forum.cloudron.io/topic/13113/what-s-coming-in-cloudron-9" rel="noreferrer">coming in our next release - 9</a></a>.</p><h2 id="install-or-update-cloudron">Install or update Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>To update an existing installation, simply click on the 'Update now' button on your dashboard.</p>
]]></content:encoded></item><item><title>Firstimer - a long way to complete my first app package</title><link>https://blog.cloudron.io/firstimer-a-long-way-to-complete-my-first-app-package/</link><guid>https://blog.cloudron.io/firstimer-a-long-way-to-complete-my-first-app-package/</guid><pubDate>Sat, 14 Dec 2024 21:39:01 GMT</pubDate><dc:creator>Stephan Luckow</dc:creator><description>&lt;p&gt;I am not a developer, though I have been working with computers for nearly 40 years. I use apps on Cloudron, configure them to suit my specific use cases, explore new technologies, and orchestrate free and open-source tools to move closer to achieving digital sovereignty.&lt;/p&gt;&lt;p&gt;Waiting for new apps to appear in the Cloudron app catalog is one way to address missing features. Last weekend, I decided to explore what it takes to get a new app up and running.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I am not a developer, though I have been working with computers for nearly 40 years. I use apps on Cloudron, configure them to suit my specific use cases, explore new technologies, and orchestrate free and open-source tools to move closer to achieving digital sovereignty.</p><p>Waiting for new apps to appear in the Cloudron app catalog is one way to address missing features. Last weekend, I decided to explore what it takes to get a new app up and running.</p><p>In this <a href="https://forum.cloudron.io/topic/11545/findmydeviceserver-is-a-missing-piece-for-degoogled-android-phones" rel="noopener">forum post</a>, I shared my thoughts on a missing piece for de-Googled Android phones: a FindMyDevice server. To be fair, I’ve never lost a phone or been robbed, but having everything set up just in case gives me peace of mind.</p><p>I had heard of Docker before and experimented with Dockerfiles and docker-compose. I also tried out the beginner apps mentioned in the Cloudron documentation and, in the past, set up a private registry and the Cloudron build service. So, the mise en place was already done before getting started. The rest should be easy.</p><p>TL;DR: It took me nearly 8 hours to get the app running, ensure it worked properly, and make sure individual configuration changes persisted through app updates.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2024/12/lostincomplexity.png" class="kg-image" alt="" loading="lazy" width="1216" height="832"><figcaption><span style="white-space: pre-wrap;">A large, interactive screen, seemingly suspended in the air or projected onto a wall, dominates the center of the image.&nbsp;This screen displays a complex network diagram, with various colored boxes and lines connecting them, representing data flow and connections within the network. The colors are vibrant, including blues, oranges, and purples.&nbsp;Text blocks are also visible on the screen, which could be descriptions or data associated with the network components.</span></figcaption></figure><h2 id="basicswhere-to-start"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Basics---where-to-start"></a>Basics - where to start</h2><p>While it’s possible to create an app package using Docker build on your local computer, it’s not the ideal approach. Instead, you’ll want to use the <a href="https://www.cloudron.io/store/io.cloudron.buildservice.html" rel="noopener">Cloudron Build Service</a> (CBS). The primary reason for choosing CBS is the bandwidth available in the data center where your Cloudron instance is hosted. Building apps involves downloading and uploading large amounts of data, often several gigabytes. This can be especially challenging in Germany, where slow household internet infrastructure makes such tasks cumbersome.</p><p>There’s no real need to use a self-hosted Docker registry, but since we can, we go ahead and install the <a href="https://www.cloudron.io/store/com.docker.registry.html" rel="noopener">Cloudron Container Registry</a> (CCR) from the Cloudron app store.</p><p>You’ll also need a Cloudron instance where you have admin privileges. This allows you to configure the Cloudron instance to use a private registry, install apps, and connect your Cloudron CLI to the instance.</p><p>One of the final steps is to install the Cloudron CLI on your personal computer.</p><h3 id="documentation-configuration-first-challenge"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Documentation-configuration-first-challenge"></a>Documentation, configuration, first challenge</h3><p>Follow these links to read about the installation and configuration. Once everything is set up and working, try out one of the ‘Hello World’ examples.</p><p><a href="https://docs.cloudron.io/packaging/cli/" rel="noopener">Cloudron CLI - Documentation</a><br><a href="https://docs.cloudron.io/apps/docker-builder/" rel="noopener">Cloudron Build Service - Documentation</a><br><a href="https://www.cloudron.io/store/com.docker.registry.html" rel="noopener">Cloudron Container Registry - Documentation</a><br><a href="https://docs.cloudron.io/packaging/tutorial/#sample-app" rel="noopener">First challenge - hello world app</a></p><p>The moment the ‘Hello World’ app works, it’s time for fireworks! 🎆</p><h2 id="which-app-to-start-with"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Which-app-to-start-with"></a>Which app to start with?</h2><p>If you’ve never looked into the complexity of apps, start with a simple one. By “simple”, I mean ideally a Go binary.</p><h3 id="bird%E2%80%99s-eye-view-of-cloudron-app-architecture"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Bird%E2%80%99s-eye-view-of-Cloudron-app-architecture"></a>Bird’s-eye view of Cloudron app architecture</h3><p>The typical Cloudron app runs as a Docker container on the Cloudron platform. The app code, which you want to update without affecting user changes, is stored on a read-only partition (<code>/app/code/</code>). User data and allowed changes are stored on a read-write partition (<code>/app/data/</code>).</p><p>There are many open-source projects out there that scatter user data across the file system. Dealing with such tools can be challenging, as it requires a deep understanding of the software. A symbolic link can sometimes offer a solution, but managing more than five of them starts to feel completely unmanageable.</p><p>Many open-source projects require databases or in-memory data structure servers like Redis. In their Docker Compose files, they typically bundle these services together. Cloudron’s approach is to offer these services as so-called add-ons, which you can activate in your Cloudron manifest. The benefit for users: after installing 10 apps that require a PostgreSQL database, you won’t end up with 10 separate PostgreSQL installations on your server.</p><h2 id="why-go-in-my-use-case"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Why-Go-in-my-use-case"></a>Why Go (in my use case)?</h2><p>I came across the FindMyDevice server and decided to try it out as a Docker Compose installation. Upon inspecting the architecture, I found the following components:</p><ul><li>A Go binary</li><li>A SQLite database</li><li>A configuration file</li><li>An Nginx example file</li><li>A complete web UI in a folder</li></ul><p>So, it felt feasible as my first personal adventure in app packaging.</p><h2 id="where-should-it-be-stored-what-questions-should-you-ask"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Where-should-it-be-stored-What-questions-should-you-ask"></a>Where should it be stored? What questions should you ask?</h2><p>The Go binary is code and requires no user input, so it goes to <code>/app/code/</code></p><p>The app has no other option for storing data than SQLite, meaning we can’t use a database add-on from the Cloudron platform. Since the app stores user data in the SQLite database, it must be placed in <code>/app/data/</code>.</p><p>Some settings in the configuration file depend on the user’s decisions, which is why it has to be stored in <code>/app/data/</code>.</p><p>Since the Cloudron app platform handles the full reverse proxy and Let’s Encrypt flow, we don’t need the Nginx example file. <code>/dev/null</code> is your friend.</p><p>I decided not to dive into the complexities of web UIs, multilingual support, and all the potential feature requests (especially once users realize what’s possible), so I placed the entire folder in /app/code/.</p><h2 id="how-to-start"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#How-to-start"></a>How to start?</h2><p>I decided to work with a real-world (and live) app package. In my case, I chose the <a href="https://git.cloudron.io/apps/vault-app" rel="noopener">Vault app</a>. Long story short, it helped, but introduced a lot of unnecessary elements that I didn’t fully understand, so I later handed them over to my friend <code>/dev/null</code>.</p><p>To have the same in mind, check out the app package for the <a href="https://git.cloudron.io/apps/findmydevice-app" rel="noopener">FindMyDevice Server</a></p><h2 id="the-file-structure-of-an-app-package"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#The-file-structure-of-an-app-package"></a>The file structure of an app package</h2><h3 id="the-essentials"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#The-essentials"></a>The essentials</h3><p><a href="https://git.cloudron.io/apps/findmydevice-app/-/blob/master/CloudronManifest.json" rel="noopener">Cloudron-Manifest.json</a></p><p>The manifest follows a schema, and most of its structure is self-explanatory. For me, working with the id field was completely new. In the end, it’s simple: normally, you include the app’s domain, but in reverse order.<br>If you want to package an app that won’t be part of the Cloudron app store, not every property in the manifest is required. However, <code>httpPort</code> is mandatory because it’s used by the reverse proxy functionality and for the health check.</p><p><a href="https://git.cloudron.io/apps/findmydevice-app/-/blob/master/Dockerfile" rel="noopener">Dockerfile</a></p><p>The Dockerfile is straightforward: start with the base image, define and create the working directory, and use wget to download the package from GitLab. Unzip it into the working directory, remove unnecessary files, copy the relevant files into <code>/app/pkg</code>, and set up the start command.<a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#configyml"></a></p><p><a href="https://git.cloudron.io/apps/findmydevice-app/-/blob/master/config.yml" rel="noopener">config.yml</a></p><p>Nearly every app requires some configuration. In my case, I found the project’s <a href="https://gitlab.com/Nulide/findmydeviceserver/-/blob/master/config.example.yml" rel="noopener">config.example.yml</a> file.</p><p><code>UnixSocketPath</code>, <code>UnixSocketChmod</code>, <code>PortSecure</code>, and <code>PortInsecure</code> don’t make sense in a Cloudron context. The rest of the configuration should be left for the user to customize with their own values.</p><p>During my hours of packaging the app, I realized that the server wasn’t capable of using the httpPort defined in the manifest. Instead, it defaulted to a random port, which wasn’t ideal for the intended goal. In the end, I had to add the <code>PortInsecure</code> variable and set it to match the port specified in the manifest.</p><p>Since we can, we often tweak defaults. However, to avoid frustrating users, it’s important to address potential support issues—such as the fact that only 8080 works as the <code>PortInsecure</code> variable in <em>my package</em>.</p><p><a href="https://git.cloudron.io/apps/findmydevice-app/-/blob/master/start.sh" rel="noopener">start.sh</a><br>To be fair, the hardest part was feeling like I needed to be a developer to better understand the underlying magic.</p><p><code>set -eu</code> ensures the script crashes when something is undefined instead of running with unspecified behavior. Since we chose <code>localstorage</code> as an add-on in the manifest, we need to create the <code>/app/data</code> folder to store user or app-specific data.</p><p>The <code>if-then-fi</code> loop checks whether <code>config.yml</code> exists. If it doesn’t, the file is copied to the specified location.</p><p><code>yq eval -i ".PortInsecure=8080" /app/data/config.yml</code> is part of the magic I hadn’t encountered before. From what I understand, it searches for the <code>PortInsecure</code> value in the config file and updates it to the correct port. Since every change to the config requires an app restart, and <code>start.sh</code> runs on each restart, the user can modify and save a different port—but not in a persistent state. (potential support issue solved.)</p><p><code>chown -R cloudron:cloudron /app/data</code> changes the owner of the files to the correct user.</p><p>The <code>exec gosu cloudron:cloudron /app/code/findmydeviceserver serve --db-dir=/app/data --config=/app/data/config.yml --web-dir=/app/code/web</code> starts the server with some configuration options with the correct user.</p><h4 id=""><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#LICENSE"></a></h4><p><a href="https://git.cloudron.io/apps/findmydevice-app/-/blob/master/LICENSE" rel="noopener">LICENSE</a></p><p>Every Cloudron app package is released under an open-source license, which is why we include a License file.</p><h3 id="more-than-nice-to-have"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#more-than-nice-to-have"></a>more than nice to have</h3><ul><li>DESCRIPTION.md</li><li>README.md</li><li>CHANGELOG</li><li>logo.png</li><li>screenshots</li></ul><p>They’re nice to have, but they become necessary once the app is submitted to the Cloudron app store.</p><h3 id="sanitation"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Sanitation"></a>Sanitation</h3><ul><li>.dockerignore</li><li>.gitignore</li></ul><p>Normal in software development.</p><h2 id="challenge-accepted-and-completed"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#Challenge-accepted-and-completed"></a>Challenge accepted and completed!</h2><p>The moment I took this photo: Unbelievable. The initial package works.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2024/12/remotetakenpicture-1.png" class="kg-image" alt="" loading="lazy" width="1399" height="1097"><figcaption><span style="white-space: pre-wrap;">The image is a split screen, showing three distinct parts.The image is a split screen, showing three distinct parts.The leftmost panel shows a portion of a digital map, likely a navigation or location-based app. It displays light green and tan colors representing land areas, and faint, light-colored lines suggestive of roads or paths. A green bar at the bottom shows controls, including arrow buttons (left and right), and a location marker. The central panel is a close-up view of a person, likely taken by a webcam. The person is wearing a dark-hooded sweatshirt or jacket. Only their head and upper shoulders are visible. Their expression is neutral or slightly concerned, and their eyes are clearly visible. The background is a plain, light gray-beige wall, and a decorative chandelier is visible hanging from the ceiling, casting a slight shadow. The rightmost panel is another, smaller map, in a similar style to the left pane. It's also of a geographic location, displaying areas of vegetation indicated by various shades of green and light tan. There is also a very small, indistinct figure, possibly an icon, on the lower right. Overall, the image seems to be from a screen capturing device showing concurrent map applications and a video conference or screen sharing session.</span></figcaption></figure><h2 id="app-store"><a href="https://pad.luckow.org/ajnckTeAS8e86LucUK6v5w?both#App-store"></a>App store</h2><p>There’s a lot of work to be done after the initial packaging to bring the app to the app store, but that’s a story for another day.</p><h2 id="cloudron">Cloudron</h2><p><a href="https://www.cloudron.io/get.html?mtm_campaign=get&amp;mtm_kwd=blog&amp;ref=blog.cloudron.io" rel="noopener">https://www.cloudron.io/get.html</a><br><a href="https://forum.cloudron.io/category/4/support" rel="noopener">https://forum.cloudron.io/category/4/support</a></p><p></p>
]]></content:encoded></item><item><title>Cloudron 8.1 released</title><link>https://blog.cloudron.io/cloudron-8-1-released/</link><guid>https://blog.cloudron.io/cloudron-8-1-released/</guid><pubDate>Mon, 09 Dec 2024 08:36:48 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 8.1!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;p&gt;Cloudron 8.1 includes support for Hetzner Object Storage, Gandi PAT and OpenID Groups. It also fixes regressions in &lt;a href="/cloudron-8-0-released/" rel="noreferrer"&gt;Cloudron 8&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 8.1!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><p>Cloudron 8.1 includes support for Hetzner Object Storage, Gandi PAT and OpenID Groups. It also fixes regressions in <a href="/cloudron-8-0-released/" rel="noreferrer">Cloudron 8</a>.</p><h2 id="hetzner-object-storage">Hetzner Object Storage</h2><p>Hetzner recently released their <a href="https://docs.hetzner.com/storage/object-storage/" rel="noreferrer">S3-Compatible Object Storage</a> . In the Cloudron dashboard, you can choose Hetzner Object Storage as the destination for your backups.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image.png" class="kg-image" alt="" loading="lazy" width="594" height="519"></figure><h2 id="gandi-pat">Gandi PAT</h2><p>Gandi has obsoleted the old API Keys and introduced <a href="https://docs.gandi.net/en/managing_an_organization/organizations/personal_access_token.html" rel="noreferrer">Personal Access Tokens</a>. Users hosting their domains in Gandi.net are encouraged to move to this new scheme at the earliest. Simple choose the token type as <code>Personal Access Token (PAT)</code> in the Domains view.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/12/image-1.png" class="kg-image" alt="" loading="lazy" width="594" height="497"></figure><h2 id="openid-groups">OpenID Groups</h2><p>We have added <code>groups</code> claim in OIDC to convey group membership information for a user. In addition, refresh token support has also been enabled.</p><h2 id="other-notable-changes">Other Notable Changes</h2><ul><li>node.js was updated to 20.18.0</li><li>dashboard: various mobile and dark mode fixes</li><li>private registry: add <code>cloudron</code> as a provider</li><li>porkbun: API endpoint changed to <code>https://api.porkbun.com</code></li><li>filemanager: fixed many regressions including broken file upload</li><li>log viewer: handle multi-line messages</li></ul><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-7-6"><a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-8-2" rel="noreferrer">coming in our next release - 8.2</a></a>.</p><h2 id="install-or-update-cloudron">Install or update Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>To update an existing installation, simply click on the 'Update now' button on your dashboard.</p>
]]></content:encoded></item><item><title>Cloudron 8 Released</title><link>https://blog.cloudron.io/cloudron-8-0-released/</link><guid>https://blog.cloudron.io/cloudron-8-0-released/</guid><pubDate>Thu, 22 Aug 2024 12:05:10 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 8!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;p&gt;Cloudron 8.0 has many new features including support for Ubuntu 24.04 LTS (Noble Numbat), IPv6 only servers, Dashboard List view, Login Page background, deSEC integration, File manager dark mode, Admin Notes, Admin Checklists &amp;amp; lots of bug fixes.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 8!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><p>Cloudron 8.0 has many new features including support for Ubuntu 24.04 LTS (Noble Numbat), IPv6 only servers, Dashboard List view, Login Page background, deSEC integration, File manager dark mode, Admin Notes, Admin Checklists &amp; lots of bug fixes.</p><h2 id="ubuntu-2404-lts">Ubuntu 24.04 LTS</h2><p>Canonical recently <a href="https://canonical.com/blog/canonical-releases-ubuntu-24-04-noble-numbat" rel="noreferrer">released</a> it's new Ubuntu LTS 24.04 LTS Noble Numbat . Cloudron 8 supports Ubuntu 24.04 and it is also the recommended Ubuntu version for new installations. Note that we will continue to support Ubuntu 20.04 and Ubuntu 22.04 for the foreseeable future.</p><p>Users on older Ubuntu versions can upgrade to Ubuntu 24.04 by <a href="https://docs.cloudron.io/guides/upgrade-ubuntu-24/" rel="noreferrer">following our guide</a>.</p><h2 id="ipv6-only-servers">IPv6 Only Servers</h2><p>Recently, there has been a change that Cloud Providers like <a href="https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/" rel="noreferrer">AWS</a>, <a href="https://docs.hetzner.com/general/others/ipv4-pricing/" rel="noreferrer">Hetzner</a> have started to charge for IPv4 addresses. Cloudron 7.1 <a href="/cloudron-7-1-released/" rel="noreferrer">added</a> IPv6 support but still required an IPv4. Now with Cloudron 8, we support servers which do not have any IPv4.</p><p>We have tested IPv6 only server setups on AWS, Hetzner, Upcloud &amp; Vultr and they work great! As a heads up, IPv6 is a totally separate network protocol from IPv4. As such, if you want to host public facing websites and apps, you should still use servers with IPv4.</p><h2 id="dashboard-enhancements">Dashboard Enhancements</h2><p>Apps can be viewed as a List in the Cloudron Dashboard .</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image.png" class="kg-image" alt="" loading="lazy" width="2000" height="1099"></figure><h2 id="api-docs">API Docs</h2><p>Cloudron API is now stable and fully <a href="https://docs.cloudron.io/api.html" rel="noreferrer">documented</a> .</p><h2 id="reworked-filter-ui">Reworked Filter UI</h2><p>The filter UI has been reworked.</p><p>Use <code>/</code> as shortcut to quickly start searching for a specific app.</p><p>The filter options are now shown inline and sticky instead of the transient popup in previous releases. You can also filter by tag(s).</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="705"></figure><h2 id="login-page-background">Login Page Background</h2><p>The background image for the login pages can be set in the <code>Branding</code> view.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-2.png" class="kg-image" alt="" loading="lazy" width="1043" height="729"></figure><h2 id="file-manager-dark-mode">File Manager Dark Mode</h2><p>File Manager now has a dark mode!</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-3.png" class="kg-image" alt="" loading="lazy" width="2000" height="617"></figure><h2 id="desec-integration">deSEC Integration</h2><p> <a href="https://desec.io/" rel="noreferrer">deSEC</a> is a free DNS hosting service, designed with security in mind. Running on open-source software and supported by SSE, deSEC is free for everyone to use.</p><p>To use the deSEC integration, move your domain over to deSEC and then choose deSEC provider in the dropdown in the Domains view.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-4.png" class="kg-image" alt="" loading="lazy" width="590" height="422"></figure><h2 id="app-notes">App Notes</h2><p>App specific notes can be saved in markdown format. Notes are shared by admins. All Admins and App Operators can view and edit them.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-5.png" class="kg-image" alt="" loading="lazy" width="830" height="487"></figure><h2 id="admin-checklist">Admin Checklist</h2><p>Cloudron's manifest has been extended to have a <a href="https://docs.cloudron.io/packaging/manifest/#checklist" rel="noreferrer">checklist property</a>. The <code>checklist</code> is a list of items to be completed post installation. The items can be individually tracked - completed or not, by whom and when. Examples include changing the default admin credentials, reviewing registration settings, etc.</p><p>Checklist appears in the <code>Info</code> section of the app.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-6.png" class="kg-image" alt="" loading="lazy" width="837" height="314"></figure><p>When a Checklist item is marked as done, the username and date of completion is tracked for audit purposes.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-7.png" class="kg-image" alt="" loading="lazy" width="837" height="314"></figure><h2 id="openid-everywhere">OpenID everywhere</h2><p>We have adjusted the app packages of over 60 apps to use Cloudron OpenID Connect. Because the authentication flow goes via the Cloudron Auth Endpoint, we can enforce 2FA, enforce rate limits and various security measures which were impossible with the previous LDAP integration.</p><p>Apps that use the <a href="https://docs.cloudron.io/packaging/addons/#proxyauth" rel="noreferrer"><code>proxyAuth</code></a> addon will also now use OIDC automatically.</p><h2 id="troubleshooting-tool">Troubleshooting tool</h2><p>Dashboard down? Instead of reaching out to support as the first step, we have implemented all our troubleshooting techniques in the <code>cloudron-support</code> tool. Simply run <code>cloudron-support --troubleshoot</code> on the server, and you will get a good idea of what has gone wrong. See the <a href="https://docs.cloudron.io/troubleshooting/" rel="noreferrer">troubleshooting docs</a> for more information.</p><h2 id="app-resources">App Resources</h2><p>We have reworked the memory and CPU allocation mechanism for apps.</p><p>The memory limit that you set in the <code>Resources</code> view translates the Max RAM the app can use. Apps get unlimited swap.</p><p>The previous CPU shares functionality is now CPU limit. With this, you can restrict how much max CPU an app can use.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/08/image-8.png" class="kg-image" alt="" loading="lazy" width="837" height="421"></figure><h2 id="system-resolver">System Resolver</h2><p>Prior to Cloudron 8, we use <code>unbound</code> as the system wide DNS resolver. Unfortunately, bugs in <code>unbound</code> and various network restrictions has generated much networking related issues.</p><p>To remedy this, we have drastically cut down the role of <code>unbound</code> . Cloudron 8 uses whatever was the server's default system resolver at installation time (usually <code>systemd-resolved</code>). <code>unbound</code> is still used for various recursive DNS queries like propagation and RBL checks.</p><h2 id="non-avx-servers">Non-AVX Servers</h2><p>We removed support for servers without AVX support in Cloudron 7.5. Turns out low-power systems like the ZimaBoard, but also Netcup servers and various other providers still have servers without AVX.</p><p>With Cloudron 8, support for servers without AVX is back! Unfortunately, MongoDB 5 and above <a href="https://www.mongodb.com/docs/manual/administration/production-notes/" rel="noreferrer">still requires</a> AVX. To handle this, when Cloudron is installed on servers without AVX, MongoDB is disabled. As a result, you won't be able to install various apps like Rocket.Chat, Meemo, NodeBB &amp; Wekan.</p><h2 id="hetzner-storage-box">Hetzner Storage Box</h2><p>Many users use <a href="https://docs.hetzner.com/robot/storage-box/" rel="noreferrer">Hetzner Storage Box</a> for storing very large backups. We looked into optimizing backup speed for this specific case.</p><p>For SSHFS mounted Storage Box, we have implemented server side copying. Server side copying allows us to implement hard links correctly and remote copying is 1000x faster. For this reason, we recommend <a href="https://docs.hetzner.com/robot/storage-box/backup-space-ssh-keys/" rel="noreferrer">configuring</a> your Storage Box to use SSHFS.</p><h2 id="other-notable-changes">Other Notable Changes</h2><ul><li>Backups: a long standing issue that backups used to get stuck at zero Mbps is now fixed.</li><li>Dashboard: font and color improvements</li><li>notfound page: better message when navigating by IP address</li><li>CIFS: enable seal encryption by default</li><li>NFS: disable rpcbind service. we only support nfsv4 mounting</li><li>OVH Storage: Fix location URLs and add RBX region</li><li>AMI: <a href="https://aws.amazon.com/about-aws/whats-new/2022/10/amazon-machine-images-support-instance-metadata-service-version-2-default/" rel="noreferrer">IMDv2</a> support</li><li>Mailer: add html version of test mail</li><li>Backups: fix issue with s3 backend where files missing in remote was not detected correctly</li><li>Backup cleaner: do not remove the backup in progress</li></ul><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-7-6"><a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-8-1" rel="noreferrer">coming in our next release - 8.1</a></a>.</p><h2 id="install-or-update-cloudron">Install or update Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>To update an existing installation, simply click on the 'Update now' button on your dashboard.</p>
]]></content:encoded></item><item><title>Cloudron 7.7 released</title><link>https://blog.cloudron.io/cloudron-7-7-released/</link><guid>https://blog.cloudron.io/cloudron-7-7-released/</guid><pubDate>Fri, 12 Apr 2024 12:22:02 GMT</pubDate><dc:creator>Girish Ramakrishnan</dc:creator><description>&lt;p&gt;We are happy to announce the release of Cloudron 7.7!&lt;/p&gt;&lt;p&gt;For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.&lt;/p&gt;&lt;p&gt;Cloudron 7.7 has many new features including Port Range support, Docker improvements, OIDC Avatar Support, MongoDB 6, User Language Persistence, Cancelable uploads &amp;amp; lots of bug fixes.&lt;/p&gt;</description><content:encoded><![CDATA[<p>We are happy to announce the release of Cloudron 7.7!</p><p>For those unaware, Cloudron is a platform that makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server and keep them up-to-date and secure.</p><p>Cloudron 7.7 has many new features including Port Range support, Docker improvements, OIDC Avatar Support, MongoDB 6, User Language Persistence, Cancelable uploads &amp; lots of bug fixes.</p><h2 id="port-range">Port Range</h2><p>Cloudron already provides a way for apps to expose TCP and UDP ports. From 7.7, an app can expose a port range using the optional <code>portCount</code> field in the <a href="https://docs.cloudron.io/packaging/manifest/#tcpports" rel="noreferrer">manifest</a>. This feature is required for various apps like <a href="https://www.azuracast.com/" rel="noreferrer">AzuraCast</a> and <a href="https://github.com/miroslavpejic85/mirotalk" rel="noreferrer">MiroTalk</a>.</p><p>We have published <a href="https://www.cloudron.io/store/com.mirotalksfu.cloudronapp.html" rel="noreferrer">MiroTalk SFU</a>, a Fast Real-Time Video Conference platform that uses an <a href="https://mediasoup.org/documentation/overview/" rel="noreferrer">SFU</a>, that uses this feature.</p><figure class="kg-card kg-image-card"><img src="https://screenshots.cloudron.io/com.mirotalksfu.cloudronapp/mirotalksfu_00.png" class="kg-image" alt="https://screenshots.cloudron.io/com.mirotalksfu.cloudronapp/mirotalksfu_00.png" loading="lazy" width="1414" height="811"></figure><h2 id="docker-improvements">Docker Improvements</h2><p> The docker daemon starts a userland proxy service for port forwarding whenever a port is exposed. This proxy consumes a lot of CPU resources since it is created per exposed port. In 7.7, we have disabled the userland proxy in docker.</p><p>Apps can now also specify an <a href="https://docs.cloudron.io/packaging/manifest/#logpaths" rel="noreferrer">array of log files</a> instead of stdout/stderr using the <code>logPaths</code> field in the manifest.</p><p>Container logging now uses Unix Domain Sockets instead of UDP. This frees up UDP ports for apps.</p><h2 id="oidc-avatar-support">OIDC Avatar Support</h2><p>For apps that support it, Cloudron OIDC now exposes user avatars via the <a href="https://openid.net/specs/openid-connect-basic-1_0.html" rel="noreferrer"><code>picture</code> claim</a>.</p><h2 id="mongodb-6">MongoDB 6</h2><p>MongoDB has been upgraded to <a href="https://www.mongodb.com/docs/manual/release-notes/6.0/" rel="noreferrer">6.0</a>. Apps can now use <a href="https://www.mongodb.com/blog/post/big-reasons-upgrade-mongodb-6-0" rel="noreferrer">several new features</a> of MongoDB including improved support for Time Series Data, more operators and enriched queries.</p><h2 id="cancelable-uploads">Cancelable Uploads</h2><p>File uploads can be canceled midway in the File manager.</p><figure class="kg-card kg-image-card"><img src="/content/images/2024/04/image-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="1059"></figure><h2 id="user-language">User Language</h2><ul><li>Users can select their <a href="https://docs.cloudron.io/profile/#language" rel="noreferrer">Language</a> preference in the profile view. This setting is now persisted across browsers and devices. Note that the login screen still follows the <a href="https://docs.cloudron.io/settings/#language" rel="noreferrer">global language setting</a> chosen by the admin.</li></ul><figure class="kg-card kg-image-card"><img src="https://docs.cloudron.io/img/profile-language.png" class="kg-image" alt="" loading="lazy" width="783" height="335"></figure><h2 id="other-notable-changes">Other Notable Changes</h2><ul><li>backupcleaner: fix bug where preserved backups were removed incorrectly</li><li>oidc/ldap: fix display name parsing to send anything after first name as the last name</li><li>email: use secp256r1 curve certificates to improve deliverability</li><li>dashboard: use native slider element for app memory and CPU</li><li>dashboard: preserve app link paths</li><li>backups: deleted apps must also be displayed in contents</li><li>Postgres: add <a href="https://github.com/tensorchord/pgvecto.rs" rel="noreferrer">vecto.rs</a> extension support for immich</li></ul><h2 id="whats-coming-next">What's coming next</h2><p>Head over to our forum to learn more about What's <a href="https://forum.cloudron.io/topic/9975/what-s-coming-in-7-6"><a href="https://forum.cloudron.io/topic/11531/what-s-coming-in-8-0" rel="noreferrer">coming in our next release - 8.0</a></a>.</p><h2 id="install-or-update-cloudron">Install or update Cloudron</h2><p>New to Cloudron? Get started for free by running with 3 simple commands on your server.</p><p>To update an existing installation, simply click on the 'Update now' button on your dashboard.</p>
]]></content:encoded></item></channel></rss>