apt repository for Velnor — the
self-hosted GitHub Actions runner. Installs and upgrades velnor-runner (the
runner daemon) with native apt.
The signed repository is published to GitHub Pages at:
# 1. trust the signing key (scoped to this repo via signed-by)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://velnor-apt.tailrocks.com/velnor.gpg \
| sudo tee /etc/apt/keyrings/velnor.gpg > /dev/null
# 2. add the repo
echo "deb [signed-by=/etc/apt/keyrings/velnor.gpg] https://velnor-apt.tailrocks.com stable main" \
| sudo tee /etc/apt/sources.list.d/velnor.list
# 3. install
sudo apt update
sudo apt install velnor-runner
# 4. configure non-secret settings and the operator-owned token separately
sudo nano /etc/velnor/velnor.env
sudo install -m 0600 /dev/null /etc/velnor/secrets.env
sudo nano /etc/velnor/secrets.env # GITHUB_TOKEN=...
sudo systemctl enable --now velnor-daemonsudo apt update && sudo apt install velnor-runner
apt-cache policy velnor-runner
dpkg-query -W velnor-runnerA coherent tagged velnor-runner release is independently verified and then
published here; apt upgrade picks it up.
- Velnor builds both architecture packages, immutable OCI image, manifest, checksums, and one release record from the same tagged commit.
publish.ymldownloads those source-owned assets directly. It independently resolves the tag and verifies every package, manifest, image, signer, and record digest beforereprepro.- Publication retains the exact previously signed package pair for rollback, signs fresh repository metadata plus a publication record, and deploys only the verified Pages artifact. Velnor is the default execution lane; operators may explicitly select GitHub or both lanes. Pages always uses GitHub Actions, never a branch.
Design and operator runbook: velnor docs/debian-apt-repo.md.
-
Merge the signed-off Velnor release commit, then push its matching
vX.Y.Ztag. The source workflow fails unless tag, crate, package, manifest, OCI, and source identities agree. -
Dispatch
Publish apt repowith that tag. The publisher downloads only the immutable source release, verifies coherence beforereprepro, retains the signed previous pair, signs the new index/publication record, then deploys. -
Before changing a server, verify that the signed candidate is visible:
sudo apt-get update apt-cache policy velnor-runner
-
Drain the Velnor daemons and install the published candidate only through APT. Do not sideload a
.debor replace/usr/bin/velnor-runnerdirectly:sudo apt-get install velnor-runner dpkg-query -W velnor-runner sudo systemctl start velnor-daemon
-
Run
velnor-runner doctorand the fixture smoke test. The signed index keeps the previous coherent version available. Roll back only through APT after verifying its exact candidate; never sideload a release asset.
- Create a dedicated GPG signing key (do not reuse across projects). Store the private key and passphrase securely. Manually copy the armored private key to the GitHub secret
APT_GPG_PRIVATE_KEYand passphrase toAPT_GPG_PASSPHRASE. Commit/publish the public half asvelnor.gpg(and into the published tree). - Set
SignWith:inconf/distributionsto the key id. - Enable GitHub Pages for this repo → Source:
GitHub Actions(you should always use GitHub Actions for Pages deployments in these setups; never "Deploy from a branch"). - Set Custom domain to
velnor-apt.tailrocks.com. - Keep the committed
velnor.gpgfingerprint equal to the private publisher key. The workflow fails before publication when they differ.
- Commit and push the Velnor release commit, then push its new
vX.Y.Ztag. - Confirm Velnor's unified release workflow built and validated both architectures, manifest, OCI image, checksums, and release record.
- Confirm this repository's publish and Pages deployment jobs are green.
- Verify
dists/stable/InReleaseand the newapt-cache policycandidate before upgrading any server. Servers install only from this signed repository; do not sideload.debrelease assets.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.