{"id":51242606,"url":"https://github.com/vitkuz573/amnezia-packager","last_synced_at":"2026-07-18T13:01:53.020Z","repository":{"id":365756099,"uuid":"1273499704","full_name":"vitkuz573/amnezia-packager","owner":"vitkuz573","description":"Enterprise package builder for AmneziaVPN — native .deb/.pkg.tar.zst/.rpm from GitHub releases, with GPG signing, SBOM, and APT/Arch/YUM repos","archived":false,"fork":false,"pushed_at":"2026-06-21T14:49:50.000Z","size":90268,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T01:33:09.384Z","etag":null,"topics":["amneziavpn","appveyor","arch-linux","bash","ci","cyclonedx","deb","devops","gpg-signing","package-builder","packager","rpm","sbom","vpn"],"latest_commit_sha":null,"homepage":"https://vitkuz573.github.io/amnezia-packager/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vitkuz573.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-18T15:26:27.000Z","updated_at":"2026-06-21T14:49:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vitkuz573/amnezia-packager","commit_stats":null,"previous_names":["vitkuz573/amnezia-packager"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/vitkuz573/amnezia-packager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitkuz573%2Famnezia-packager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitkuz573%2Famnezia-packager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitkuz573%2Famnezia-packager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitkuz573%2Famnezia-packager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vitkuz573","download_url":"https://codeload.github.com/vitkuz573/amnezia-packager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitkuz573%2Famnezia-packager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35618186,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-18T02:00:07.223Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amneziavpn","appveyor","arch-linux","bash","ci","cyclonedx","deb","devops","gpg-signing","package-builder","packager","rpm","sbom","vpn"],"created_at":"2026-06-29T01:32:05.171Z","updated_at":"2026-07-18T13:01:52.992Z","avatar_url":"https://github.com/vitkuz573.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AmneziaVPN Packager\n\n[![License](https://img.shields.io/badge/license-GPLv3-blue)](LICENSE)\n[![Changelog](https://img.shields.io/badge/changelog-Keep%20a%20Changelog-E05735)](CHANGELOG.md)\n[![Contributing](https://img.shields.io/badge/contributing-guide-2ea44f)](CONTRIBUTING.md)\n[![Code of Conduct](https://img.shields.io/badge/code%20of%20conduct-Contributor%20Covenant-ff69b4)](CODE_OF_CONDUCT.md)\n[![AppVeyor](https://img.shields.io/badge/CI-AppVeyor-0078d7)](.appveyor.yml)\n\nEnterprise-grade build system that downloads [AmneziaVPN](https://github.com/amnezia-vpn/amnezia-client) releases from GitHub and packages them into native distribution formats with GPG signing, SBOM, build manifests, and layered configuration.\n\n```\n./build.sh -a --profile prod\n# → amneziavpn-4.8.19.0-1-x86_64.pkg.tar.zst + .sig + sbom + manifest\n```\n\nPublic APT and Arch repos available at `vitkuz573.github.io/amnezia-packager/` — see [docs/repository.md](docs/repository.md).\n\n## Features\n\n- **Pipeline architecture** — fetch → extract → verify → package with pre/post hooks at each stage\n- **Multi-format** — `.deb` (Debian/Ubuntu), `.pkg.tar.zst` (Arch Linux), `.rpm` (Fedora/RHEL)\n- **Layered JSON config** — default → local → profile → env → CLI with JSON Schema validation\n- **Template engine** — envsubst-based metadata generation for control files, PKGINFO, spec\n- **SBOM generation** — CycloneDX 1.5 bill of materials with SHA-256 for every binary\n- **Build manifest** — JSON manifest per build with artifact metadata, timestamps, config snapshot\n- **GPG signing** — sign packages and repo metadata (APT Release, Arch db)\n- **Caching** — API response cache (1h TTL), tarball reuse across rebuilds\n- **Parallel builds** — `--all --parallel` spawns simultaneous deb + rpm + arch\n- **Health check** — post-install validation tool for binary, service, desktop entry, filesystem\n- **Package repo** — APT (`tools/repo.sh`) + Arch (`repo-add`) + YUM + GitHub Releases upload\n- **Auto-discovery** — drop `src/packager/*.sh`, it's found automatically\n- **Headless IFW** — Qt IFW's built-in CLI (`--accept-licenses --confirm-command`)\n- **Dev/prod profiles** — `dev.json` (debug), `prod.json` (sign + manifest + cache)\n- **Docker** — multi-stage reproducible build\n- **Vagrant** — multi-distro test boxes (Arch, Debian, Fedora)\n- **CI** — AppVeyor: lint → test → build → deploy gh-pages + GitHub Releases\n\n## Quick Start\n\n```bash\n# Grab the latest GitHub release and build an Arch package\n./build.sh -a\n\n# Build a specific version\n./build.sh -a -v 4.8.19.0\n\n# Build from a local tarball (fastest for development)\n./build.sh -d --tar ~/Downloads/AmneziaVPN_4.8.19.0_linux_x64.tar\n\n# Build all formats with production profile, signed\n./build.sh --all --profile prod --sign --gpg-key 0xDEADBEEF\n\n# Dry-run to preview the pipeline\n./build.sh -n --tar ~/Downloads/AmneziaVPN_4.8.19.0_linux_x64.tar\n```\n\n## Requirements\n\n- Bash 4.4+, `tar`, `curl`, `sudo`\n- Packager-specific: `dpkg-deb` (Debian), `makepkg` (Arch), `rpmbuild` (RPM)\n- Optional: `jq` (JSON config), `gpg` (signing), `python3` (SBOM), `bats` (tests), `gh` (Release upload)\n\n## Usage\n\n### CLI Reference\n\n| Flag | Description |\n|------|-------------|\n| `-v, --version` | Release version (default: latest) |\n| `-o, --output` | Output directory (default: cwd) |\n| `--tar` | Path to local tarball (skips download) |\n| `-d, --deb` | Build Debian package |\n| `-r, --rpm` | Build RPM package |\n| `-a, --arch` | Build Arch package |\n| `--all` | Build all available formats |\n| `--parallel` | Build targets in parallel (with `--all`) |\n| `-n, --dry-run` | Show pipeline plan without executing |\n| `--sign` | GPG-sign packages |\n| `--gpg-key KEY` | GPG key ID for signing |\n| `--profile PROFILE` | Load config profile (`dev`, `prod`) |\n| `--manifest` | Generate build manifest |\n| `-h, --help` | Show help |\n\n### Makefile\n\n```bash\nmake arch          # Build Arch package\nmake deb           # Build Debian package\nmake rpm           # Build RPM package\nmake all           # Build all formats\nmake parallel      # Build all formats in parallel\nmake release       # Build all + sign + manifest + SBOM\nmake test          # Run bats tests\nmake lint          # Shellcheck\nmake fmt           # shfmt\nmake docker        # Build via multi-stage Docker\nmake docker-run-arch  # Build Arch inside Docker\nmake check-deps    # Verify required tools\nmake clean         # Remove build artifacts\n```\n\n### Docker\n\n```bash\n# Build inside Docker (no host tools needed)\nmake docker-run-arch\n\n# Interactive shell\ndocker compose run --rm builder\n```\n\n### Config Profiles\n\n```bash\n# Dev — debug logging, JSON log format, no signing\n./build.sh -a --profile dev\n\n# Prod — sign packages, generate manifest, use caches\n./build.sh -a --profile prod --sign --gpg-key 0xDEADBEEF\n```\n\n## Configuration\n\nSee [docs/config.md](docs/config.md) for the full reference.\n\nLayered (later wins): `default.json` ← `local.json` ← `profile` ← env vars ← CLI flags. Validated against JSON Schema via `jq`.\n\n## Project Structure\n\n```\n├── build.sh                     # Entry point\n├── Makefile                     # Build/test/lint/docker/release targets\n├── Dockerfile                   # Multi-stage Docker build\n├── docker-compose.yml           # Compose for development\n├── Vagrantfile                  # Multi-distro test boxes\n├── .appveyor.yml                # AppVeyor CI pipeline\n├── renovate.json                # Renovate dependency updates\n├── repo-public-key.asc          # GPG public key for repos\n├── config/\n│   ├── default.json             # Base configuration\n│   ├── schema.json              # JSON Schema validation\n│   ├── local.json               # Per-machine overrides (gitignored)\n│   └── profiles/\n│       ├── dev.json             # Development profile\n│       └── prod.json            # Production profile\n├── templates/\n│   ├── arch/\n│   │   ├── PKGBUILD             # Arch PKGBUILD template\n│   │   ├── PKGINFO              # Arch .PKGINFO metadata\n│   │   └── INSTALL              # Arch install scripts\n│   ├── debian/\n│   │   ├── control              # Debian control template\n│   │   ├── postinst             # Post-install script template\n│   │   └── prerm                # Pre-remove script template\n│   └── rpm/\n│       └── spec                 # RPM spec template\n├── src/\n│   ├── core/\n│   │   ├── logger.sh            # Structured logging with correlation ID\n│   │   ├── config.sh            # Layered JSON config loader\n│   │   ├── template.sh          # envsubst template renderer\n│   │   ├── bootstrap.sh         # Workspace, cleanup, distro detection\n│   │   ├── pipeline.sh          # Stage orchestration, CLI parsing\n│   │   └── sbom.sh              # CycloneDX SBOM generator\n│   ├── stage/\n│   │   ├── fetch.sh             # GitHub API → download tarball\n│   │   ├── extract.sh           # tar → headless IFW → application files\n│   │   └── verify.sh            # Validate extracted structure\n│   └── packager/\n│       ├── 00-interface.sh      # Packager contract\n│       ├── deb.sh               # Debian/Ubuntu .deb builder\n│       ├── arch.sh              # Arch Linux .pkg.tar.zst builder\n│       └── rpm.sh               # RPM .rpm builder\n├── tools/\n│   ├── healthcheck.sh           # Post-install validation\n│   └── repo.sh                  # APT/Arch/YUM repo management + Release upload\n├── tests/\n│   └── core.bats                # Bats test suite\n└── docs/\n    ├── architecture.md          # Full architecture guide\n    ├── config.md                # Configuration reference\n    ├── repository.md            # APT/Arch repo usage guide\n    └── ci.md                    # AppVeyor CI pipeline docs\n```\n\n## Install from Repos\n\n**APT (Debian/Ubuntu):**\n```bash\ncurl -sS https://vitkuz573.github.io/amnezia-packager/repo-public-key.asc \\\n  | sudo gpg --dearmor -o /usr/share/keyrings/amneziavpn.gpg\necho \"deb [signed-by=/usr/share/keyrings/amneziavpn.gpg] https://vitkuz573.github.io/amnezia-packager/apt stable main\" \\\n  | sudo tee /etc/apt/sources.list.d/amneziavpn.list\nsudo apt update \u0026\u0026 sudo apt install amneziavpn\n```\n\n**Arch Linux (pacman):**\n```bash\ncurl -sS https://vitkuz573.github.io/amnezia-packager/repo-public-key.asc \\\n  | sudo pacman-key --add -\nsudo pacman-key --lsign-key repo@amneziavpn.local\n\ncat \u003e\u003e /etc/pacman.conf \u003c\u003c\"EOF\"\n[amneziavpn]\nSigLevel = Optional TrustAll\nServer = https://github.com/vitkuz573/amnezia-packager/releases/download/packages\nServer = https://vitkuz573.github.io/amnezia-packager/arch\nEOF\n\nsudo pacman -Sy \u0026\u0026 sudo pacman -S amneziavpn\n```\n\n**Manual install:**\n```bash\nsudo dpkg -i amneziavpn_*_amd64.deb \u0026\u0026 sudo apt install -f   # Debian\nsudo pacman -U amneziavpn-*.pkg.tar.zst                       # Arch\nsudo rpm -i amneziavpn-*.rpm                                  # Fedora\n```\n\nAfter installation: systemd service `amneziavpn.service` auto-starts, CLI at `/usr/local/bin/amneziavpn`.\n\n## Project Status\n\nFollows **semantic versioning** (see [CHANGELOG](CHANGELOG.md)).\nThe config schema and template interface are stable within a major version.\n\n## Community\n\n- [Contributing Guide](CONTRIBUTING.md) — how to add new packagers, pipeline stages, config vars\n- [Code of Conduct](CODE_OF_CONDUCT.md) — community standards\n- [Security Policy](SECURITY.md) — how to report vulnerabilities\n- [Issue Templates](https://github.com/vitkuz573/amnezia-packager/issues/new/choose) — bug, feature, new packager\n\n## Package Repository Management\n\n```bash\n# Initialize repo structure (APT + Arch + YUM)\ntools/repo.sh init /srv/repo\n\n# Add packages (generates db for apt/arch/yum)\ntools/repo.sh add amneziavpn_4.8.19.0_amd64.deb /srv/repo\ntools/repo.sh add amneziavpn-4.8.19.0-1-x86_64.pkg.tar.zst /srv/repo\n\n# Sign Release + Arch db\ntools/repo.sh release /srv/repo --gpg-key 0xDEADBEEF\n\n# Upload packages to GitHub Releases (tag: packages)\ntools/repo.sh upload packages\n\n# Deploy metadata to gh-pages\ntools/repo.sh deploy /srv/repo \"repo: update $(date -u +%Y-%m-%d)\"\n```\n\n## Adding a New Packager\n\n```bash\ncp src/packager/deb.sh src/packager/fedora.sh\n```\n\nImplement three functions:\n\n```bash\nsource \"src/packager/00-interface.sh\"\npackager_register_impl\n\nbuild_package() { … }\nget_artifact()  { echo \"$ARTIFACT\"; }\nget_deps()      { echo \"rpm-build createrepo\"; }\n```\n\nAuto-discovered automatically — no central registry.\n\n## Development\n\n```bash\npre-commit install              # Pre-commit hooks\nmake test                       # Bats tests\nmake lint                       # Shellcheck\nmake fmt                        # shfmt\n./build.sh -n --tar ~/Downloads/AmneziaVPN_*.tar  # Dry-run\nLOG_LEVEL=debug ./build.sh -a --tar ~/Downloads/AmneziaVPN_*.tar  # Debug\n```\n\n## Vagrant\n\n```bash\nvagrant up archlinux   # Arch box\nvagrant ssh archlinux\ncd /vagrant \u0026\u0026 ./build.sh -a\n```\n\n## CI/CD (AppVeyor)\n\nSee [docs/ci.md](docs/ci.md) for the full pipeline reference.\n\nOn push to `main`:\n- `lint` — shellcheck\n- `test` — bats unit tests\n- `build-deb` — build .deb, init repo, sign, deploy to gh-pages\n- On tags `v*`: upload artifacts to GitHub Releases\n\n## License\n\nGNU General Public License v3.0 — see [LICENSE](LICENSE).\n\n## Links\n\n- **GitHub**: https://github.com/vitkuz573/amnezia-packager\n- **Package Repo**: https://vitkuz573.github.io/amnezia-packager/\n- **Changelog**: https://github.com/vitkuz573/amnezia-packager/blob/main/CHANGELOG.md\n- **Docs**: [`docs/`](docs/architecture.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitkuz573%2Famnezia-packager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvitkuz573%2Famnezia-packager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitkuz573%2Famnezia-packager/lists"}