From 9a5b3e282a0a6e8098049dd2beaaa40a26dc0ae5 Mon Sep 17 00:00:00 2001 From: Charlotte Van Petegem Date: Fri, 4 Nov 2022 10:32:25 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + flake.lock | 67 +++++++++ flake.nix | 55 ++++++++ src/config.toml | 31 +++++ src/content/_index.md | 3 + src/content/about.md | 10 ++ .../2022-11-03-unifiedpush-nextcloud-nixos.md | 131 ++++++++++++++++++ src/content/blog/_index.md | 6 + src/sass/style.scss | 58 ++++++++ src/static/favicon.ico | Bin 0 -> 16958 bytes src/templates/base.html | 29 ++++ src/templates/index.html | 23 +++ src/templates/page.html | 8 ++ src/templates/post.html | 15 ++ src/templates/section.html | 20 +++ src/templates/taxonomy_list.html | 14 ++ src/templates/taxonomy_single.html | 18 +++ 17 files changed, 490 insertions(+) create mode 100644 .gitignore create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 src/config.toml create mode 100644 src/content/_index.md create mode 100644 src/content/about.md create mode 100644 src/content/blog/2022-11-03-unifiedpush-nextcloud-nixos.md create mode 100644 src/content/blog/_index.md create mode 100644 src/sass/style.scss create mode 100644 src/static/favicon.ico create mode 100644 src/templates/base.html create mode 100644 src/templates/index.html create mode 100644 src/templates/page.html create mode 100644 src/templates/post.html create mode 100644 src/templates/section.html create mode 100644 src/templates/taxonomy_list.html create mode 100644 src/templates/taxonomy_single.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70a3201 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/src/public +/result diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..776f8b2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,67 @@ +{ + "nodes": { + "devshell": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1667210711, + "narHash": "sha256-IoErjXZAkzYWHEpQqwu/DeRNJGFdR7X2OGbkhMqMrpw=", + "owner": "numtide", + "repo": "devshell", + "rev": "96a9dd12b8a447840cc246e17a47b81a4268bba7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1667482890, + "narHash": "sha256-pua0jp87iwN7NBY5/ypx0s9L9CG49Ju/NI4wGwurHc4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a2a777538d971c6b01c6e54af89ddd6567c055e8", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..3b2628f --- /dev/null +++ b/flake.nix @@ -0,0 +1,55 @@ +{ + description = "My personal website"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + devshell = { + url = "github:numtide/devshell"; + inputs = { + flake-utils.follows = "flake-utils"; + nixpkgs.follows = "nixpkgs"; + }; + }; + }; + outputs = { self, nixpkgs, devshell, flake-utils }: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { inherit system; overlays = [ devshell.overlay ]; }; + pkg = pkgs.stdenv.mkDerivation { + pname = "www.chvp.be"; + version = "unstable"; + src = ./src; + + buildPhase = '' + ${pkgs.zola}/bin/zola build + ''; + + installPhase = '' + cp -r public $out + ''; + }; + shell = pkgs.devshell.mkShell { + name = "Website"; + packages = with pkgs; [ + nixpkgs-fmt + zola + ]; + }; + in + { + packages = { + default = pkg; + "www.chvp.be" = pkg; + }; + devShells = rec { + default = shell; + "www.chvp.be" = shell; + }; + } + ) // { + overlay = (curr: prev: { + "www.chvp.be" = self.packages.${curr.system}.default; + }); + }; +} diff --git a/src/config.toml b/src/config.toml new file mode 100644 index 0000000..3a69c7e --- /dev/null +++ b/src/config.toml @@ -0,0 +1,31 @@ +# The URL the site will be built for +base_url = "https://www.chvp.be" + +title = "Charlotte Van Petegem's website" +description = "Blog posts and other musings" + +# Whether to automatically compile all Sass files in the sass directory +compile_sass = true + +# Whether to build a search index to be used later on by a JavaScript library +build_search_index = false + +generate_feed = false + +taxonomies = [ + { name = "Tags" } +] + +[markdown] +# Whether to do syntax highlighting +# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola +highlight_code = true +highligt_theme = "ayu-dark" +external_links_target_blank = true +external_links_no_follow = true +external_links_no_referrer = true +smart_punctuation = true + + +[extra] +# Put all your custom variables here diff --git a/src/content/_index.md b/src/content/_index.md new file mode 100644 index 0000000..6558471 --- /dev/null +++ b/src/content/_index.md @@ -0,0 +1,3 @@ ++++ +title = "Homepage" ++++ diff --git a/src/content/about.md b/src/content/about.md new file mode 100644 index 0000000..ab94ccf --- /dev/null +++ b/src/content/about.md @@ -0,0 +1,10 @@ ++++ +title = "About me" ++++ + +I am a PhD student at Ghent University working on +[Dodona](https://dodona.ugent.be/en). My main side project is +[Accentor](https://github.com/accentor), a self-hosted music server. I am +passionate about NixOS and general open-source development. My hobbies also +include listening to music, going to concerts, reading, and long-distance +running. In the remaining time I volunteer for the Red Cross. diff --git a/src/content/blog/2022-11-03-unifiedpush-nextcloud-nixos.md b/src/content/blog/2022-11-03-unifiedpush-nextcloud-nixos.md new file mode 100644 index 0000000..cf37bb3 --- /dev/null +++ b/src/content/blog/2022-11-03-unifiedpush-nextcloud-nixos.md @@ -0,0 +1,131 @@ ++++ +title = "Setting up Nextcloud as a UnifiedPush provider on NixOS" +[taxonomies] +Tags = ["Nix", "NixOS", "Fediverse", "Matrix", "Android"] ++++ + +I recently set up Nextcloud as a UnifiedPush provider on NixOS. Since others +might want to do the same, I've detailed the process in this blog post. First I +will explain in a nutshell what UnifiedPush is and why anyone would want to use +it, next I will go over the steps required for setting it up. + + +## UnifiedPush + +UnifiedPush is used to deliver push notifications to Android devices. It +specifies how servers should talk with push providers, and how apps should talk +with push distributors. The push distributor is the only app keeping open a +connection to the push provider, making this a lot more efficient than every app +that needs push notifications implementing its own polling mechanism. Since +receiving push notifications is the only function of a push distributor, I also +trust it more to do so efficiently. When the push distributor receives a +notification, it distributes it to the corresponding app, which can now react to +the actual notification. + +Apps that want to receive push notifications need to register with the push +distributor first. The push distributor will then give the app the information +that the server backend needs to send the push notifications. + +Note that nothing about this is Android-specific; one could implement a push +distributor for any sufficiently open platform (in fact, a [D-Bus distributor +specification](https://unifiedpush.org/spec/dbus/) exists). However, since +Android is the most widely-used mobile OS where something like this is possible, +it is the platform where most of the development has happened. + +UnifiedPush is a great alternative to Firebase Cloud Messaging (Google's push +notification service). Apps do not need to register with any central authority +and do not need to pay to send push notifications. Users are free to choose +which service their data flows through, and as this post shows, can even +self-host this service. A number of apps already support this service; in my +case I am using [Tusky](https://tusky.app/) (a Mastodon client) and [Element +Android](https://matrix.org/docs/projects/client/element-android/) (a Matrix +client). + +## Configuring Nextcloud + +### Prerequisites + +I assume that you've already set up a Nextcloud instance (using the [NixOS module](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=services.nextcloud.)). The +module is not that complicated if not. Feel free to steal any part of [my config](https://github.com/chvp/nixos-config/blob/main/modules/services/nextcloud/default.nix). + +### NixOS configuration + +First, you need to make sure that Nextcloud can load the redis PHP module, that +you have a redis server running and that Nextcloud is configured to use it. Redis +is used as a message broker in this case, so if this part is missing the +communication from the notifying servers will not go through to the devices that +are listening. In addition to redis, you also need to tweak nginx to allow the +long-running requests that are typically used for push notifications. + +The configuration for Nextcloud should look like this: + +```nix +{ + services.nextcloud = { + # Your other configuration here + caching.redis = true; + extraOptions.redis = { + host = "127.0.0.1"; + port = 31638; + dbindex = 0; + timeout = 1.5; + }; + }; +} +``` + +Of course, you need to configure redis as well: + +```nix +{ + services.redis.servers.nextcloud = { + enable = true; + port = 31638; + bind = "127.0.0.1"; + }; +} +``` + +And finally, you need to make sure you allow long-running requests in nginx: + +```nix +{ + services.nginx.virtualHosts."your.nextcloud.hostname".extraConfig = '' + fastcgi_connect_timeout 10m; + fastcgi_read_timeout 10m; + fastcgi_send_timeout 10m; + ''; +} +``` + +Make sure to switch to the new configuration after making your edits. + +### Nextcloud configuration + +After setting up Nextcloud itself, you still need to install the ["UnifiedPush +Provider"](https://apps.nextcloud.com/apps/uppush) app. This can be found under +the Multimedia category in the Nextcloud apps admin interface. Note that you can +also manage Nextcloud apps declaratively on NixOS, but I personally don't do so, +so I will not detail the process here. + +### Device configuration + +To use UnifiedPush on your Android device you need to have both the +[Nextcloud](https://f-droid.org/en/packages/com.nextcloud.client/) and the +[NextPush](https://f-droid.org/en/packages/org.unifiedpush.distributor.nextpush/) +app installed. Opening the NextPush app should guide you through setting it +up. Once you've done that, you can start registering apps with NextPush. For +example, to register Element Android go to the Notifications settings in Element +Android and pick NextPush as your notification method. To set up Tusky, I +haven't found a better way than logging out and back in again. + +Once you've followed these steps, you should have a working push notification +setup. + +## Conclusion + +As you can see, the process for setting up UnifiedPush using Nextcloud is not +that involved. I was personally really impressed with how quickly I was able to +get everything working. It is really nice to see that the open-source and free +software community can implement the niceties that we've come to expect from +modern life without needing a big tech giant to do so. diff --git a/src/content/blog/_index.md b/src/content/blog/_index.md new file mode 100644 index 0000000..d860237 --- /dev/null +++ b/src/content/blog/_index.md @@ -0,0 +1,6 @@ ++++ +title = "Posts" +sort_by = "date" +generate_feed = true +page_template = "post.html" ++++ diff --git a/src/sass/style.scss b/src/sass/style.scss new file mode 100644 index 0000000..248ae65 --- /dev/null +++ b/src/sass/style.scss @@ -0,0 +1,58 @@ +body { + margin: 0; +} + +header { + border-bottom: black 1px solid; + padding: 0.5em; + + section { + display: inline; + + + section::before { + content: '| '; + } + } +} + +main { + padding: 0.5em; + max-width: 60em; + margin: 0 auto; +} + +footer { + border-top: black 1px solid; + padding: 0.5em; + section { + display: inline; + + + section::before { + content: '| '; + } + } +} + +pre { + padding: 0.5em; +} + +.post-list { + padding: 0; + margin: 0; + li { + list-style-type: none; + } +} + +.inline-list { + padding: 0; + margin: 0; + li { + display: inline; + list-style-type: none; + &+ li::before { + content: '/ ' + } + } +} diff --git a/src/static/favicon.ico b/src/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ca07030eaf43cedfbbe66e6c077fef06d125f6a1 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/src/templates/base.html b/src/templates/base.html new file mode 100644 index 0000000..e29f06f --- /dev/null +++ b/src/templates/base.html @@ -0,0 +1,29 @@ + + + + + {% block title %} {% endblock %} | Charlotte Van Petegem + + + + + +
+
+ Homepage +
+
+ Blog +
+
+
+ {% block content %} {% endblock %} +
+ + + diff --git a/src/templates/index.html b/src/templates/index.html new file mode 100644 index 0000000..e085b1e --- /dev/null +++ b/src/templates/index.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block title %}{{ section.title }}{% endblock title %} + +{% block content %} +

+Hi! Welcome to my website. It contains mostly blog posts. The three most recent +blog posts are listed below. Some more info about me is contained in the +appropiately named About me page. +

+

Most recent posts

+{% set blog_section = get_section(path="blog/_index.md") %} + +All posts +{% endblock content %} diff --git a/src/templates/page.html b/src/templates/page.html new file mode 100644 index 0000000..635e845 --- /dev/null +++ b/src/templates/page.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block title %}{{ page.title }}{% endblock %} + +{% block content %} +

{{ page.title }}

+{{ page.content | safe }} +{% endblock content %} diff --git a/src/templates/post.html b/src/templates/post.html new file mode 100644 index 0000000..7b3d4ce --- /dev/null +++ b/src/templates/post.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block title %}{{ page.title }}{% endblock %} + +{% block content %} +

{{ page.title }}
{{ page.date }}

+{{ page.content | safe }} + +

+ Comments or questions about this post? Feel free to contact me on Mastodon or send + me an email. +

+ +{% endblock content %} diff --git a/src/templates/section.html b/src/templates/section.html new file mode 100644 index 0000000..2e3b65e --- /dev/null +++ b/src/templates/section.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block title %} +{{ section.title }} +{% endblock title %} + +{% block content %} +

+ {{ section.title }} +

+ +{% endblock content %} diff --git a/src/templates/taxonomy_list.html b/src/templates/taxonomy_list.html new file mode 100644 index 0000000..080a4c6 --- /dev/null +++ b/src/templates/taxonomy_list.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ taxonomy.name }}{% endblock title %} + +{% block content %} +

+ {{ taxonomy.name }} +

+
    +{% for term in terms %} +
  • {{ term.name}} ({{ term.pages | length }})
  • +{% endfor %} +
+{% endblock content %} diff --git a/src/templates/taxonomy_single.html b/src/templates/taxonomy_single.html new file mode 100644 index 0000000..5432e29 --- /dev/null +++ b/src/templates/taxonomy_single.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block title %}{{ term.name }}{% endblock title %} + +{% block content %} +

+ {{ term.name }} +

+ +{% endblock content %}