| 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. |