[Unit] Description=Witryna - Git-based static site deployment orchestrator Documentation=man:witryna(1) man:witryna.toml(5) After=network-online.target Wants=network-online.target [Service] Type=simple User=witryna Group=witryna # Start the deployment server ExecStart=/usr/bin/witryna serve --config /etc/witryna/witryna.toml ExecReload=/bin/kill -HUP $MAINPID # Environment Environment="RUST_LOG=info" # Restart policy Restart=on-failure RestartSec=5 StartLimitBurst=3 StartLimitIntervalSec=60 # Security hardening NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectKernelTunables=yes ProtectKernelModules=yes ProtectControlGroups=yes RestrictNamespaces=yes RestrictRealtime=yes RestrictSUIDSGID=yes LockPersonality=yes MemoryDenyWriteExecute=yes # Note: ProtectHome=yes is NOT set because it hides /run/user/, # which is required for rootless Podman. The witryna user's home is # /var/lib/witryna (covered by ReadWritePaths), not /home. # Allow read/write to witryna directories ReadWritePaths=/var/lib/witryna ReadWritePaths=/var/log/witryna # Allow access to container runtime directories # For Podman (rootless): needs /run/user/ for XDG_RUNTIME_DIR ReadWritePaths=/run/user # For Docker: # SupplementaryGroups=docker # ReadWritePaths=/var/run/docker.sock # Capabilities (minimal for container runtime access) CapabilityBoundingSet= AmbientCapabilities= # Resource limits LimitNOFILE=65536 LimitNPROC=4096 [Install] WantedBy=multi-user.target