<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Nassella]]></title><description><![CDATA[Self-hosting for everyone!]]></description><link>https://www.nassella.org/</link><image><url>https://www.nassella.org/favicon.png</url><title>Nassella</title><link>https://www.nassella.org/</link></image><generator>Ghost 5.2</generator><lastBuildDate>Sun, 10 May 2026 13:15:21 GMT</lastBuildDate><atom:link href="https://www.nassella.org/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Technical Architecture]]></title><description><![CDATA[<p>Nassella is made up of three major components: a multi-tenant web app, control plane instances, and immutable instances that host the end-user applications. </p><p>Applications that are deployed with Nassella live on an immutable instance. So if you deploy NextCloud to cloud.example.org then users that visit cloud.example.org</p>]]></description><link>https://www.nassella.org/technical-architecture/</link><guid isPermaLink="false">69f397cff40c1f016177de94</guid><dc:creator><![CDATA[Thomas Hintz]]></dc:creator><pubDate>Thu, 30 Apr 2026 19:11:09 GMT</pubDate><media:content url="https://www.nassella.org/content/images/2026/04/Nassella-arch.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.nassella.org/content/images/2026/04/Nassella-arch.jpg" alt="Technical Architecture"><p>Nassella is made up of three major components: a multi-tenant web app, control plane instances, and immutable instances that host the end-user applications. </p><p>Applications that are deployed with Nassella live on an immutable instance. So if you deploy NextCloud to cloud.example.org then users that visit cloud.example.org will be talking to the the &quot;immutable instance&quot; that runs your instance of the NextCloud application.</p><p>To modify or update an immutable instance, a control plane instance is used. This can be your laptop or any other computer. The control plane instance will build a new image for deployment&#x2013;based on a config&#x2013;and then it will carry out the deployment of the immutable instance by deploying the new image to a new instance, re-mapping the application data to the new instance, updating DNS to point to the new instance (or using a dynamic DNS config), and then destroying the old instance. After deployment, users visiting cloud.example.org would then be getting served by the newly deployed immutable instance.</p><p>The multi-tenant web app stores configuration data for all Nassella deployments as well as runs one or more control planes, as needed. It also provides a web-based user interface for configuring and managing immutable instances and the running of the control plane. The multi-tenant web app is an optional layer.</p><h2 id="immutable-instance">Immutable Instance</h2><p>The immutable instance, that actually hosts an end-user&apos;s web applications, is made up of: the Flatcar Linux distribution, docker compose, and systemd services. Additional block storage is attached to provide mutable application storage.</p><p>Flatcar Linux is a Linux distro built for running docker containers. It is an immutable OS that self-updates on a two week schedule.</p><p>The control plane generates a docker compose config that contains everything needed to run the user&apos;s applications on the immutable instance. When the instance boots up, it runs a systemd service that calls &quot;docker compose up&quot;&#x2013; bringing up all of the user&apos;s applications.</p><p>There is also an additional systemd service that runs once per day and triggers a Restic backup snapshot to be taken and uploaded to the configured Backblaze B2 bucket.</p><p>The additional block storage that is attached to the instance is configured to be the place that all mutable application data is stored on. When an instance is being updated or moved, the block storage is detached from the old instance and attached to the new instance, unless the instance is moving to a different datacenter or service. If the block storage cannot be just detached and reattached, then the immutable instance will fetch the latest backup snapshot and restore it to a newly created block storage on initial boot.</p><h2 id="control-plane-instance">Control Plane Instance</h2><p>The control plane instance is simply a Makefile with a set of shell scripts along with a config file and Terraform.</p><p>Whenever an update or modification to an immutable instance is needed, the config is first updated on the control plane (a text file: config/apps.config). Then &quot;make apply&quot; is executed on the control plane. &quot;make apply&quot; builds a new &quot;ignition&quot; file and a new Terraform variable file. The ignition file is a read-only file that Flatcar Linux reads the first time it boots; essentially the control plane is building a read-only &quot;image&quot; to deploy for the &quot;immutable instance&quot;. (Technically it only creates the config file that is loaded by a generic Flatcar Linux instance, but effectively is created an &quot;immutable&quot; image, due to the nature of Flatcar.) The ignition file contains the docker compose configuration as well as the Flatcar Linux setup, like for storage and system services.</p><p>After building the ignition file, the Makefile ensures that the Restic repository (for later storing backup snapshots) is initialized.</p><p>Then the Makefile executes &quot;terraform apply&quot;. Terraform uses the previously generated variable file along with a static Terraform configuration, to actually carry out the deployment of the immutable instance. This means both creating/destroying VPS servers and correctly creating and configuring DNS records. &quot;make apply&quot; in this context is thus idempotent. Terraform will detect the current infrastructure setup and make any changes needed to bring it inline with the configuration. For example, if only the domain name is changed for an application running on the immutable instance, Terraform will only update the corresponding DNS record. If however, the immutable instance image changes then Terraform will destroy the old immutable instance and bring up a new one with the new image.</p><p>The control plane instance can be used to manage one immutable instance. It is command-line and config file based. Although multiple control planes can be managed on one system, like the web app does. The control plane is designed to be completely indepenent from the web app.</p><h2 id="multi-tenant-web-app">Multi-tenant Web App</h2><p>The multi-tenant web app consists of a CHICKEN Scheme-based web application, a Postgresql database, and an Authelia instance combined with openldap for storing and authenticating users.</p><p>The web app is used to make it more user friendly to configure and manage an immutable instance. It provides: a user interface for configuring immutable instances and its applications; it automates the deployment of an immutable instance; it provides a user interface for creating, viewing, and restoring backup snapshots; and it stores all of the required configuration and terraform state files. The web app can run multiple control plane instances at once to facilitate deploying and managing multiple immutable instances at the same time. Essentially, the web app is a user friendly way to manage immutable instances, but it is not required.</p><h2 id="immutable-instance-details">Immutable Instance Details</h2><p>The immutable instance itself is primarily centered around running docker containers specified in a set of docker compose config files (that the control plane generates). The docker compose config files are all combined by a systemd service called &quot;app&quot; that then runs all of the user&apos;s selected applications by calling &quot;docker compose up&quot;.</p><p>The docker configuration is such that all application configuration is read-only and immutable once deployed and it is stored on the root Flatcar filesystem that will get destroyed every time an instance is updated or changed by the control plane. Any data that an application needs to be writable is specified as its own volume in the docker compose config and mapped to the attached block storage that always gets maintained and moved to updated instances. This ensures that all configuration is &quot;data&quot; and there can be no configuration &quot;drift&quot; but all user data is always kept.</p><p>The docker configuration also creates separate docker networks for each application. So if an application has a web app that needs a database, the database and web app will be on their own network. There is also a Caddy load balancer that has a separate network. Only parts of an application that needs to be exposed to the internet is added to the load balancer&apos;s network. Only the the load balancer is accessible from the internet.</p><p>There is an additional systemd service that runs once a day that creates and remotely stores a snapshot of all the user data stored on the attached block storage. Before creating the snapshot, all applications that write data to the attached block storage are shut down and web apps will return a &quot;maintenance mode&quot; page to users. After the snapshot is complete all services are brought back online. This ensures the snapshot can cleanly capture all of the application data.</p><p>The immutable instance has no login method, not even via SSH.</p>]]></content:encoded></item><item><title><![CDATA[Status Update, Nearly there!]]></title><description><![CDATA[<p>I&apos;ve been able to work on Nassella again recently and it is nearly ready for an initial public release! It will be more of a &quot;beta&quot; release but that is still exciting!</p><p>I have completed most things that were listed as &quot;to do&quot; on</p>]]></description><link>https://www.nassella.org/status-update-nearly-there/</link><guid isPermaLink="false">69d695e9f40c1f016177de5a</guid><dc:creator><![CDATA[Thomas Hintz]]></dc:creator><pubDate>Wed, 08 Apr 2026 18:01:39 GMT</pubDate><media:content url="https://www.nassella.org/content/images/2026/04/20260408_103316.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.nassella.org/content/images/2026/04/20260408_103316.jpg" alt="Status Update, Nearly there!"><p>I&apos;ve been able to work on Nassella again recently and it is nearly ready for an initial public release! It will be more of a &quot;beta&quot; release but that is still exciting!</p><p>I have completed most things that were listed as &quot;to do&quot; on the previous status list update. I also have been able to stress test the system further by actually using itself to deploy itself! It sounds funny, but it has been working very well and allows me to take advantage of all the infrastructure of the project for hosting itself and provides more validation it is all working. I intend for the public release to be hosted on itself.</p><p>I am now cleaning up a bunch of minor things and doing more testing. If you are interested in helping be part of the initial public testing, please let me know!</p><figure class="kg-card kg-image-card"><img src="https://www.nassella.org/content/images/2026/04/Screenshot-2026-04-08-at-10.58.36-AM.png" class="kg-image" alt="Status Update, Nearly there!" loading="lazy" width="1430" height="818" srcset="https://www.nassella.org/content/images/size/w600/2026/04/Screenshot-2026-04-08-at-10.58.36-AM.png 600w, https://www.nassella.org/content/images/size/w1000/2026/04/Screenshot-2026-04-08-at-10.58.36-AM.png 1000w, https://www.nassella.org/content/images/2026/04/Screenshot-2026-04-08-at-10.58.36-AM.png 1430w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Supported Web Apps]]></title><description><![CDATA[<p>Nassella allows you to easily host web apps, but which web apps? The long-term goal is to allow running nearly any web app but, starting out, I have selected a small number to target. They are: <a href="https://nextcloud.com/">NextCloud</a>, <a href="https://wg-easy.github.io/wg-easy/latest/">wg-easy</a>, &#xA0;and <a href="https://ghost.org/">Ghost</a>. (<a href="https://dozzle.dev/">Dozzle</a>, the log viewer web app is also being</p>]]></description><link>https://www.nassella.org/supported-web-apps/</link><guid isPermaLink="false">69876337f40c1f016177ddcd</guid><dc:creator><![CDATA[Thomas Hintz]]></dc:creator><pubDate>Sat, 07 Feb 2026 16:33:07 GMT</pubDate><content:encoded><![CDATA[<p>Nassella allows you to easily host web apps, but which web apps? The long-term goal is to allow running nearly any web app but, starting out, I have selected a small number to target. They are: <a href="https://nextcloud.com/">NextCloud</a>, <a href="https://wg-easy.github.io/wg-easy/latest/">wg-easy</a>, &#xA0;and <a href="https://ghost.org/">Ghost</a>. (<a href="https://dozzle.dev/">Dozzle</a>, the log viewer web app is also being supported, but not available as a generic web app for the end user to use, but for monitoring the apps running on a user&apos;s Nassella instance.)</p><p>Why these apps? Mostly because they are apps I am already hosting and would use them right away; I am familiar with them. I host many other web apps too but selected each of these for different reasons.</p><p>I selected NextCloud because it is complex and also, I believe, can form the basis of other apps that could benefit from the ability to share data. I feel that if Nassella can support NextCloud, it can support most web apps that people would want to run. Also, I would like to use the support of NextCloud to better understand how to create an underlying storage model that will allow apps to share data/resources.</p><p>wg-easy was not on my initial list of first apps to support but I added it early on because it is really simple. It was the first app Nassella got support for. It is also something I want to use for myself but mainly it gets support because of how easy it was to setup and run.</p><p>Ghost was also not on my initial list, but I wanted to use it to host this site! I feel better about the products I build when I can thoroughly test them myself, both from a technical and product perspective so I always try to find ways to do that with any product I work on.</p><h1 id="upcoming">Upcoming</h1><p>Which web apps come after the initial set? I haven&apos;t decided fully yet but they are mostly based on things I want to use or already use. However, if you are looking for something else, please let me know! As long as Nasella can run a few of the web apps that I use, I want to support what others want more than my own ideas. That being said, here is the current list of potential upcoming web apps to support:</p><ul><li><a href="https://matrix.org/">Matrix</a> / <a href="https://element.io/en">Element</a> (chat server &amp; client)</li><li><a href="https://bitwarden.com/">Bitwarden</a> (password store)</li><li><a href="https://immich.app/">Immich</a> (photo &amp; video management)</li><li><a href="https://jellyfin.org/">Jellyfin</a> (media storage &amp; playback system)</li><li><a href="https://about.gitea.com/">Gitea</a> (git source control hosting)</li><li><a href="https://about.gitlab.com/">GitLab</a></li><li><a href="https://cal.com/">Cal.com</a> (scheduling)</li><li><a href="https://jitsi.org/">Jitsi</a> (video conferencing)</li><li><a href="https://stormkit.io/">StormKit</a> (deploy &amp; scale web apps)</li><li><a href="https://www.metabase.com/">Metabase</a> (business intelligence)</li></ul><h1 id="custom-web-apps">Custom Web Apps?</h1><p>Another thing I have been considering, is can Nassella support any arbitrary web app? I think so! I haven&apos;t prototyped it yet, but I think if we could basically define a Docker Compose protocol/template and provide a way for inputting a Docker Compose config for a custom web app, then Nassella could theoretically run nearly anything! </p><p>The main consideration would be nailing down specific details for how an app would store permanent data and how it would specify its networking so it &quot;plugs into&quot; the rest of the Nassella system. It seems doable in my head, and if this is something you would like or have thoughts on, please let me know!</p>]]></content:encoded></item><item><title><![CDATA[Status Update]]></title><description><![CDATA[<p>I have been developing Nassella for nearly six months now! I have had portions of it deployed for four months already! It is not yet ready for production but it is getting closer. I wanted to list out the features it currently has and what I still think it needs</p>]]></description><link>https://www.nassella.org/status-update-january-2026/</link><guid isPermaLink="false">696195f981121800dc11b535</guid><category><![CDATA[News]]></category><category><![CDATA[Status Update]]></category><dc:creator><![CDATA[Thomas Hintz]]></dc:creator><pubDate>Wed, 21 Jan 2026 15:00:00 GMT</pubDate><media:content url="https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-6.56.34-AM-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-6.56.34-AM-1.png" alt="Status Update"><p>I have been developing Nassella for nearly six months now! I have had portions of it deployed for four months already! It is not yet ready for production but it is getting closer. I wanted to list out the features it currently has and what I still think it needs before an initial alpha or beta release.</p><p></p><div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="current-features">Current Features</h2></div><ul><li>Deploying web applications to your own <a href="https://www.digitalocean.com/">DigitalOcean</a> account.</li><li>Instances can be: created, moved, resized, destroyed.</li><li>Instances can be created with any or all of the following web apps: <a href="https://nextcloud.com/">NextCloud</a>, <a href="https://wg-easy.github.io/wg-easy/latest/">wg-easy</a>, and <a href="https://ghost.org/">Ghost</a>. <a href="https://dozzle.dev/">Dozzle</a>, a log viewer and basic app stats application is also always deployed to an instance.</li><li>Automatic DNS configuration via Cloudflare. Once you input a Cloudflare API key with the correct permissions (a guide will be provided on how to do this), the associated instance will automatically be correctly setup with DNS mapped to each selected application.</li><li>Automatic, encrypted, daily backups via <a href="https://restic.net/">Restic</a> and stored on <a href="https://www.backblaze.com/cloud-storage">Backblaze B2</a>.</li><li>Automatic load-balancing between apps and HTTPS setup via <a href="https://caddyserver.com/">Caddy</a>.</li><li>Automatic, self updating, and secure operating system via Flatcar Linux and Docker.</li><li>A web-based wizard to create and manage instances and all instance details.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-6.53.21-AM.png" class="kg-image" alt="Status Update" loading="lazy" width="1424" height="1510" srcset="https://www.nassella.org/content/images/size/w600/2026/01/Screenshot-2026-01-21-at-6.53.21-AM.png 600w, https://www.nassella.org/content/images/size/w1000/2026/01/Screenshot-2026-01-21-at-6.53.21-AM.png 1000w, https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-6.53.21-AM.png 1424w" sizes="(min-width: 720px) 720px"><figcaption>A current view of the instance dashboard</figcaption></figure><div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="missing-features">Missing Features</h2><h3 class="kg-header-card-subheader" id="things-i-think-should-be-done-before-any-public-release-at-least">Things I think should be done before any public release, at least</h3></div><ul><li>User management for the web-based management application that manages instances. It is planned that <a href="https://www.authelia.com/">Authelia</a> will be used and the web app is designed to accept OAuth connections.</li><li>Destroying an instance needs more work to be production ready.</li><li>A web interface needs to be built to actually view and restore backups. Currently viewing backups and restoring from them can only be done manually.</li><li>Ensure Restic is initialized before attempting to take snapshots.</li><li>Re-work the DNS setup so it does not &quot;hijack&quot; the root domain for internal purposes. Currently, the root domain is set to map to the instance and all other records are CNAMEs to it. The root domain should not be used for this.</li><li>When an instance is performing a Restic backup, it should first put the instance into a &quot;maintenance&quot; mode so that it can make clean backups of things like databases.</li><li>Ensuring all components are &quot;production ready&quot;. There are various TODOs in the code that note places where things need to be tidied up before being production ready.</li><li>Documentation and UI improvements. I want this to be easy to use for people that are intimidated by software settings.</li></ul><hr><p>In summary, most of the work for an initial alpha/beta release is done; I would estimate about 90%. I am looking forward to the initial release so others can try it out and hopefully find it useful! And also then I can work on adding support for more web apps and supported services for deploying instances and managing DNS. The underlying system should make it quite easy to add support for expanding the current set of apps and services but work still needs to be done to make it happen.</p><p>The actual deployed instances are generally in good shape and near production ready. A lot of the remaining work is with the web app but the underlying work the web app relies on to actually do things is pretty much ready to go.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-7.02.11-AM.png" class="kg-image" alt="Status Update" loading="lazy" width="1418" height="1746" srcset="https://www.nassella.org/content/images/size/w600/2026/01/Screenshot-2026-01-21-at-7.02.11-AM.png 600w, https://www.nassella.org/content/images/size/w1000/2026/01/Screenshot-2026-01-21-at-7.02.11-AM.png 1000w, https://www.nassella.org/content/images/2026/01/Screenshot-2026-01-21-at-7.02.11-AM.png 1418w" sizes="(min-width: 720px) 720px"><figcaption>Setting up selected apps in the instance wizard.</figcaption></figure>]]></content:encoded></item></channel></rss>