Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Code

394 commit(s) on main

Default the run verbs to origin Keenan Nemetz · 7m ago 2e6aa96e

Vole on any server

This page is for a provider without its own guide — Vultr, Linode, Scaleway, OVH, UpCloud, Proxmox — and for the machine you already have: a spare server, or a virtual machine on your own hardware. The first-boot file is the same one the Hetzner, DigitalOcean, and AWS guides paste into their consoles.

There are two ways, and the first one is less work.

A machine that accepts user data

Most providers let you paste “user data”, “cloud-init”, or a “startup script” into the form that creates a machine. Give it the rendered first-boot file and the machine configures itself.

Render it on your own computer. Pick ubuntu-24.04 or debian-13 as the image in the provider’s form, and a size with 2 GB of memory and 20 GB of disk.

cd deploy/cloud-init

HOSTNAME=forge.example.com \
ADMIN_ACCOUNT=admin \
ADMIN_EMAIL=you@example.com \
ADMIN_SSH_KEY="$(cat ~/.ssh/id_ed25519.pub)" \
VOLE_PACKAGE_URL=https://rodent.software/vole/releases/v0.2.0/artifacts/vole_0.2.0-1_amd64.deb \
  ./render.sh > user-data.yaml

Paste the contents of user-data.yaml into the provider’s field and create the machine. The values are:

Variable What it is
HOSTNAME The name people will reach the forge on. It becomes public_url, and passkeys bind to it, so choose the one you intend to keep
ADMIN_ACCOUNT Name of the first account, made an instance admin. Account names are permanent
ADMIN_SSH_KEY Public key of that account, as in the contents of ~/.ssh/id_ed25519.pub
VOLE_PACKAGE_URL The .deb for the machine’s architecture, from Vole’s releases
ADMIN_EMAIL Contact address for the certificate authority. Optional, but a good idea
INSTANCE_NAME What the landing page calls this forge. Default Vole
TLS_MODE acme (the default) lets Vole obtain its own certificate. proxy leaves TLS to a proxy you run, and serves plain HTTP on loopback

Point the name at the machine’s address, then open https://forge.example.com. The certificate is issued on the first visit after DNS answers, so a first attempt that fails is usually just early; wait a minute and reload.

render.sh needs envsubst, which is in gettext-base on Debian and Ubuntu or gettext elsewhere. Without it, edit deploy/cloud-init/vole.yaml by hand: each placeholder is a value with the same name.

To issue the first passkey for the admin account, run this from your laptop:

vole admin --remote ssh://git@forge.example.com:2222 account invite admin

A machine you configure yourself

If the machine is already running and you have shell access, install the package and point it at your name. This is the same result the first-boot script produces, done by hand.

# On the machine, as a user with sudo.
curl -fsSLO https://rodent.software/vole/releases/v0.2.0/artifacts/vole_0.2.0-1_amd64.deb
sudo apt install ./vole_0.2.0-1_amd64.deb

The package creates the vole service account, /var/lib/vole, and an instance under the shipped configuration. Now write the configuration people will reach:

# /etc/vole/vole.toml
data_dir = "/var/lib/vole/data"

http_addr  = ":80"
https_addr = ":443"
public_url = "https://forge.example.com"
acme_email = "you@example.com"

ssh_addr = "0.0.0.0:2222"

Ports 80 and 443 are below 1024, and the packaged unit drops every capability, so grant the one that binds them:

sudo install -d -m 0755 /etc/systemd/system/vole.service.d
sudo tee /etc/systemd/system/vole.service.d/bind.conf >/dev/null <<'EOF'
[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
EOF

Then create the first account and start the service:

sudo systemctl daemon-reload
sudo -u vole vole admin --config /etc/vole/vole.toml \
  account create admin --key /tmp/your-key.pub --role admin
sudo systemctl enable --now vole

--role admin is what makes this account an instance admin. The first one has to be granted on the host; after that, admins can manage the instance over SSH with vole admin --remote.

If you would rather run a proxy than let Vole hold the certificate, leave https_addr empty, set http_addr = "127.0.0.1:8080", and name the header your proxy sets with the client address:

git_http_client_ip_header = "X-Forwarded-For"

Then

  • Deploying Vole — backups, upgrades, and what first boot does
  • Packages — what the package installs, and how upgrades work
  • Configuration — every setting, including limits and sites