Know what is installed on every machine you run.
GOdin is an open source monitoring server and agent for Linux systems. The agent reports installed packages, pending upgrades and repository state. The server keeps every report in PostgreSQL, ready for Grafana to read.
- web-01debian 126 upgrades
- web-02debian 126 upgrades
- db-01rocky 9current
- cache-01ubuntu 24.04current
- build-03fedora 4121 upgrades
- mail-01debian 11no report, 4 days
- vpn-01alma 9current
- nas-01ubuntu 22.043 upgrades
What GOdin does
Package drift is quiet. A box misses a reboot, a repository is disabled by hand, a machine stops taking updates entirely, and nobody finds out until something breaks. GOdin makes that state visible across every host you run.
Each agent builds a structured report about its own system and posts it to the server. The server validates it and stores it as JSONB in PostgreSQL, so the whole history stays queryable with plain SQL. GOdin does not draw graphs itself — it feeds tools that already do that well.
There is a sample Grafana dashboard to start from.
A report carries
- Host info
- Hostname, distribution, kernel and the tags you assign.
- Installed packages
- Name and version of everything the package manager knows about.
- Pending upgrades
- What is waiting to be installed, and the version it moves to.
- Repositories
- Which repositories are configured and enabled, on RPM systems.
How it works
Four moving parts, and only one of them is GOdin's to keep running.
-
1
The agent collects
A bash script on each host queries the package manager and builds a JSON report. Run it from cron or a systemd timer, as often as you care to know.
-
2
curl sends it
The report is posted to your GOdin server over HTTP. No agent daemon, no open inbound ports on the host being monitored.
-
3
The server stores it
GOdin validates the report and writes it to a JSONB column in PostgreSQL, keeping every past report alongside the current one.
-
4
Grafana reads it
Point any tool that speaks PostgreSQL at the database and query the fleet however you like.
Get GOdin
Packages are published for Debian-family and RHEL-family systems. Add the repository once, then install the server on your central host and the agent on everything you want to watch.
Add the repository
curl -fsSL https://godin.bdrogo.xyz/godin-archive-keyring.gpg \
| sudo tee /usr/share/keyrings/godin-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/godin-archive-keyring.gpg] \
https://godin.bdrogo.xyz/deb stable main" \
| sudo tee /etc/apt/sources.list.d/godin.list
sudo apt update
Install the server
sudo apt install godin-server
Install the agent on each host
sudo apt install godin-client
Add the repository
sudo tee /etc/yum.repos.d/godin.repo > /dev/null <<'EOF'
[godin]
name=GOdin
baseurl=https://godin.bdrogo.xyz/rpm/stable
enabled=1
gpgcheck=1
gpgkey=https://godin.bdrogo.xyz/godin.asc
EOF
Install the server
sudo dnf install godin-server
Install the agent on each host
sudo dnf install godin-client
No packages for your distribution? The server is a single Go binary:
clone the repository and run go get && go build. The agent is a
bash script you can copy anywhere on your PATH.
Configure
Server
GOdin needs a PostgreSQL database, version 13 or newer. Create it first:
create database godin;
create user godin with encrypted password 'password';
grant all privileges on database godin to godin;
alter database godin owner to godin;
Then write /etc/godin/settings.json, readable by the user
that runs the server:
{
"Address": "0.0.0.0",
"Port": "80",
"LogLevel": "INFO",
"SQLUser": "godin",
"SQLPassword": "password",
"SQLDatabaseName": "godin",
"SQLServerAddress": "localhost",
"SQLPort": "5432"
}
Change that password. For HTTPS, put GOdin behind nginx or Apache — it does not terminate TLS itself.
Agent
Settings live in /etc/godin/godin-client.conf. The file is
sourced by the script, so keep the spaces out of the assignments:
CLIENT_HOSTNAME="myHostname"
SERVER_URL="http://godin.example.com/reports/upload"
TAGS="tag1,tag2"
Call the script on a schedule. Once a day is plenty for package state:
17 6 * * * /usr/bin/godin-client
Tags are free-form. They are stored with the report, so use them for whatever you want to group by later.
Matching versions
Server and agent speak the same report format as long as their first two version numbers match. The patch number is free to drift, so you can upgrade one host at a time and only need to plan for minor releases.
| Server | Agent | Works |
|---|---|---|
| 1.0 | 1.0 | yes |
| 1.2.1 | 1.2.3 | yes |
| 1.3 | 1.2.5 | no |