I've got an apt repository, and you can too
Hey there!
In this post, I want to talk about my apt repository. I've had it for a while, but since it's been working well for me I thought I'd announce it to wider world on here.
For those not in the know, an apt repository is a repository of software in a particular format that the apt
package manager (found on Debian-based distributions such as Ubuntu) use to keep software on a machine up-to-date.
The apt
package manager queries all repositories it has configured to find out what versions of which packages they have available, and then compares this with those locally installed. Any packages out of date then get upgraded, usually after prompting you to install the updates.
Linux distributions based on Debian come with a large repository of software, but it doesn't have everything. For this reason, extra repositories are often used to deliver updates to software automatically from third parties.
In my case, I've been finding increasingly that I've been wanting to deliver updates for software that isn't packaged for installation with apt
to a number of different machines. Every time I get around to installing update it felt like it was time to install another, so naturally I got frustrated enough with it that I decided to automate my problems away by scripting my own apt repository!
My apt repository can be found here: https://starbeamrainbowlabs.com/
It comes in 2 parts. Firstly, there's the repository itself - which is managed by a script that's based on my lantern build engine. It's this I'll be talking about in this post.
Secondly, I have a number of as yet adhoc custom Laminar job scripts for automatically downloading various software projects from GitHub, such that all I have to do is run laminarc queue apt-softwarename
and it'll automatically package the latest version and upload it to the repository itself, which has a cron job set to fold in all of the new packages at 2am every night. The specifics of this are best explain in another post.
Currently this process requires me to login and run the laminarc
command manually, but I intend to automate this too in the future (I'm currently waiting for a new release of beehive to fix a nasty bug for this).
Anyway, currently I have the following software packaged in my repository:
- Gossa - A simple HTTP file browser
- The Tiled Map Editor - An amazing 2D tile-based graphical map editor. You should sponsor the developer via any of the means on the Tiled Map Editor's website before using my apt package.
- tldr-missing-pages - A small utility script for finding tldr-pages to write
- webhook - A flexible webhook system that calls binaries and shell scripts when a HTTP call is made
- I've also got a pleaserun-based service file generator packaged for this too in the
webhook-service
package
Of course, more will be coming as and when I discover and start using cool software.
The repository itself is driven by a set of scripts. These scripts were inspired by a stack overflow post that I have since lost, but I made a number of usability improvements and rewrote it to use my lantern build engine as I described above. I call this improved script aptosaurus, because it sounds cool.
To use it, first clone the repository:
git clone https://git.starbeamrainbowlabs.com/sbrl/aptosaurus.git
Then, create a new GPG key to sign your packages with:
gpg --full-generate-key
Next, we need to export the new keypair to disk so that we can use it in scripts. Do that like this:
# Identify the key's ID in the list this prints out
gpg --list-secret-keys
# Export the secret key
gpg --export-secret-keys --armor INSERT_KEY_ID_HERE >secret.gpg
chmod 0600 secret.gpg # Don't forget to lock down the permissions
# Export the public key
gpg --export --armor INSERT_KEY_ID_HERE >public.gpg
Then, run the setup script:
./aptosaurus.sh setup
It should warn you if anything's amiss.
With the setup complete, you can new put your .deb
packages in the sources
subdirectory. Once done, run the update
command to fold them into the repository:
./aptosaurus.sh update
Now you've got your own repository! Your next step is to setup a static web server to serve the repo
subdirectory (which contains the repo itself) to the world! Personally, I use Nginx with the following config:
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name apt.starbeamrainbowlabs.com;
ssl_certificate /etc/letsencrypt/live/$server_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$server_name/privkey.pem;
#add_header strict-transport-security "max-age=31536000;";
add_header x-xss-protection "1; mode=block";
add_header x-frame-options "sameorigin";
add_header link '<https://starbeamrainbowlabs.com$request_uri>; rel="canonical"';
index index.html;
root /srv/aptosaurus/repo;
include /etc/nginx/snippets/letsencrypt.conf;
autoindex off;
fancyindex on;
fancyindex_exact_size off;
fancyindex_header header.html;
#location ~ /.well-known {
# root /srv/letsencrypt;
#}
}
This requires the fancyindex
module for Nginx, which can be installed with sudo apt install libnginx-mod-http-fancyindex
on Ubuntu-based systems.
To add your new apt repository to a machine, simply follow the instructions for my repository, replacing the domain name and the key ids with yours.
Hopefully this release announcement-turned-guide has been either interesting, helpful, or both! Do let me know in the comments if you encounter any issues. If there's enough interest I'll migrate the code to GitHub from my personal Git server if people want to make contributions (express said interest in the comments below).
It's worth noting that this is only a very simply apt repository. Larger apt repositories are sectioned off into multiple categories by distribution and release status (e.g. the Ubuntu repositories have xenial
, bionic
, eoan
, etc for the version number of Ubuntu, and main
, universe
, multiverse
, restricted
, etc for the different categories of software).
If you setup your own simple apt repository using this guide, I'd love it if you could let me know with a comment below too.