forked from Fediversity/Fediversity
Compare commits
9 commits
d5632a795b
...
deb70be70b
Author | SHA1 | Date | |
---|---|---|---|
![]() |
deb70be70b | ||
65782c65ba | |||
857e1b12f5 | |||
6513150abd | |||
a3365eb508 | |||
73c9c884d7 | |||
6d0fdd0834 | |||
488fbcc131 | |||
ed4912800f |
13 changed files with 211 additions and 24 deletions
111
README.md
111
README.md
|
@ -4,7 +4,116 @@ This repository contains all the code and code-related files having to do with
|
|||
[the Fediversity project](https://fediversity.eu/), with the notable exception
|
||||
of [NixOps4 that is hosted on GitHub](https://github.com/nixops4/nixops4).
|
||||
|
||||
## Content of this repository
|
||||
## Goals
|
||||
|
||||
Decentralise the operational responsibility for social media.
|
||||
Enable a more robust market of hosting providers, by making it easy to migrate operations and data to different providers.
|
||||
|
||||
Note that Fediversity is not about self-hosting.
|
||||
There already exist solutions for self-hosting, but they're not suitable for what we're trying to do.
|
||||
The ones we're aware of require substantial technical knowledge and time commitment by operators, especially for scaling to thousands of users.
|
||||
Not everyone has the expertise and time to run their own server.
|
||||
|
||||
## Actors
|
||||
|
||||
- Fediversity project team
|
||||
|
||||
The group working on this repository.
|
||||
We are creating the deployment workflows and service configurations.
|
||||
|
||||
The project partners for Fediversity are:
|
||||
- [NLnet Foundation](https://nlnet.nl/)
|
||||
- Open Internet Discourse Foundation
|
||||
- [NORDUnet](https://nordu.net/)
|
||||
- [Tweag](https://www.tweag.io/)
|
||||
|
||||
Refer to [fediversity.eu](https://fediversity.eu) for more details about the project.
|
||||
|
||||
- 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 (Mastodon, Pixelfed, Matrix, etc.).
|
||||
They don't need to own hardware or deal with operations.
|
||||
Operators administer their services 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.
|
||||
|
||||
Initially, Fediversity is targeted at organisations, such as universities.
|
||||
|
||||
- User
|
||||
|
||||
They are individuals that are not necessarily affiliated with any organisation.
|
||||
They register an account on services (e.g. Mastodon) run by the operators, and e.g. post content.
|
||||
Users don’t need to administrate anything.
|
||||
|
||||
Given initial operators will be universities, users would be staff or students.
|
||||
|
||||
## Glossary
|
||||
|
||||
- [Fediverse](https://en.wikipedia.org/wiki/Fediverse)
|
||||
|
||||
A collection of social networking services that can communicate with each other using a common protocol.
|
||||
|
||||
- Service
|
||||
|
||||
A Fediverse application 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.
|
||||
|
||||
> Example: We use [Proxmox](https://www.proxmox.com) to provision VMs for services run by operators.
|
||||
|
||||
- Deploy
|
||||
|
||||
Put software, such as services, onto computers.
|
||||
The software includes technical configuration that links software components.
|
||||
Most user-facing configuration remains untouched by the deployment process.
|
||||
|
||||
> Example: NixOps4 is used to deploy [Pixelfed](https://pixelfed.org).
|
||||
|
||||
- Migrate
|
||||
|
||||
Move service configurations and user data to a different hosting provider.
|
||||
|
||||
- [NixOps4](https://github.com/nixops4/nixops4)
|
||||
|
||||
A tool for deploying and managing resources through the Nix language.
|
||||
NixOps4 development is supported by the Fediversity project
|
||||
|
||||
- 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.
|
||||
|
||||
## Development
|
||||
|
||||
All the code made for this project is freely licenced under [EUPL](https://en.m.wikipedia.org/wiki/European_Union_Public_Licence).
|
||||
This means, anyone can use the work here to learn from it or change it according to their needs.
|
||||
You can even read up on [development proceedings](https://git.fediversity.eu/Fediversity/meta).
|
||||
|
||||
Contact the project team if you have questions or suggestions, or if you're interested in using Fediversity software for your operations:
|
||||
- E-mail: <mailto:contact@fediversity.eu>
|
||||
- Mastodon: <https://mastodon.fediversity.eu/@fediversity>
|
||||
|
||||
### Content of this repository
|
||||
|
||||
Most of the directories in this repository have their own README going into more
|
||||
details as to what they are for. As an overview:
|
||||
|
|
6
flake.lock
generated
6
flake.lock
generated
|
@ -991,11 +991,11 @@
|
|||
},
|
||||
"nixpkgs_7": {
|
||||
"locked": {
|
||||
"lastModified": 1738163270,
|
||||
"narHash": "sha256-B/7Y1v4y+msFFBW1JAdFjNvVthvNdJKiN6EGRPnqfno=",
|
||||
"lastModified": 1739758141,
|
||||
"narHash": "sha256-uq6A2L7o1/tR6VfmYhZWoVAwb3gTy7j4Jx30MIrH0rE=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "59e618d90c065f55ae48446f307e8c09565d5ab0",
|
||||
"rev": "c618e28f70257593de75a7044438efc1c1fc0791",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
@ -1,10 +1,17 @@
|
|||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
domain = "git.fediversity.eu";
|
||||
|
||||
in
|
||||
{
|
||||
services.forgejo = {
|
||||
enable = true;
|
||||
|
||||
## NOTE: By default, the Forgejo service features Forgejo LTS. However, we
|
||||
## want some more recent features, so we rely on a more recent one.
|
||||
package = pkgs.forgejo;
|
||||
|
||||
lfs.enable = true;
|
||||
settings = {
|
||||
service = {
|
||||
|
|
|
@ -27,20 +27,31 @@ The Fediversity Panel is a web service for managing Fediversity deployments with
|
|||
manage
|
||||
```
|
||||
|
||||
- Run the server locally
|
||||
- With a fresh database, run:
|
||||
|
||||
```
|
||||
manage migrate
|
||||
```
|
||||
|
||||
- Run the server locally:
|
||||
|
||||
```shell-session
|
||||
manage runserver
|
||||
```
|
||||
|
||||
- Whenever you add a field in the database schema, run:
|
||||
- Create an admin user:
|
||||
|
||||
```console
|
||||
```shell-session
|
||||
manage createsuperuser
|
||||
```
|
||||
|
||||
and log in at <http://localhost:8000/admin>.
|
||||
|
||||
- After changing the database schema, add migrations and apply them:
|
||||
|
||||
```shell-session
|
||||
manage makemigrations
|
||||
```
|
||||
|
||||
Then before starting the server again, run:
|
||||
|
||||
```
|
||||
manage migrate
|
||||
```
|
||||
|
||||
- Use the [Django Debug Toolbar](https://github.com/django-commons/django-debug-toolbar) for troubleshooting in the browser
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
{
|
||||
lib,
|
||||
buildPythonPackage,
|
||||
setuptools,
|
||||
django_4,
|
||||
django-compressor,
|
||||
django-libsass,
|
||||
dj-database-url,
|
||||
django-compressor,
|
||||
django-debug-toolbar,
|
||||
django-libsass,
|
||||
django_4,
|
||||
setuptools,
|
||||
sqlite,
|
||||
}:
|
||||
let
|
||||
src =
|
||||
|
@ -41,11 +43,13 @@ buildPythonPackage {
|
|||
'';
|
||||
|
||||
propagatedBuildInputs = [
|
||||
setuptools
|
||||
django_4
|
||||
django-compressor
|
||||
django-libsass
|
||||
dj-database-url
|
||||
django-compressor
|
||||
django-debug-toolbar
|
||||
django-libsass
|
||||
django_4
|
||||
setuptools
|
||||
sqlite
|
||||
];
|
||||
|
||||
postInstall = ''
|
||||
|
|
|
@ -58,10 +58,13 @@ INSTALLED_APPS = [
|
|||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'debug_toolbar',
|
||||
'compressor',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#add-the-middleware
|
||||
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
|
@ -71,6 +74,12 @@ MIDDLEWARE = [
|
|||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#configure-internal-ips
|
||||
INTERNAL_IPS = [
|
||||
"127.0.0.1",
|
||||
"[::1]",
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'panel.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
|
@ -119,6 +128,9 @@ AUTH_PASSWORD_VALIDATORS = [
|
|||
},
|
||||
]
|
||||
|
||||
LOGIN_URL = 'login'
|
||||
LOGIN_REDIRECT_URL = '/' # Redirect to homepage after login
|
||||
LOGOUT_REDIRECT_URL = '/' # Redirect to homepage after logout
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/4.2/topics/i18n/
|
||||
|
|
8
panel/src/panel/templates/account_detail.html
Normal file
8
panel/src/panel/templates/account_detail.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ user.username }}</h1>
|
||||
<dl>
|
||||
<dt>e-mail</dt><dd>{{ user.email}}</dd>
|
||||
</dl>
|
||||
{% endblock %}
|
|
@ -17,9 +17,9 @@
|
|||
<body>
|
||||
<header>
|
||||
{% if user.is_authenticated %}
|
||||
<p>Welcome, {{ user.username }}!</p>
|
||||
<p>Welcome, {{ user.username }}! <a href="{% url 'logout' %}?next={{ request.path }}">Logout</a></p>
|
||||
{% else %}
|
||||
<p>You are not logged in.</p>
|
||||
<p><a href="{% url 'login' %}?next={{ request.path }}">Login</a></p>
|
||||
{% endif %}
|
||||
</header>
|
||||
{% block navigation %}
|
||||
|
|
10
panel/src/panel/templates/registration/login.html
Normal file
10
panel/src/panel/templates/registration/login.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Login</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit">Login</button>
|
||||
</form>
|
||||
{% endblock %}
|
10
panel/src/panel/templates/service_list.html
Normal file
10
panel/src/panel/templates/service_list.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Fediverse services</h1>
|
||||
|
||||
<dl>
|
||||
<dt>Hello world service</dt>
|
||||
<dd>Nothing to see here</dd>
|
||||
</dl>
|
||||
{% endblock %}
|
|
@ -15,10 +15,14 @@ Including another URLconf
|
|||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
from django.urls import include, path
|
||||
from panel import views
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path("debug/", include("debug_toolbar.urls")),
|
||||
path('', views.Index.as_view(), name='index'),
|
||||
path("", include("django.contrib.auth.urls")),
|
||||
path("account/", views.AccountDetail.as_view(), name='account_detail'),
|
||||
path("services/", views.ServiceList.as_view(), name='service_list'),
|
||||
]
|
||||
|
|
|
@ -1,4 +1,16 @@
|
|||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.contrib.auth.models import User
|
||||
from django.views.generic import TemplateView
|
||||
from django.views.generic import DetailView
|
||||
|
||||
class Index(TemplateView):
|
||||
template_name = 'index.html'
|
||||
|
||||
class AccountDetail(LoginRequiredMixin, DetailView):
|
||||
model = User
|
||||
template_name = 'account_detail.html'
|
||||
def get_object(self):
|
||||
return self.request.user
|
||||
|
||||
class ServiceList(TemplateView):
|
||||
template_name = 'service_list.html'
|
||||
|
|
|
@ -97,7 +97,7 @@ nix build .#checks.<system>.<test>.driverInteractive
|
|||
- Tutorial for setting up better logging: https://krisztianfekete.org/self-hosting-mastodon-on-nixos-a-proof-of-concept/
|
||||
- Setting up mastodon development environment: https://docs.joinmastodon.org/dev/setup/
|
||||
|
||||
- Tutorial for PeerTube that doesn't use `createLocally`: https://nixos.wiki/wiki/PeerTube
|
||||
- Tutorial for PeerTube that doesn't use `createLocally`: https://wiki.nixos.org/wiki/PeerTube
|
||||
|
||||
- garage settings for specific apps: https://garagehq.deuxfleurs.fr/documentation/connect/apps/
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue