Add Debian packaging support with configurable binding
- Add complete debian/ packaging structure for .deb creation - Support BIND_ADDR environment variable (defaults to 0.0.0.0) - Create /etc/default/naas config file (defaults to localhost binding) - Systemd service reads from /etc/default/naas - Package installs but does not auto-enable service - Upgrades restart service only if already enabled - Proper user creation and cleanup on install/remove Key files: - debian/control: Package metadata with rustup build dependency support - debian/naas.default: Configuration template for /etc/default/naas - debian/naas.service: Updated systemd service with EnvironmentFile - debian/postinst: Creates naas user, restarts on upgrade if enabled - debian/prerm: Stops service on removal - debian/postrm: Cleans up user on purge - src/main.rs: Added BIND_ADDR support for configurable binding 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
ebd0fcc448
commit
57628d940d
11 changed files with 182 additions and 1 deletions
10
debian/changelog
vendored
Normal file
10
debian/changelog
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
naas (1.0.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Initial release of NaaS (No as a Service)
|
||||||
|
* HTTP service that always responds with "no"
|
||||||
|
* Multiple response formats: text, JSON, XML, YAML, boolean
|
||||||
|
* Minimalist web frontend and interactive playground
|
||||||
|
* Health check endpoint
|
||||||
|
* Systemd service integration
|
||||||
|
|
||||||
|
-- Ole-Morten Duesund <olemd@glemt.net> Fri, 27 Sep 2024 15:00:00 +0200
|
||||||
26
debian/control
vendored
Normal file
26
debian/control
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
Source: naas
|
||||||
|
Section: net
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Ole-Morten Duesund <olemd@glemt.net>
|
||||||
|
Build-Depends: debhelper-compat (= 13), cargo | rustup, rustc | rustup
|
||||||
|
Standards-Version: 4.6.0
|
||||||
|
Homepage: https://kode.naiv.no/naas
|
||||||
|
Vcs-Git: https://kode.naiv.no/naas.git
|
||||||
|
Vcs-Browser: https://kode.naiv.no/naas
|
||||||
|
|
||||||
|
Package: naas
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}, systemd
|
||||||
|
Description: No as a Service - HTTP service that always says "no"
|
||||||
|
NaaS (No as a Service) is a lightweight HTTP service written in pure Rust
|
||||||
|
that always responds with "no" in various formats including plain text,
|
||||||
|
JSON, XML, YAML, and boolean.
|
||||||
|
.
|
||||||
|
Features include:
|
||||||
|
- Minimal dependencies (pure Rust, standard library only)
|
||||||
|
- Multiple response formats
|
||||||
|
- Mobile-responsive web frontend
|
||||||
|
- CORS support
|
||||||
|
- Health check endpoint
|
||||||
|
- Optimized for small binary size (~1MB)
|
||||||
|
- Container-ready with health checks
|
||||||
12
debian/naas.default
vendored
Normal file
12
debian/naas.default
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Configuration for NaaS (No as a Service)
|
||||||
|
# This file is sourced by the systemd service
|
||||||
|
|
||||||
|
# Port to listen on (default: 8080)
|
||||||
|
PORT=8080
|
||||||
|
|
||||||
|
# Bind address (default: 127.0.0.1 for localhost only)
|
||||||
|
# Use 0.0.0.0 to listen on all interfaces
|
||||||
|
BIND_ADDR=127.0.0.1
|
||||||
|
|
||||||
|
# Additional options can be added here as needed
|
||||||
|
# RUST_LOG=info
|
||||||
1
debian/naas.install
vendored
Normal file
1
debian/naas.install
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
target/release/naas usr/bin/
|
||||||
34
debian/naas.service
vendored
Normal file
34
debian/naas.service
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[Unit]
|
||||||
|
Description=No as a Service (NaaS)
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
TimeoutStopSec=30
|
||||||
|
|
||||||
|
# User configuration
|
||||||
|
User=naas
|
||||||
|
Group=naas
|
||||||
|
|
||||||
|
# Load configuration from /etc/default/naas
|
||||||
|
EnvironmentFile=-/etc/default/naas
|
||||||
|
|
||||||
|
# Binary execution
|
||||||
|
ExecStart=/usr/bin/naas
|
||||||
|
|
||||||
|
# Security settings
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
ProtectHome=true
|
||||||
|
ReadWritePaths=
|
||||||
|
|
||||||
|
# Resource limits
|
||||||
|
MemoryLimit=256M
|
||||||
|
CPUQuota=50%
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
31
debian/postinst
vendored
Executable file
31
debian/postinst
vendored
Executable file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
configure)
|
||||||
|
# Create naas user if it doesn't exist
|
||||||
|
if ! getent passwd naas >/dev/null; then
|
||||||
|
adduser --system --group --no-create-home \
|
||||||
|
--disabled-password --disabled-login \
|
||||||
|
--shell /bin/false naas
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reload systemd daemon to pick up new service file
|
||||||
|
if [ -d /run/systemd/system ]; then
|
||||||
|
systemctl daemon-reload || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# On upgrade, restart the service if it's already enabled
|
||||||
|
if [ -n "$2" ] && [ -d /run/systemd/system ]; then
|
||||||
|
if systemctl is-enabled naas >/dev/null 2>&1; then
|
||||||
|
echo "Restarting naas service..."
|
||||||
|
systemctl restart naas || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
||||||
27
debian/postrm
vendored
Executable file
27
debian/postrm
vendored
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
purge)
|
||||||
|
# Remove naas user on purge (only if package is completely removed)
|
||||||
|
if getent passwd naas >/dev/null; then
|
||||||
|
deluser --system naas 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reload systemd daemon
|
||||||
|
if [ -d /run/systemd/system ]; then
|
||||||
|
systemctl daemon-reload || true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
remove)
|
||||||
|
# Reload systemd daemon to remove service
|
||||||
|
if [ -d /run/systemd/system ]; then
|
||||||
|
systemctl daemon-reload || true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
||||||
18
debian/prerm
vendored
Executable file
18
debian/prerm
vendored
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
remove|deconfigure)
|
||||||
|
# Stop the service if it's running
|
||||||
|
if [ -d /run/systemd/system ]; then
|
||||||
|
if systemctl is-active naas >/dev/null 2>&1; then
|
||||||
|
systemctl stop naas || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
||||||
20
debian/rules
vendored
Executable file
20
debian/rules
vendored
Executable file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
||||||
|
|
||||||
|
override_dh_auto_build:
|
||||||
|
cargo build --release
|
||||||
|
|
||||||
|
override_dh_auto_test:
|
||||||
|
cargo test
|
||||||
|
|
||||||
|
override_dh_auto_clean:
|
||||||
|
cargo clean || true
|
||||||
|
|
||||||
|
override_dh_auto_install:
|
||||||
|
dh_auto_install
|
||||||
|
# Install config file
|
||||||
|
install -D -m 644 debian/naas.default debian/naas/etc/default/naas
|
||||||
|
# Install systemd service
|
||||||
|
install -D -m 644 debian/naas.service debian/naas/lib/systemd/system/naas.service
|
||||||
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
3.0 (native)
|
||||||
|
|
@ -330,7 +330,8 @@ const PLAYGROUND_FRONTEND: &str = r#"<!DOCTYPE html>
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
||||||
let addr = format!("0.0.0.0:{}", port);
|
let bind_addr = std::env::var("BIND_ADDR").unwrap_or_else(|_| "0.0.0.0".to_string());
|
||||||
|
let addr = format!("{}:{}", bind_addr, port);
|
||||||
|
|
||||||
let listener = TcpListener::bind(&addr).expect("Failed to bind to address");
|
let listener = TcpListener::bind(&addr).expect("Failed to bind to address");
|
||||||
println!("No as a Service running on http://{}", addr);
|
println!("No as a Service running on http://{}", addr);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue