<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>there was a fish in the calculator</title><id>https://fishinthecalculator.me/feeds/tags/selfhosted.xml</id><subtitle>Tag: selfhosted</subtitle><updated>2026-05-05T22:13:01Z</updated><link href="https://fishinthecalculator.me/feeds/tags/selfhosted.xml" rel="self" /><link href="https://fishinthecalculator.me" /><entry><title>Monitor your Guix System with Grafana</title><id>https://fishinthecalculator.me/blog/monitor-your-guix-system-with-grafana.html</id><author><name>Giacomo Leidi</name><email>therewasa@fishinthecalculator.me</email></author><updated>2023-12-30T16:20:00Z</updated><link href="https://fishinthecalculator.me/blog/monitor-your-guix-system-with-grafana.html" rel="alternate" /><content type="html">&lt;p&gt;If you need to run Grafana on the Guix System this post is the right place. In this example we'll setup Grafana to read metrics from the same machine it's run upon, but you can adapt this to use a remote datasource.&lt;/p&gt;&lt;p&gt;First of all, &lt;a href=&quot;https://github.com/fishinthecalculator/gocix#configure&quot;&gt;add &lt;code&gt;gocix&lt;/code&gt;&lt;/a&gt; to your Guix channels and run &lt;code&gt;guix pull&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;After making sure you have &lt;code&gt;gocix&lt;/code&gt; in your &lt;code&gt;guix describe&lt;/code&gt; output, you just need to add the following services to your &lt;code&gt;operating-system&lt;/code&gt; record and reconfigure your system.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;use-modules&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;grafana&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;prometheus&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;gnu&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;monitoring&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;operating-system&lt;/span&gt;
  &lt;span class=&quot;syntax-open&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt;
    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
      &lt;span class=&quot;syntax-open&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;syntax-comment&quot;&gt;;; Prometheus node exporter
&lt;/span&gt;      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;prometheus-node-exporter-service-type&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;syntax-comment&quot;&gt;;; Prometheus OCI backed Shepherd service
&lt;/span&gt;      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;oci-prometheus-service-type&lt;/span&gt;
               &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-prometheus-configuration&lt;/span&gt;
                &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;host&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;syntax-comment&quot;&gt;;; Grafana OCI backed Shepherd service
&lt;/span&gt;      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;oci-grafana-service-type&lt;/span&gt;
               &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-grafana-configuration&lt;/span&gt;
                &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;host&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After you can see both Prometheus and Grafana spawned as Docker containers, such as in this example&lt;/p&gt;&lt;pre&gt;&lt;code&gt;docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
fede69fcf4bf   prom/prometheus:v2.45.0   &amp;quot;/bin/prometheus --w…&amp;quot;   26 seconds ago   Up 25 seconds   0.0.0.0:9000-&amp;gt;9000/tcp, :::9000-&amp;gt;9000/tcp, 0.0.0.0:9090-&amp;gt;9090/tcp, :::9090-&amp;gt;9090/tcp   docker-prometheus
caa2dc1f50c0   bitnami/grafana:10.1.5    &amp;quot;/opt/bitnami/script…&amp;quot;   26 seconds ago   Up 25 seconds   0.0.0.0:3000-&amp;gt;3000/tcp, :::3000-&amp;gt;3000/tcp                                              docker-grafana&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;you should be able to visit &lt;a href=&quot;http://localhost:3000&quot;&gt;localhost:3000&lt;/a&gt; and see the Grafana login page.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/grafana-login.png&quot; alt=&quot;Grafana's login page&quot; /&gt;&lt;/p&gt;&lt;p&gt;The default credentials are &lt;code&gt;admin:admin&lt;/code&gt;, log in and configure a new datasource with &lt;code&gt;http://localhost:9090&lt;/code&gt; as URL. In this example we'll avoid creating a new dashboard from scratch and we'll import one from the &lt;a href=&quot;https://grafana.com/grafana/dashboards/&quot;&gt;Grafana's website&lt;/a&gt;. Just click on the button to create a new dashboard and choose the import option, paste &lt;code&gt;1860&lt;/code&gt; as the Dashboard ID, select the Prometheus datasource you just created and import the dashboard.&lt;/p&gt;&lt;p&gt;You should be presented with the full data available from the &lt;code&gt;prometheus-node-exporter-service-type&lt;/code&gt; by default.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/grafana-dashboard.png&quot; alt=&quot;Grafana's Node Exporter Full dashboard&quot; /&gt;&lt;/p&gt;</content></entry><entry><title>Tame Docker selfhosting with Guix</title><id>https://fishinthecalculator.me/blog/tame-docker-selfhosting-with-guix.html</id><author><name>Giacomo Leidi</name><email>therewasa@fishinthecalculator.me</email></author><updated>2023-12-10T16:20:00Z</updated><link href="https://fishinthecalculator.me/blog/tame-docker-selfhosting-with-guix.html" rel="alternate" /><content type="html">&lt;p&gt;Many applications are packaged in &lt;a href=&quot;https://opencontainers.org&quot;&gt;OCI&lt;/a&gt;/Docker images but not in Guix. A good subset of them is written either in NodeJS, Go, Rust or languages that, as a general approach, encourage applications to have huge dependency graphs.&lt;/p&gt;&lt;p&gt;Let's take Grafana as an example. &lt;a href=&quot;https://github.com/grafana/grafana/blob/main/package.json&quot;&gt;According to its &lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt; Grafana's web frontend has more than 180 direct dependencies and more than 170 build time dependencies, for a grand total of ~350 direct dependencies. This is excluding all transitive dependencies. In the same way, Grafana's &lt;a href=&quot;https://github.com/grafana/grafana/blob/main/go.mod&quot;&gt;Go backend&lt;/a&gt; has ~440 direct dependencies. Some of them may be optional, but go figure.&lt;/p&gt;&lt;p&gt;This phenomenon is not uncommon in modern software development, it's not that Grafana is doing worse than everyone else. Yet it's quite problematic, it clearly shows that nobody put the effort of auditing or even reviewing the dependency graph of one of the most used dashboarding application in the industry.&lt;/p&gt;&lt;p&gt;Dissecting the interests which prevent the investment in building software products with a sustainable maintenance process is a topic for another post, the point is that the Guix project accepts package contributions that comply to very strict standards in term of licensing and other criteria, such as whether the package and its dependencies can be completely built from source. It's the reason why practically no NodeJS application (or even web applications with complex frontends, such as Grafana) can be upstreamed to Guix. It is not clear &lt;a href=&quot;https://dustycloud.org/blog/javascript-packaging-dystopia/&quot;&gt;whether they will ever be&lt;/a&gt;, since especially in the Javascript world packages suffer from cyclical dependency which complicate the packaging process even more.&lt;/p&gt;&lt;p&gt;It is very painful to have to package whole dependency graphs just to use some service on the Guix System. This is especially true when you have a goal that you want to achieve and you could use Guix to achieve it, but it does not necessarily involve sending a bunch of patches upstream. It could be that you want to start some Matrix community around Guix or other people-sized technologies, you may want to self host a personal cloud with Nextcloud or maybe you want to setup an accessible monitoring dashboard for your services with Grafana and Prometheus. These are all softwares that do not follow the best sustainability practices, but they are pretty useful to use while we build the alternative technology (also called alt-tech) that we need to survive sustainably in our digital lives.&lt;/p&gt;&lt;h2 id=&quot;container_taming_on_guix&quot;&gt;Container taming on Guix&lt;/h2&gt;&lt;p&gt;If you use &lt;code&gt;docker compose&lt;/code&gt; on the Guix System, you end up having two different interfaces to manage your system services: Shepherd and Docker. The &lt;code&gt;oci-container-service-type&lt;/code&gt; aims at &lt;a href=&quot;https://guix.gnu.org/en/manual/devel/en/guix.html#index-oci_002dcontainer_002dservice_002dtype&quot;&gt;implementing Shepherd Services&lt;/a&gt; that look and feel native (so you can configure and manage them with the usual consistent interface that Guix exposes) but under the hood are implemented as &lt;code&gt;docker run&lt;/code&gt; (or &lt;code&gt;docker rm&lt;/code&gt;) invokations, so that you don't have to package those huge dependency graphs just to start self hosting on Guix.&lt;/p&gt;&lt;p&gt;Next you can find an example of how run Prometheus on the Guix System through the &lt;code&gt;oci-container-service-type&lt;/code&gt;. You just need to add&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;use-modules&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;gnu&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;gnu&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;monitoring&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;guix&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;gexp&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;prometheus.yml&lt;/span&gt;
  &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;plain-file&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;prometheus.yml&amp;quot;&lt;/span&gt;
              &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;global:
  scrape_interval: 30s
  scrape_timeout: 12s

scrape_configs:
  - job_name: prometheus
    metrics_path: /metrics
    static_configs:
      - targets: ['localhost:9090','localhost:9100']\n&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;operating-system&lt;/span&gt;
  &lt;span class=&quot;syntax-open&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;services&lt;/span&gt;
    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
      &lt;span class=&quot;syntax-open&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;syntax-comment&quot;&gt;;; Prometheus node exporter
&lt;/span&gt;      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;prometheus-node-exporter-service-type&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;syntax-comment&quot;&gt;;; Prometheus OCI backed Shepherd service
&lt;/span&gt;      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;simple-service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-service-type&lt;/span&gt;
                      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                        &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;command&lt;/span&gt;
                            &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;--web.enable-lifecycle&amp;quot;&lt;/span&gt;
                              &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;--config.file=/etc/prometheus/prometheus.yml&amp;quot;&lt;/span&gt;
                              &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;--web.enable-admin-api&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;prom/prometheus:v2.45.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;ports&lt;/span&gt;
                            &lt;span class=&quot;syntax-symbol&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9000&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9000&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9090&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9090&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;volumes&lt;/span&gt;
                            &lt;span class=&quot;syntax-symbol&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/var/lib/prometheus&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/prometheus&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;,prometheus.yml&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/etc/prometheus/prometheus.yml:ro&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to the &lt;code&gt;services&lt;/code&gt; field of your &lt;code&gt;operating-system&lt;/code&gt; record. In this example it's also shown how to install the Prometheus node exporter to collect metrics from the host.&lt;/p&gt;&lt;p&gt;This approach obviously is lacking in reproducibility and bootstrappability, but in my experience often users need some software that is not yet guixable (i.e. possible to include in Guix upstream) so they choose to use Nix or something else entirely.&lt;/p&gt;&lt;h2 id=&quot;what's_next?&quot;&gt;What's next?&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;oci-container-service-type&lt;/code&gt; implements Shepherd services through Docker containers, but a Shepherd service is only a small block in the implementation of a nicely integrated Guix System service. To provide a secure, consistent and integrated experience a Guix System service may declare user accounts, to allow for less then root authority execution, or it may initialize some state upon activation: all things for which an additional service extension is required.&lt;/p&gt;&lt;p&gt;This is why I'm implementing a &lt;a href=&quot;https://github.com/fishinthecalculator/gocix&quot;&gt;library of (hopefully) community maintained Guix System services&lt;/a&gt; for many common self hostable applications such as Matrix Conduit, Forgejo, Grafana and more. These services try to be as similar as possible to an upstream provided service, in the hope of being upstreamed as soon as the underlying dependency graph is packaged.&lt;/p&gt;</content></entry></feed>