423 lines
12 KiB
Markdown
423 lines
12 KiB
Markdown
# APT Repository Setup Summary
|
||
|
||
## 🎉 What You Now Have
|
||
|
||
You now have a complete system for creating and hosting your own APT repository for socktop packages, **without needing a sponsor or official Debian/Ubuntu approval**.
|
||
|
||
## 📁 Files Created
|
||
|
||
### Scripts (in `scripts/`)
|
||
- **`init-apt-repo.sh`** - Initializes the APT repository directory structure
|
||
- **`add-package-to-repo.sh`** - Adds .deb packages to the repository and generates metadata
|
||
- **`sign-apt-repo.sh`** - Signs the repository with your GPG key
|
||
- **`setup-apt-repo.sh`** - All-in-one interactive wizard to set everything up
|
||
|
||
### Documentation
|
||
- **`QUICK_START_APT_REPO.md`** - Quick start guide (< 10 minutes)
|
||
- **`docs/APT_REPOSITORY.md`** - Comprehensive 600+ line guide covering everything
|
||
- **`APT_REPO_SUMMARY.md`** - This file
|
||
|
||
### GitHub Actions
|
||
- **`.github/workflows/publish-apt-repo.yml`** - Automated building, signing, and publishing
|
||
|
||
## 🚀 Quick Start (Choose One)
|
||
|
||
### Option 1: Interactive Setup (Recommended for First Time)
|
||
|
||
Run the setup wizard:
|
||
|
||
```bash
|
||
./scripts/setup-apt-repo.sh
|
||
```
|
||
|
||
This walks you through:
|
||
1. ✅ Checking prerequisites
|
||
2. 🔑 Setting up GPG key
|
||
3. 📦 Finding/building packages
|
||
4. 📝 Creating repository structure
|
||
5. ✍️ Signing the repository
|
||
6. 📋 Next steps to publish to gh-pages
|
||
|
||
### Option 2: Manual Step-by-Step
|
||
|
||
```bash
|
||
# 1. Initialize
|
||
./scripts/init-apt-repo.sh
|
||
|
||
# 2. Build packages
|
||
cargo deb --package socktop
|
||
cargo deb --package socktop_agent
|
||
|
||
# 3. Add packages
|
||
./scripts/add-package-to-repo.sh target/debian/socktop_*.deb
|
||
./scripts/add-package-to-repo.sh target/debian/socktop-agent_*.deb
|
||
|
||
# 4. Sign (replace YOUR-KEY-ID)
|
||
./scripts/sign-apt-repo.sh apt-repo stable YOUR-KEY-ID
|
||
|
||
# 5. Update URLs
|
||
sed -i 's/YOUR-USERNAME/your-github-username/g' apt-repo/*.{md,html}
|
||
|
||
# 6. Publish to gh-pages (see below)
|
||
```
|
||
|
||
### Option 3: Fully Automated (After Initial Setup)
|
||
|
||
Once gh-pages branch exists, just tag releases:
|
||
|
||
```bash
|
||
git tag v1.50.0
|
||
git push --tags
|
||
|
||
# GitHub Actions will:
|
||
# - Build packages for AMD64 and ARM64
|
||
# - Update APT repository
|
||
# - Sign with your GPG key
|
||
# - Push to gh-pages branch automatically
|
||
```
|
||
|
||
## 📤 Publishing to GitHub Pages (gh-pages branch)
|
||
|
||
**Why gh-pages branch?**
|
||
- ✅ Keeps main branch clean (source code only)
|
||
- ✅ Separate branch for published content
|
||
- ✅ GitHub Actions can auto-update it
|
||
- ✅ You can customize the landing page
|
||
|
||
**Initial Setup:**
|
||
```bash
|
||
# Create gh-pages branch
|
||
git checkout --orphan gh-pages
|
||
git rm -rf .
|
||
|
||
# Copy apt-repo CONTENTS to root (not the folder!)
|
||
cp -r apt-repo/* .
|
||
rm -rf apt-repo
|
||
|
||
# Commit and push
|
||
git add .
|
||
git commit -m "Initialize APT repository"
|
||
git push -u origin gh-pages
|
||
|
||
# Return to main
|
||
git checkout main
|
||
```
|
||
|
||
**Enable in GitHub:**
|
||
1. Settings → Pages
|
||
2. Source: **gh-pages** → **/ (root)**
|
||
3. Save
|
||
|
||
Your repo will be at: `https://your-username.github.io/socktop/`
|
||
|
||
**Note:** GitHub Pages only allows `/` (root) or `/docs`. Since we use gh-pages branch, contents go in the root of that branch.
|
||
|
||
See `SETUP_GITHUB_PAGES.md` for detailed step-by-step instructions.
|
||
|
||
### Alternative: Self-Hosted Server
|
||
|
||
Copy `apt-repo/` contents to your web server:
|
||
```bash
|
||
rsync -avz apt-repo/ user@example.com:/var/www/apt/
|
||
```
|
||
|
||
Configure Apache/Nginx to serve the directory. See `docs/APT_REPOSITORY.md` for details.
|
||
|
||
## 🤖 GitHub Actions Automation
|
||
|
||
### Required Secrets
|
||
|
||
Add these in GitHub Settings → Secrets → Actions:
|
||
|
||
1. **GPG_PRIVATE_KEY**
|
||
```bash
|
||
gpg --armor --export-secret-key YOUR-KEY-ID
|
||
# Copy entire output including BEGIN/END lines
|
||
```
|
||
|
||
2. **GPG_KEY_ID**
|
||
```bash
|
||
gpg --list-secret-keys --keyid-format LONG
|
||
# Use the ID after "rsa4096/"
|
||
```
|
||
|
||
3. **GPG_PASSPHRASE**
|
||
```bash
|
||
# Your GPG passphrase (leave empty if no passphrase)
|
||
```
|
||
|
||
### Triggers
|
||
|
||
The workflow runs on:
|
||
- **Version tags**: `git tag v1.50.0 && git push --tags`
|
||
- **Manual dispatch**: Actions tab → "Publish APT Repository" → Run workflow
|
||
|
||
### What It Does
|
||
|
||
1. ✅ Builds packages for AMD64 and ARM64
|
||
2. ✅ Initializes or updates APT repository
|
||
3. ✅ Generates Packages files and metadata
|
||
4. ✅ Signs with your GPG key
|
||
5. ✅ Commits and pushes to gh-pages branch
|
||
6. ✅ Creates GitHub Release with artifacts
|
||
7. ✅ Generates summary with installation instructions
|
||
|
||
## 👥 User Installation
|
||
|
||
Once published, users install with:
|
||
|
||
```bash
|
||
# Add repository
|
||
curl -fsSL https://your-username.github.io/socktop/KEY.gpg | \
|
||
sudo gpg --dearmor -o /usr/share/keyrings/socktop-archive-keyring.gpg
|
||
|
||
echo "deb [signed-by=/usr/share/keyrings/socktop-archive-keyring.gpg] https://your-username.github.io/socktop stable main" | \
|
||
sudo tee /etc/apt/sources.list.d/socktop.list
|
||
|
||
# Install
|
||
sudo apt update
|
||
sudo apt install socktop socktop-agent
|
||
|
||
# The agent service is automatically installed and configured
|
||
sudo systemctl enable --now socktop-agent
|
||
```
|
||
|
||
## 🔧 Maintenance
|
||
|
||
### Release New Version (Automated)
|
||
|
||
```bash
|
||
# Update version in Cargo.toml, commit changes
|
||
git add . && git commit -m "Bump version to 1.51.0"
|
||
git tag v1.51.0
|
||
git push origin main --tags
|
||
|
||
# GitHub Actions automatically:
|
||
# - Builds packages for AMD64 and ARM64
|
||
# - Updates apt-repo
|
||
# - Signs with GPG
|
||
# - Pushes to gh-pages branch
|
||
```
|
||
|
||
### Manual Update (if needed)
|
||
|
||
```bash
|
||
# On main branch
|
||
cargo deb --package socktop
|
||
./scripts/add-package-to-repo.sh target/debian/socktop_*.deb
|
||
./scripts/sign-apt-repo.sh
|
||
|
||
# Switch to gh-pages and update
|
||
git checkout gh-pages
|
||
cp -r apt-repo/* .
|
||
git add . && git commit -m "Release v1.51.0" && git push
|
||
git checkout main
|
||
```
|
||
|
||
### Remove Old Versions
|
||
|
||
```bash
|
||
# On gh-pages branch
|
||
git checkout gh-pages
|
||
rm pool/main/socktop_1.50.0_*.deb
|
||
# Regenerate metadata (re-add remaining packages)
|
||
git add . && git commit -m "Remove old versions" && git push
|
||
git checkout main
|
||
```
|
||
|
||
## 🎯 Key Benefits
|
||
|
||
✅ **No sponsor needed** - Host your own repository
|
||
✅ **Full control** - You decide when to release
|
||
✅ **Free hosting** - GitHub Pages at no cost
|
||
✅ **Automated** - GitHub Actions does the work
|
||
✅ **Professional** - Just like official repos
|
||
✅ **Multi-arch** - AMD64, ARM64 support built-in
|
||
✅ **Secure** - GPG signed packages
|
||
✅ **Easy updates** - Users get updates via `apt upgrade`
|
||
|
||
## 📊 Repository Structure
|
||
|
||
```
|
||
apt-repo/
|
||
├── dists/
|
||
│ └── stable/
|
||
│ ├── Release # Main metadata (checksums)
|
||
│ ├── Release.gpg # Detached signature
|
||
│ ├── InRelease # Clearsigned release
|
||
│ └── main/
|
||
│ ├── binary-amd64/
|
||
│ │ ├── Packages # Package list
|
||
│ │ ├── Packages.gz # Compressed
|
||
│ │ └── Release # Component metadata
|
||
│ ├── binary-arm64/
|
||
│ └── binary-armhf/
|
||
├── pool/
|
||
│ └── main/
|
||
│ ├── socktop_1.50.0_amd64.deb
|
||
│ ├── socktop-agent_1.50.1_amd64.deb
|
||
│ ├── socktop_1.50.0_arm64.deb
|
||
│ └── socktop-agent_1.50.1_arm64.deb
|
||
├── KEY.gpg # Public GPG key
|
||
├── README.md # Repository info
|
||
├── index.html # Web interface
|
||
└── packages.html # Package listing
|
||
```
|
||
|
||
## 🔑 GPG Key Management
|
||
|
||
### Create New Key
|
||
|
||
```bash
|
||
gpg --full-generate-key
|
||
# Choose RSA 4096, no expiration (or 2 years)
|
||
```
|
||
|
||
### Export Keys
|
||
|
||
```bash
|
||
# Public key (for users)
|
||
gpg --armor --export YOUR-KEY-ID > KEY.gpg
|
||
|
||
# Private key (for GitHub Secrets)
|
||
gpg --armor --export-secret-key YOUR-KEY-ID
|
||
```
|
||
|
||
### Backup Keys
|
||
|
||
```bash
|
||
# Backup to safe location
|
||
gpg --export-secret-keys YOUR-KEY-ID > gpg-private-backup.key
|
||
gpg --export YOUR-KEY-ID > gpg-public-backup.key
|
||
```
|
||
|
||
### Key Rotation
|
||
|
||
If your key expires or is compromised:
|
||
```bash
|
||
./scripts/sign-apt-repo.sh apt-repo stable NEW-KEY-ID
|
||
gpg --armor --export NEW-KEY-ID > apt-repo/KEY.gpg
|
||
# Users need to re-import the key
|
||
```
|
||
|
||
## 🐛 Troubleshooting
|
||
|
||
### "Repository not signed"
|
||
```bash
|
||
./scripts/sign-apt-repo.sh apt-repo stable YOUR-KEY-ID
|
||
ls apt-repo/dists/stable/Release* # Should show 3 files
|
||
```
|
||
|
||
### "Package not found"
|
||
```bash
|
||
cd apt-repo
|
||
dpkg-scanpackages --arch amd64 pool/main /dev/null > dists/stable/main/binary-amd64/Packages
|
||
gzip -9 -k -f dists/stable/main/binary-amd64/Packages
|
||
cd ..
|
||
./scripts/sign-apt-repo.sh
|
||
```
|
||
|
||
### "404 Not Found" on GitHub Pages
|
||
- Wait 2-3 minutes after pushing
|
||
- Check Settings → Pages is enabled
|
||
- Verify source branch/directory
|
||
|
||
### GitHub Actions not signing
|
||
- Check all 3 secrets are set correctly
|
||
- GPG_PRIVATE_KEY must include BEGIN/END lines
|
||
- Test signing locally first
|
||
|
||
## 📚 Documentation
|
||
|
||
| File | Purpose | Length |
|
||
|------|---------|--------|
|
||
| `QUICK_START_APT_REPO.md` | Get started in < 10 minutes | Quick |
|
||
| `SETUP_GITHUB_PAGES.md` | Detailed gh-pages setup guide | Step-by-step |
|
||
| `docs/APT_REPOSITORY.md` | Complete guide with all options | Comprehensive |
|
||
| `docs/DEBIAN_PACKAGING.md` | How .deb packages are built | Technical |
|
||
| `DEBIAN_PACKAGING_SUMMARY.md` | Overview of packaging work | Summary |
|
||
| `APT_REPO_SUMMARY.md` | This file | Overview |
|
||
|
||
## 🎓 Learning Path
|
||
|
||
1. **Start here**: `QUICK_START_APT_REPO.md` (10 min)
|
||
2. **Set up**: Run `./scripts/setup-apt-repo.sh` (15 min)
|
||
3. **Publish**: Follow `SETUP_GITHUB_PAGES.md` (5 min)
|
||
4. **Automate**: Set up GitHub Actions secrets (10 min)
|
||
5. **Advanced**: Read `docs/APT_REPOSITORY.md` as needed
|
||
|
||
## 🚦 Next Steps
|
||
|
||
Choose your path:
|
||
|
||
### Just Getting Started?
|
||
1. ✅ Read `QUICK_START_APT_REPO.md`
|
||
2. ✅ Run `./scripts/setup-apt-repo.sh`
|
||
3. ✅ Follow `SETUP_GITHUB_PAGES.md` to publish
|
||
4. ✅ Test installation on a VM
|
||
|
||
### Want Automation?
|
||
1. ✅ Generate/export GPG key
|
||
2. ✅ Add GitHub Secrets
|
||
3. ✅ Tag a release: `git tag v1.50.0 && git push --tags`
|
||
4. ✅ Watch GitHub Actions magic happen
|
||
|
||
### Want to Understand Everything?
|
||
1. ✅ Read `docs/APT_REPOSITORY.md` (comprehensive)
|
||
2. ✅ Study the scripts in `scripts/`
|
||
3. ✅ Examine `.github/workflows/publish-apt-repo.yml`
|
||
4. ✅ Learn about Debian repository format
|
||
|
||
### Ready for Production?
|
||
1. ✅ Set up monitoring/analytics
|
||
2. ✅ Create PPA for Ubuntu (Launchpad)
|
||
3. ✅ Apply to Debian mentors for official inclusion
|
||
4. ✅ Set up repository mirrors
|
||
5. ✅ Document best practices for users
|
||
|
||
## 🌟 Success Criteria
|
||
|
||
You'll know you're successful when:
|
||
|
||
- [ ] Users can `apt install socktop`
|
||
- [ ] Updates work with `apt upgrade`
|
||
- [ ] Multiple architectures supported
|
||
- [ ] Repository is GPG signed
|
||
- [ ] GitHub Actions publishes automatically
|
||
- [ ] Installation instructions in README
|
||
- [ ] Zero sponsor or approval needed
|
||
|
||
## 💡 Pro Tips
|
||
|
||
1. **Test first**: Always test on a fresh VM before publishing
|
||
2. **Keep versions**: Don't delete old .deb files immediately
|
||
3. **Backup GPG key**: Store it safely offline
|
||
4. **Monitor downloads**: Use GitHub Insights or server logs
|
||
5. **Document everything**: Help users troubleshoot
|
||
6. **Version consistently**: Use semantic versioning
|
||
7. **Sign always**: Never publish unsigned repositories
|
||
|
||
## 🔗 Resources
|
||
|
||
- [Debian Repository Format](https://wiki.debian.org/DebianRepository/Format)
|
||
- [GitHub Pages Docs](https://docs.github.com/en/pages)
|
||
- [cargo-deb](https://github.com/kornelski/cargo-deb)
|
||
- [Ubuntu PPA Guide](https://help.launchpad.net/Packaging/PPA)
|
||
- [Debian Mentors](https://mentors.debian.net/)
|
||
|
||
## 🎊 Congratulations!
|
||
|
||
You now have everything you need to:
|
||
- ✅ Create your own APT repository
|
||
- ✅ Host it for free on GitHub Pages
|
||
- ✅ Automate the entire process
|
||
- ✅ Distribute packages professionally
|
||
- ✅ Provide easy installation for users
|
||
|
||
**No sponsor required. No approval needed. You're in control!** 🚀
|
||
|
||
---
|
||
|
||
**Questions?** Check the docs or open an issue.
|
||
|
||
**Ready to publish?** Run `./scripts/setup-apt-repo.sh` and follow the wizard! |