split out architecture document
This commit is contained in:
		
							parent
							
								
									8829022242
								
							
						
					
					
						commit
						4549fcaeef
					
				
					 4 changed files with 243 additions and 230 deletions
				
			
		|  | @ -4,6 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| ```sh | ```sh | ||||||
| nix-shell | nix-shell | ||||||
| pandoc fediversity.md -o fediversity.html | pandoc architecture.md -o architecture.html | ||||||
|  | pandoc architecture.html -o architecture.pdf | ||||||
|  | pandoc --filter pandoc-include fediversity.md -o fediversity.html | ||||||
| pandoc fediversity.html -o fediversity.pdf | pandoc fediversity.html -o fediversity.pdf | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
							
								
								
									
										236
									
								
								architecture.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								architecture.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,236 @@ | ||||||
|  | <style>* {font-family: sans-serif;}</style> | ||||||
|  | 
 | ||||||
|  | ## 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. | ||||||
|  | 
 | ||||||
|  | ## Architecture | ||||||
|  | 
 | ||||||
|  | At the core of Fediversity lies a NixOS configuration template containing selected applications. | ||||||
|  | We use this to deploy to selected run-time environments, so far targeting hypervisor ProxmoX. | ||||||
|  | We further provide a reference front-end 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: | ||||||
|  | 
 | ||||||
|  | - Initial internal user to kick-start feedback process: | ||||||
|  |     - automate 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) (and related resources) | ||||||
|  |         - [DNS](https://git.fediversity.eu/Fediversity/Fediversity/issues/110) | ||||||
|  |         - [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) | ||||||
|  |     - [publish specification](https://git.fediversity.eu/Fediversity/Fediversity/issues/334) using e.g. JSON Schema / OpenAPI | ||||||
|  |     - [facilitate multi-tenancy](https://git.fediversity.eu/Fediversity/Fediversity/issues/241) | ||||||
|  |     - [provision admin accounts](https://git.fediversity.eu/Fediversity/Fediversity/issues/178) | ||||||
|  |     - [ensure users can update their configurations](https://git.fediversity.eu/Fediversity/Fediversity/issues/158) | ||||||
|  | - Software ready for web hosts to take into production: | ||||||
|  |     - [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) | ||||||
|  |     - [allow control over version of module deployed](https://git.fediversity.eu/Fediversity/Fediversity/issues/304) | ||||||
|  |     - [security audit](https://git.fediversity.eu/Fediversity/Fediversity/issues/291) | ||||||
|  |     - [automate dependency updates](https://git.fediversity.eu/Fediversity/Fediversity/issues/65) | ||||||
|  | - Features to improve user experience and increase host adoption: | ||||||
|  |     - [enqueue deployment syncs](https://git.fediversity.eu/Fediversity/Fediversity/issues/242) | ||||||
|  |     - [application data back-ups](https://git.fediversity.eu/Fediversity/Fediversity/issues/123) | ||||||
|  |     - [migrating application data between hosting providers](https://git.fediversity.eu/Fediversity/Fediversity/issues/100) | ||||||
|  |     - [provide single sign-on](https://git.fediversity.eu/Fediversity/Fediversity/issues/212) | ||||||
|  |     - [expand exposed configuration settings](https://git.fediversity.eu/Fediversity/Fediversity/issues/195) | ||||||
|  |     - [allow disabling application while retaining data](https://git.fediversity.eu/Fediversity/Fediversity/issues/186) | ||||||
|  |     - [aid needed user actions on schema update](https://git.fediversity.eu/Fediversity/Fediversity/issues/214) | ||||||
|  |     - [scaling application resources](https://git.fediversity.eu/Fediversity/Fediversity/issues/119) | ||||||
|  |     - [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) | ||||||
|  | - Facilitate engagement from external developers: | ||||||
|  |     - [create integration tests](https://git.fediversity.eu/Fediversity/Fediversity/issues/277) | ||||||
|  |     - [add continuous integration builds to a public cache](https://git.fediversity.eu/Fediversity/Fediversity/issues/92) | ||||||
|  |     - [reproduce required 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) | ||||||
|  |     - [facilitate user signup](https://git.fediversity.eu/Fediversity/Fediversity/issues/335) | ||||||
|  |     - [facilitate code reviews](https://git.fediversity.eu/Fediversity/Fediversity/issues/302) | ||||||
|  |     - [get documentation ready](https://git.fediversity.eu/Fediversity/Fediversity/issues/288) | ||||||
|  |     - [upstream to NixOS](https://git.fediversity.eu/Fediversity/Fediversity/issues/333) | ||||||
|  | 
 | ||||||
|  | ## 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 | ||||||
|  | 
 | ||||||
|  | ### [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 | ||||||
							
								
								
									
										232
									
								
								fediversity.md
									
										
									
									
									
								
							
							
						
						
									
										232
									
								
								fediversity.md
									
										
									
									
									
								
							|  | @ -347,235 +347,9 @@ We will integrate that aspect into the high level process on a best effort basis | ||||||
| 
 | 
 | ||||||
| # Implementation and planning | # Implementation and planning | ||||||
| 
 | 
 | ||||||
| 
 | ```include | ||||||
| ## Actors | architecture.md | ||||||
| 
 | ``` | ||||||
| - 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. |  | ||||||
| 
 |  | ||||||
| ## Architecture |  | ||||||
| 
 |  | ||||||
| At the core of Fediversity lies a NixOS configuration template containing selected applications. |  | ||||||
| We use this to deploy to selected run-time environments, so far targeting hypervisor ProxmoX. |  | ||||||
| We further provide a reference front-end 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 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ## 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: |  | ||||||
| 
 |  | ||||||
| - Initial internal user to kick-start feedback process: |  | ||||||
|     - automate 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) (and related resources) |  | ||||||
|         - [DNS](https://git.fediversity.eu/Fediversity/Fediversity/issues/110) |  | ||||||
|         - [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) |  | ||||||
|     - [publish specification](https://git.fediversity.eu/Fediversity/Fediversity/issues/334) using e.g. JSON Schema / OpenAPI |  | ||||||
|     - [facilitate multi-tenancy](https://git.fediversity.eu/Fediversity/Fediversity/issues/241) |  | ||||||
|     - [provision admin accounts](https://git.fediversity.eu/Fediversity/Fediversity/issues/178) |  | ||||||
|     - [ensure users can update their configurations](https://git.fediversity.eu/Fediversity/Fediversity/issues/158) |  | ||||||
| - Software ready for web hosts to take into production: |  | ||||||
|     - [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) |  | ||||||
|     - [allow control over version of module deployed](https://git.fediversity.eu/Fediversity/Fediversity/issues/304) |  | ||||||
|     - [security audit](https://git.fediversity.eu/Fediversity/Fediversity/issues/291) |  | ||||||
|     - [automate dependency updates](https://git.fediversity.eu/Fediversity/Fediversity/issues/65) |  | ||||||
| - Features to improve user experience and increase host adoption: |  | ||||||
|     - [enqueue deployment syncs](https://git.fediversity.eu/Fediversity/Fediversity/issues/242) |  | ||||||
|     - [application data back-ups](https://git.fediversity.eu/Fediversity/Fediversity/issues/123) |  | ||||||
|     - [migrating application data between hosting providers](https://git.fediversity.eu/Fediversity/Fediversity/issues/100) |  | ||||||
|     - [provide single sign-on](https://git.fediversity.eu/Fediversity/Fediversity/issues/212) |  | ||||||
|     - [expand exposed configuration settings](https://git.fediversity.eu/Fediversity/Fediversity/issues/195) |  | ||||||
|     - [allow disabling application while retaining data](https://git.fediversity.eu/Fediversity/Fediversity/issues/186) |  | ||||||
|     - [aid needed user actions on schema update](https://git.fediversity.eu/Fediversity/Fediversity/issues/214) |  | ||||||
|     - [scaling application resources](https://git.fediversity.eu/Fediversity/Fediversity/issues/119) |  | ||||||
|     - [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) |  | ||||||
| - Facilitate engagement from external developers: |  | ||||||
|     - [create integration tests](https://git.fediversity.eu/Fediversity/Fediversity/issues/277) |  | ||||||
|     - [add continuous integration builds to a public cache](https://git.fediversity.eu/Fediversity/Fediversity/issues/92) |  | ||||||
|     - [reproduce required 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) |  | ||||||
|     - [facilitate user signup](https://git.fediversity.eu/Fediversity/Fediversity/issues/335) |  | ||||||
|     - [facilitate code reviews](https://git.fediversity.eu/Fediversity/Fediversity/issues/302) |  | ||||||
|     - [get documentation ready](https://git.fediversity.eu/Fediversity/Fediversity/issues/288) |  | ||||||
|     - [upstream to NixOS](https://git.fediversity.eu/Fediversity/Fediversity/issues/333) |  | ||||||
| 
 |  | ||||||
| ## 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 |  | ||||||
| 
 |  | ||||||
| ### [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 |  | ||||||
| 
 | 
 | ||||||
| ## Work plan and resources | ## Work plan and resources | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
|   shell = pkgs.mkShellNoCC { |   shell = pkgs.mkShellNoCC { | ||||||
|     packages = with pkgs; [ |     packages = with pkgs; [ | ||||||
|       pandoc |       pandoc | ||||||
|  |       pandoc-include | ||||||
|       texliveMedium |       texliveMedium | ||||||
|       librsvg |       librsvg | ||||||
|     ]; |     ]; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue