summaryrefslogtreecommitdiff
path: root/Cargo.toml
diff options
context:
space:
mode:
authorDawid Rycerz <dawid@rycerz.xyz>2026-01-22 22:07:32 +0100
committerDawid Rycerz <dawid@rycerz.xyz>2026-02-10 18:44:26 +0100
commit064a1d01c5c14f5ecc032fa9b8346a4a88b893f6 (patch)
treea2023f9ccd297ed8a41a3a0cc5699c2add09244d /Cargo.toml
witryna 0.1.0 — initial releasev0.1.0
Minimalist Git-based static site deployment orchestrator. Webhook-triggered builds in Podman/Docker containers with atomic symlink publishing, SIGHUP hot-reload, and zero-downtime deploys. See README.md for usage, CHANGELOG.md for details.
Diffstat (limited to 'Cargo.toml')
-rw-r--r--Cargo.toml191
1 files changed, 191 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..fb8e20d
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,191 @@
+[package]
+name = "witryna"
+version = "0.1.0"
+edition = "2024"
+authors = ["Dawid Rycerz"]
+description = "Minimalist Git-based static site deployment orchestrator"
+homepage = "https://git.craftknight.com/dawid/witryna"
+repository = "https://git.craftknight.com/dawid/witryna.git"
+license = "MIT"
+
+[features]
+default = []
+integration = []
+
+[dependencies]
+anyhow = "1.0.100"
+clap = { version = "4", features = ["derive"] }
+subtle = "2.6"
+axum = "0.8.8"
+chrono = "0.4.43"
+dashmap = "6.1.0"
+governor = "0.8"
+serde = { version = "1.0.228", features = ["derive"] }
+serde_yaml_ng = "0.10"
+tokio = { version = "1.49.0", features = ["rt-multi-thread", "macros", "fs", "process", "net", "signal", "sync", "time", "io-util", "io-std"] }
+toml = "0.9.11"
+tracing = "0.1.44"
+tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
+humantime = "2.3.0"
+tokio-util = "0.7.18"
+serde_json = "1.0"
+
+[dev-dependencies]
+tower = "0.5"
+reqwest = { version = "0.12" }
+tempfile = "3"
+nix = { version = "0.29", features = ["signal"] }
+serial_test = "3"
+
+[build-dependencies]
+clap = { version = "4", features = ["derive"] }
+clap_mangen = "0.2.31"
+
+[profile.release]
+strip = true
+lto = true
+panic = "abort"
+
+[package.metadata.deb]
+maintainer = "Dawid Rycerz"
+copyright = "2026, Dawid Rycerz"
+extended-description = """\
+Witryna is a minimalist Git-based static site deployment orchestrator. \
+It listens for webhook triggers, pulls Git repositories, runs \
+containerized build commands, and publishes static assets via atomic \
+symlink switching."""
+section = "web"
+priority = "optional"
+depends = "$auto, adduser, systemd"
+recommends = "podman | docker.io"
+maintainer-scripts = "debian/"
+conf-files = ["/etc/witryna/witryna.toml"]
+assets = [
+ ["target/release/witryna", "usr/bin/", "755"],
+ ["target/man/witryna.1", "usr/share/man/man1/witryna.1", "644"],
+ ["man/witryna.toml.5", "usr/share/man/man5/witryna.toml.5", "644"],
+ ["examples/witryna.toml", "etc/witryna/witryna.toml", "644"],
+ ["README.md", "usr/share/doc/witryna/README.md", "644"],
+ ["examples/hooks/caddy-deploy.sh", "usr/share/doc/witryna/examples/hooks/caddy-deploy.sh", "755"],
+ ["examples/caddy/Caddyfile", "usr/share/doc/witryna/examples/caddy/Caddyfile", "644"],
+ ["examples/nginx/witryna.conf", "usr/share/doc/witryna/examples/nginx/witryna.conf", "644"],
+ ["examples/witryna.yaml", "usr/share/doc/witryna/examples/witryna.yaml", "644"],
+ ["examples/systemd/docker.conf", "usr/share/doc/witryna/examples/systemd/docker.conf", "644"],
+ ["examples/systemd/podman.conf", "usr/share/doc/witryna/examples/systemd/podman.conf", "644"],
+]
+
+[package.metadata.deb.systemd-units]
+unit-scripts = "debian/"
+enable = true
+start = false
+restart-after-upgrade = true
+
+[package.metadata.generate-rpm]
+summary = "Minimalist Git-based static site deployment orchestrator"
+description = """\
+Witryna is a minimalist Git-based static site deployment orchestrator. \
+It listens for webhook triggers, pulls Git repositories, runs \
+containerized build commands, and publishes static assets via atomic \
+symlink switching."""
+group = "Applications/Internet"
+release = "1"
+assets = [
+ { source = "target/release/witryna", dest = "/usr/bin/witryna", mode = "755" },
+ { source = "target/man/witryna.1", dest = "/usr/share/man/man1/witryna.1", mode = "644", doc = true },
+ { source = "man/witryna.toml.5", dest = "/usr/share/man/man5/witryna.toml.5", mode = "644", doc = true },
+ { source = "examples/witryna.toml", dest = "/etc/witryna/witryna.toml", mode = "644", config = "noreplace" },
+ { source = "debian/witryna.service", dest = "/usr/lib/systemd/system/witryna.service", mode = "644" },
+ { source = "README.md", dest = "/usr/share/doc/witryna/README.md", mode = "644", doc = true },
+ { source = "examples/hooks/caddy-deploy.sh", dest = "/usr/share/doc/witryna/examples/hooks/caddy-deploy.sh", mode = "755", doc = true },
+ { source = "examples/caddy/Caddyfile", dest = "/usr/share/doc/witryna/examples/caddy/Caddyfile", mode = "644", doc = true },
+ { source = "examples/nginx/witryna.conf", dest = "/usr/share/doc/witryna/examples/nginx/witryna.conf", mode = "644", doc = true },
+ { source = "examples/witryna.yaml", dest = "/usr/share/doc/witryna/examples/witryna.yaml", mode = "644", doc = true },
+ { source = "examples/systemd/docker.conf", dest = "/usr/share/doc/witryna/examples/systemd/docker.conf", mode = "644", doc = true },
+ { source = "examples/systemd/podman.conf", dest = "/usr/share/doc/witryna/examples/systemd/podman.conf", mode = "644", doc = true },
+]
+post_install_script = """\
+#!/bin/bash
+set -e
+# Create system user/group (idempotent)
+if ! getent group witryna >/dev/null 2>&1; then
+ groupadd --system witryna
+fi
+if ! getent passwd witryna >/dev/null 2>&1; then
+ useradd --system --gid witryna --no-create-home \
+ --home-dir /var/lib/witryna --shell /sbin/nologin witryna
+fi
+# Create data + log directories
+install -d -o witryna -g witryna -m 0755 /var/lib/witryna
+install -d -o witryna -g witryna -m 0755 /var/lib/witryna/clones
+install -d -o witryna -g witryna -m 0755 /var/lib/witryna/builds
+install -d -o witryna -g witryna -m 0755 /var/lib/witryna/cache
+install -d -o witryna -g witryna -m 0755 /var/log/witryna
+# Fix config permissions (root owns, witryna group can read)
+if [ -f /etc/witryna/witryna.toml ]; then
+ chown root:witryna /etc/witryna/witryna.toml
+ chmod 640 /etc/witryna/witryna.toml
+fi
+# Auto-detect and configure container runtime
+if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
+ if getent group docker >/dev/null; then
+ usermod -aG docker witryna || true
+ fi
+ mkdir -p /etc/systemd/system/witryna.service.d
+ cp /usr/share/doc/witryna/examples/systemd/docker.conf \
+ /etc/systemd/system/witryna.service.d/10-runtime.conf
+ chmod 644 /etc/systemd/system/witryna.service.d/10-runtime.conf
+ systemctl daemon-reload >/dev/null 2>&1 || true
+ echo "witryna: Docker detected and configured."
+elif command -v podman >/dev/null 2>&1 && podman info >/dev/null 2>&1; then
+ if ! grep -q "^witryna:" /etc/subuid 2>/dev/null; then
+ usermod --add-subuids 100000-165535 witryna || true
+ fi
+ if ! grep -q "^witryna:" /etc/subgid 2>/dev/null; then
+ usermod --add-subgids 100000-165535 witryna || true
+ fi
+ loginctl enable-linger witryna >/dev/null 2>&1 || true
+ mkdir -p /etc/systemd/system/witryna.service.d
+ cp /usr/share/doc/witryna/examples/systemd/podman.conf \
+ /etc/systemd/system/witryna.service.d/10-runtime.conf
+ chmod 644 /etc/systemd/system/witryna.service.d/10-runtime.conf
+ systemctl daemon-reload >/dev/null 2>&1 || true
+ echo "witryna: Podman detected and configured."
+else
+ echo "witryna: WARNING — no container runtime (docker/podman) detected."
+ echo " Install one, then reinstall this package or copy an override from"
+ echo " /usr/share/doc/witryna/examples/systemd/ manually."
+fi
+# Reload systemd
+systemctl daemon-reload >/dev/null 2>&1 || true
+# Enable (but don't start) on fresh install — matches deb behavior
+if [ "$1" -eq 1 ]; then
+ systemctl enable witryna.service >/dev/null 2>&1 || true
+fi"""
+pre_uninstall_script = """\
+#!/bin/bash
+if [ "$1" -eq 0 ]; then
+ systemctl stop witryna.service >/dev/null 2>&1 || true
+ systemctl disable witryna.service >/dev/null 2>&1 || true
+fi"""
+post_uninstall_script = """\
+#!/bin/bash
+if [ "$1" -eq 0 ]; then
+ # Remove user and group
+ userdel witryna >/dev/null 2>&1 || true
+ groupdel witryna >/dev/null 2>&1 || true
+ # Remove config directory and systemd overrides
+ rm -rf /etc/witryna
+ rm -rf /etc/systemd/system/witryna.service.d
+ loginctl disable-linger witryna >/dev/null 2>&1 || true
+ # /var/lib/witryna and /var/log/witryna left for manual cleanup
+ # Reload systemd
+ systemctl daemon-reload >/dev/null 2>&1 || true
+fi"""
+
+[package.metadata.generate-rpm.requires]
+systemd = "*"
+shadow-utils = "*"
+git = "*"
+
+[package.metadata.generate-rpm.recommends]
+podman = "*"