Title: How to setup a local network cache for Flatpak
Author: Solène
Date: 05 April 2023
Tags: linux flatpak efficiency
Description: In this article, you will learn how to setup a LAN cache
for Flatpak to speed up updates

# Introduction

As you may have understood by now, I like efficiency on my systems,
especially when it comes to network usage due to my poor slow ADSL
internet connection.

Flatpak is nice, I like it for many reasons, and what's cool is that it
can download only updated files instead of the whole package again.

Unfortunately, when you start using more and more packages that are
updated daily, and which require subsystems like NVIDIA drivers, MESA
etc... this adds up to quitea lot of daily downloads, and multiply that
by a few computers and you gets a lot of network traffic.

But don't worry, you can cache it on your LAN to download updates only
once.

# Setup

As usual for this kind of job, we will use Nginx on a local server on
the network, and configure it to act as a reverse proxy to the flatpak
repositories.

This requires modifying the URL of each flatpak repository on the
machines, it's a one time operation.

Here is the configuration you need on your Nginx to proxy Flathub:

```nginx
map $status $cache_header {
    200     "public";
    302     "public";
    default "no-cache";
}

server {
    listen 0.0.0.0:8080; # you may want to listen on port 80, or add TLS
    server_name my-cache.local; # replace this with your hostname, or system IP

    # flathub cache
    set $flathub_cache https://dl.flathub.org;

    location /flathub/ {
        rewrite  ^/flathub/(.*) /$1 break;
        proxy_cache flathub;
        proxy_cache_key     "$request_filename";
        add_header Cache-Control $cache_header always;
        proxy_cache_valid   200 302     300d;
        expires max;
        proxy_pass  $flathub_cache;
    }
}

proxy_cache_path    /var/cache/nginx/flathub/cache levels=1:2
    keys_zone=flathub:5m
    max_size=20g
    inactive=60d
    use_temp_path=off;
```

This will cause nginx to proxy requests to the flathub server, but keep
files in a 20 GB cache.

You will certainly need to create the `/var/cache/nginx/flathub`
directory, and make sure it has the correct ownership for your system
configuration.

If you want to support another flatpak repository (like Fedora's), you
need to create a new location, and new cache in your nginx config.

# Client configuration

On each client, you need to change the URL to reach flathub, in the
example above, the URL is `http://my-cache.local:8080/flathub/repo/`.

You can change the URL with the following command:

```shell command
flatpak remote-modify flathub --url=http://my-cache.local:8080/flathub/repo/`
```

Please note that if you add flathub repo, you must use the official URL
to have the correct configuration, and then you can change its URL with
the above command.

# Revert the changes

If you don't want to use the cache anymore , just revert the flathub
url to its original value:

```shell command
flatpak remote-modify flathub --url=https://dl.flathub.org/repo/
```

# Conclusion

Our dear nginx is still super useful as a local caching server, it's
super fun to see some updates going at 100 MB/s from my NAS now.