## Actors - Developers The group working on this repository. We are creating the deployment workflows and service configurations. - Hosting provider They provide and maintain the physical infrastructure, and run the software in this repository, through which operators interact with their deployments. Hosting providers are technical administrators for these deployments, ensuring availability and appropriate performance. We target small- to medium-scale hosting providers with 20+ physical machines. - Operator They select the applications they want to run. They don't need to own hardware or deal with operations. Operators administer their applications in a non-technical fashion, e.g. as moderators. They pay the hosting provider for registering a domain name, maintaining physical resources, and monitoring deployments. - User They are individuals using applications run by the operators, and e.g. post content. ## Glossary - [Fediverse](https://en.wikipedia.org/wiki/Fediverse) A collection of social networking applications that can communicate with each other using a common protocol. - Application User-facing software (e.g. from Fediverse) run by the hosting provider for an operator. - Configuration A collection of settings for a machine running NixOS. > Example: Configurations are deployed to VMs. - Provision Make a resource, such as a virtual machine, available for use. - Deploy Put software, such as applications, onto computers. The software includes technical configuration that links software components. In our context, this a Configuration deployed to a runtime environment. Most user-facing configuration remains untouched by the deployment process. - Migrate Move service configurations and deployment (including user data) from one hosting provider to another. - Resource A [resource for NixOps4](https://nixops.dev/manual/development/concept/resource.html) is any external entity that can be declared with NixOps4 expressions and manipulated with NixOps4, such as a virtual machine, an active NixOS configuration, a DNS entry, or customer database. - Resource provider A resource provider for NixOps4 is an executable that communicates between a resource and NixOps4 using a standardised protocol, allowing [CRUD operations](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) on the resources to be performed by NixOps4. Refer to the [NixOps4 manual](https://nixops.dev/manual/development/resource-provider/index.html) for details. > Example: We need a resource provider for obtaining deployment secrets from a database. - Runtime backend A type of digital environment one can run operating systems such as NixOS on, e.g. bare-metal, a hypervisor, or a container runtime. - Runtime environment The thing a deployment runs on, an interface against which the deployment is working. See runtime backend. - Runtime config Configuration logic specific to a runtime backend, e.g. how to deploy, how to access object storage. ## Technologies used ### [NixOS](https://nixos.org/) NixOS is a Linux distribution with a [vibrant](https://repology.org/repositories/graphs), [reproducible](https://reproducible.nixos.org/) and [security-conscious](https://tracker.security.nixos.org/) ecosystem. As such, we see NixOS as the only viable way to reliably create a reproducible outcome for all the work we create. Considered alternatives include: - containers: do not by themselves offer the needed reproducibility #### [npins](https://github.com/andir/npins) Npins is a dependency pinning tool for Nix which leaves recursive dependencies explicit, keeping the consumer in control. Considered alternatives include: - Flakes: defaults to implicitly following recursive dependencies, leaving control with the publisher. ### [SelfHostBlocks](https://nlnet.nl/project/SelfHostBlocks/) SelfHostBlocks offers Nix module contracts to decouple applications from service providers, empowering user choice by providing sane defaults yet a [unified interface](https://nlnet.nl/project/SelfHostBlocks/). Considered alternatives include: - nixpkgs-provided NixOS service modules: support far more applications, but tightly coupled with service providers, whereas we expect them to [sooner or later](https://discourse.nixos.org/t/pre-rfc-decouple-services-using-structured-typing/58257) follow suit. - NixOS service modules curated from scratch: would support any setup imaginable, but does not seem to align as well with our research-oriented goals. ### [OpenTofu](https://opentofu.org/) OpenTofu is the leading open-source framework for infrastructure-as-code. This has led it to offer a vibrant ecosystem of 'provider' plugins integrating various programs and services. As such, it can facilitate automated deployment pipelines, including with — relevant to our project — hypervisors and DNS programs. Considered alternatives include: - Terraform: not open-source ### [Proxmox](https://proxmox.com/) Proxmox is a hypervisor, allowing us to create VMs for our applications while adhering to our goal of preventing lock-in. In addition, it has been [packaged for Nix](https://github.com/SaumonNet/proxmox-nixos) as well, simplifying our requirements to users setting up our software. Considered alternatives include: - OpenNebula: seemed less mature ### [Garage](https://garagehq.deuxfleurs.fr/) Garage is a distributed object storage service. For compatibility with existing clients, it reuses the protocol of Amazon S3. Considered alternatives include: - file storage: less centralized for backups ### [PostgreSQL](https://www.postgresql.org/) PostgreSQL is a relational database. It is used by most of our applications. Considered alternatives include: - Sqlite: default option for development in many applications, but less optimized for performance, and less centralized for backups ### [Valkey](https://valkey.io/) Valkey is a key-value store. It is an open-source fork of Redis. Considered alternatives include: - Redis: not open-source ### [OpenSearch](https://opensearch.org/) OpenSearch offers full-text search, and is used for this in many applications. It is an open-source fork of ElasticSearch. Considered alternatives include: - ElasticSearch: not open-source ### [PowerDNS](https://github.com/PowerDNS/pdns) PowerDNS is a mature DNS server. It further offers an admin front-end. Considered alternatives include: - hickory-dns: no front-end - core-dns: no front-end ### [Authelia](https://github.com/authelia/authelia) Authelia is a single sign-on provider that integrates with LDAP. Considered alternatives include: - KaniDM: does not do proper LDAP - Authentik: larger package with focus on many things we do not need - Keycloak: larger package with focus on many things we do not need ### [lldap](https://github.com/lldap/lldap) Lldap is a light LDAP server, allowing to centralize user roles across applications. Considered alternatives include: - 389 DS: older larger package - FreeIPA: wrapper around 389 DS ## Architecture At the core of Fediversity lies a NixOS configuration template containing selected applications. We support using this with different run-time environments, with targets deemed in scope including NixOS itself and hypervisor ProxmoX. Depending on the targeted run-time environment, deployment will further involve orchestrator OpenTofu. We further provide a [reference front-end](https://git.fediversity.eu/Fediversity/Fediversity/src/branch/main/panel) to configure our template. To ensure reproducibility, we also offer Nix packaging for our software. To reach our goals, we aim to implement the following interactions between [actors](#actors) (depicted with rounded corners) and system components (see the [glossary](#glossary), depicted with rectangles).  ### Entity relationships Relationships among the entities used to model migrations are as follows, using the crow's foot notation to denote cardinality:  ### Data model ### Host architecture Whereas the core abstraction in Fediversity is a NixOS configuration template, a more full-fledged example architecture of the web host use-case we aim to support as part of our exploitation would be as follows, where VMs in question run Fediversity to offer our selected applications:  ## Break-down of project milestones Whereas details of the implementation may need to be decided as the technical challenges involved become clear, we can already give a higher-level planning of relevant milestones and some of their salient features: 1. [Implement a way to run online services emphasising user autonomy and portability](https://git.fediversity.eu/Fediversity/Fediversity/issues/347) - [application data back-ups](https://git.fediversity.eu/Fediversity/Fediversity/issues/123) - [deploying Fediversity applications](https://git.fediversity.eu/Fediversity/Fediversity/issues/99) - [migrating application data between hosting providers](https://git.fediversity.eu/Fediversity/Fediversity/issues/100) 1. [Disseminate our results by engaging the open-source community to further expand on work in this direction](https://git.fediversity.eu/Fediversity/Fediversity/issues/348) - [automated dev-ops workflows](https://git.fediversity.eu/Fediversity/Fediversity/issues/224): - [separate test environments for staging vs. production](https://git.fediversity.eu/Fediversity/Fediversity/issues/69) - [continuous deployment](https://git.fediversity.eu/Fediversity/Fediversity/issues/177) - [CI rejects failing deployments](https://git.fediversity.eu/Fediversity/Fediversity/issues/102) - [Nix package overlays upstreamed](https://git.fediversity.eu/Fediversity/Fediversity/issues/248) - [facilitate suggestions in PR reviews](https://git.fediversity.eu/Fediversity/Fediversity/issues/302) - [integration test](https://git.fediversity.eu/Fediversity/Fediversity/issues/277) - [external developers empowered to contribute](https://git.fediversity.eu/Fediversity/Fediversity/issues/288): - [NixOS configuration as the core abstraction](https://git.fediversity.eu/Fediversity/Fediversity/issues/339) - [integration tests](https://git.fediversity.eu/Fediversity/Fediversity/issues/277) - [Continuous Integration builds available in a public cache](https://git.fediversity.eu/Fediversity/Fediversity/issues/92) - [reproducible project infrastructure](https://git.fediversity.eu/Fediversity/Fediversity/issues/336) - [continuous deployment](https://git.fediversity.eu/Fediversity/Fediversity/issues/177) - [separate staging/testing environments](https://git.fediversity.eu/Fediversity/Fediversity/issues/69) - [code reviewers can suggest changes](https://git.fediversity.eu/Fediversity/Fediversity/issues/302) - [knowledge base](https://git.fediversity.eu/Fediversity/Fediversity/issues/288) - [module upstreamed to nixpkgs](https://git.fediversity.eu/Fediversity/Fediversity/issues/333) 1. [Exploit our work by facilitating the sample use-case of web hosting organisations using an initial set of services](https://git.fediversity.eu/Fediversity/Fediversity/issues/349) - [Initial internal user to kick-start feedback process](https://git.fediversity.eu/Fediversity/Fediversity/issues/225): - automated provisioning of: - [databases](https://git.fediversity.eu/Fediversity/Fediversity/issues/115) - [object storage](https://git.fediversity.eu/Fediversity/Fediversity/issues/185) - [virtual machines](https://git.fediversity.eu/Fediversity/Fediversity/issues/116) - [DNS](https://git.fediversity.eu/Fediversity/Fediversity/issues/110) - [admin accounts](https://git.fediversity.eu/Fediversity/Fediversity/issues/178) - [SMTP service](https://git.fediversity.eu/Fediversity/Fediversity/issues/117) - [email accounts](https://git.fediversity.eu/Fediversity/Fediversity/issues/118) - [ephemeral state](https://git.fediversity.eu/Fediversity/Fediversity/issues/314) - [specification published](https://git.fediversity.eu/Fediversity/Fediversity/issues/334) - [ProxmoX back-end supports multiple users](https://git.fediversity.eu/Fediversity/Fediversity/issues/313) - [user can have multiple deployments](https://git.fediversity.eu/Fediversity/Fediversity/issues/241) - [users can update their deployment configurations](https://git.fediversity.eu/Fediversity/Fediversity/issues/158) - [Software ready for web hosts to take into production](https://git.fediversity.eu/Fediversity/Fediversity/issues/228): - [garbage collection of unallocated resources](https://git.fediversity.eu/Fediversity/Fediversity/issues/188) - [Nix-less bootstrap](https://git.fediversity.eu/Fediversity/Fediversity/issues/332) - [ensure hosts may update users' deployments](https://git.fediversity.eu/Fediversity/Fediversity/issues/159) - [reference front-end decoupled from template version](https://git.fediversity.eu/Fediversity/Fediversity/issues/304) - [security audit](https://git.fediversity.eu/Fediversity/Fediversity/issues/291) - [Key features improving user experience supported](https://git.fediversity.eu/Fediversity/Fediversity/issues/289): - [enqueuing deployment syncs](https://git.fediversity.eu/Fediversity/Fediversity/issues/242) - [provide single sign-on](https://git.fediversity.eu/Fediversity/Fediversity/issues/212) - [upstream configuration options exposed](https://git.fediversity.eu/Fediversity/Fediversity/issues/195) - [allow disabling application while retaining data](https://git.fediversity.eu/Fediversity/Fediversity/issues/186) - [ProxmoX deployment allows scaling resources assigned to a VM](https://git.fediversity.eu/Fediversity/Fediversity/issues/119) - [aid needed user actions on schema update](https://git.fediversity.eu/Fediversity/Fediversity/issues/214) - [completed initial application offering](https://git.fediversity.eu/Fediversity/Fediversity/issues/350) - [pooling application instances to shared VMs](https://git.fediversity.eu/Fediversity/Fediversity/issues/322) - [allow use of external single sign-on](https://git.fediversity.eu/Fediversity/Fediversity/issues/161) - [on migration, allow reconfiguring monolithic vs distributed](https://git.fediversity.eu/Fediversity/Fediversity/issues/341)