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.