init commit

This commit is contained in:
2026-07-18 10:02:43 +03:00
commit 3b4a1f5388
31 changed files with 6580 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
package main
import (
"os"
"path/filepath"
"time"
)
// installDeps installs the AmneziaWG stack and userspace tooling for the host
// OS, then records completion in the state file. This step is now fully
// decoupled from init-server: it must be run first, and init-server only
// verifies the recorded flag rather than installing anything itself.
func installDeps() {
os := detectOS()
info("Installing AmneziaWG dependencies for %s %s...", os.ID, os.Version)
switch os.ID {
case "ubuntu", "debian", "linuxmint":
env := []string{"DEBIAN_FRONTEND=noninteractive"}
runOrDie2(env, "apt-get", "update", "-qq")
// Prerequisites for adding the PPA and building the kernel module.
runOrDie2(env, "apt-get", "install", "-y",
"software-properties-common", "python3-launchpadlib", "gnupg2",
"linux-headers-"+unameRelease(), "curl")
if os.ID == "linuxmint" {
// Mint's official docs require "Source code repositories" to be
// enabled (Software Sources → Optional Sources) before adding a
// PPA; the CLI equivalent is uncommenting the deb-src lines that
// Mint ships disabled by default.
run("sed", "-i", "s/^# deb-src/deb-src/",
"/etc/apt/sources.list.d/official-package-repositories.list")
runOrDie2(env, "apt-get", "update", "-qq")
}
// AmneziaWG kernel module + userspace tools via the official PPA.
runOrDie2(env, "add-apt-repository", "-y", "ppa:amnezia/ppa")
runOrDie2(env, "apt-get", "update", "-qq")
runOrDie2(env, "apt-get", "install", "-y",
"amneziawg", "amneziawg-tools",
"jq", "qrencode", "nftables")
case "alpine":
runOrDie("apk", "update")
runOrDie("apk", "add",
"jq", "libqrencode-tools", "nftables", "curl", "util-linux")
buildAmneziawgToolsFromSource()
warn("On Alpine the AmneziaWG kernel module may need to be provided")
warn("separately (DKMS/akmods or a prebuilt module for your kernel)")
}
// Record that dependency installation completed so init-server can verify it.
saveState(&State{
DepsInstalled: true,
InstalledAt: time.Now().UTC().Format(time.RFC3339),
OSID: os.ID,
OSVersion: os.Version,
})
info("Dependencies installed")
info("State recorded: %s (deps_installed=true)", stateFile)
info("Next step: run 'init-server' to configure and start the server")
}
// runOrDie2 is runEnv + abort-on-failure (env-aware variant of runOrDie).
func runOrDie2(env []string, name string, args ...string) {
if err := runEnv(env, name, args...); err != nil {
die("%s failed: %v", name, err)
}
}
// buildAmneziawgToolsFromSource builds and installs `awg`/`awg-quick` on an
// Alpine host. Unlike Ubuntu/Debian/Mint (served by the official
// ppa:amnezia/ppa), amneziawg-tools has no Alpine apk package — the container
// image already builds it from source for exactly this reason (see the
// tools-builder stage in Dockerfile); this mirrors that same build for a bare
// Alpine host.
func buildAmneziawgToolsFromSource() {
info("No Alpine package exists for amneziawg-tools — building from source...")
runOrDie("apk", "add", "git", "build-base", "linux-headers", "bash")
dir, err := os.MkdirTemp("", "amneziawg-tools-*")
if err != nil {
die("Failed to create temp build dir: %v", err)
}
defer os.RemoveAll(dir)
runOrDie("git", "clone", "--depth=1",
"https://github.com/amnezia-vpn/amneziawg-tools", dir)
src := filepath.Join(dir, "src")
runOrDieIn(src, "make")
runOrDieIn(src, "make", "install",
"WITH_WGQUICK=yes", "WITH_BASHCOMPLETION=no", "WITH_SYSTEMDUNITS=no",
"PREFIX=/usr")
info("amneziawg-tools built and installed (awg, awg-quick)")
}