Add debian package configuration for deployment

This commit is contained in:
notplants 2021-05-19 14:14:26 +02:00
parent 5b7112645b
commit 88cc73eb2c
9 changed files with 60 additions and 12 deletions

View File

@ -32,5 +32,7 @@ maintainer-scripts="debian"
systemd-units = { unit-name = "peach-dyndns-server" }
assets = [
["target/release/peach-dyndns-server", "usr/bin/", "755"],
]
["debian/reloadbind", "usr/bin/", "755"],
["debian/bindctl", "/etc/sudoers.d/bindctl", "655"],
["templates/*", "/srv/peachcloud/peach-dyndns-server/prod-peach-dyndns/templates/", "644"],
]

View File

@ -4,23 +4,31 @@ a dynamic DNS server to host the names of guests with changing IP addresses
by providing an http API for updating bind9 configurations.
## setup
## Setup
The code in this repo assumes the existence of an installed and running bind9 server on the same
server as is running peach-dyndns-server. Documentation for setting up bind9 can be found [here](docs/setup-bind-for-peach-dyndns.md).
The peach-dyndns-server code can be compiled with
```
cargo build --release
cargo deb; sudo dpkg -i target/debian/peach-dyndns-server_0.1.0_amd64.deb
```
## run
## Development
```
sudo su peach-dyndns; ./target/release/main -vv
```
## test
## Prod Deployment
prod is deployed to /srv/peachcloud/peach-dyndns-server/prod-peach-dyndns
## Staging Deployment
staging is deployed to /srv/peachcloud/peach-dyndns-server/dev-peach-dyndns
## Test
test peach-dyndns server is running,
```

12
debian/bindctl vendored Normal file
View File

@ -0,0 +1,12 @@
#
# Allow peach-dyndns to reload bind as sudo
#
# User alias for bind-ctl which can reload bind
User_Alias BIND_CTRL = peach-dyndns
# Command alias for reboot and shutdown
Cmnd_Alias RELOADBIND = /usr/bin/reloadbind
# Allow BIND_CTRL users to execute RELOADBIND command without password
BIND_CTRL ALL=(ALL) NOPASSWD: RELOADBIND

View File

@ -6,7 +6,9 @@ Type=simple
User=peach-dyndns
Group=bind
Environment="RUST_LOG=info"
ExecStart=/usr/bin/peach-dyndns-server
Environment="ROCKET_PORT=3002"
WorkingDirectory=/srv/peachcloud/peach-dyndns-server/prod-peach-dyndns
ExecStart=/usr/bin/peach-dyndns-server -vv
Restart=always
[Install]

15
debian/postinst vendored Normal file
View File

@ -0,0 +1,15 @@
#!/bin/sh
set -e
# create user which peach-dyndns-server runs as
adduser --quiet --system peach-dyndns
# add user to bind group
usermod -a -G bind peach-dyndns
# set permissions
chown peach-dyndns /usr/bin/peach-dyndns-server
chown peach-dyndns /usr/bin/reloadbind
# cargo deb automatically replaces this token below, see https://github.com/mmstick/cargo-deb/blob/master/systemd.md
#DEBHELPER#

2
debian/reloadbind vendored Normal file
View File

@ -0,0 +1,2 @@
#!/usr/bin/env bash
/bin/systemctl reload bind9

7
deploy_prod.sh Normal file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# this script rebuilds the peach-dyndns-server for prod deployment using the dev folder as the source repo
cd /srv/peachcloud/peach-dyndns-server/dev-peach-dyndns
cargo deb
sudo dpkg -i target/debian/peach-dyndns-server_0.1.0_amd64.deb
sudo systemctl restart peach-dyndns-server
sudo systemctl restart nginx

View File

@ -131,7 +131,7 @@ pub fn generate_zone(full_domain: &str) -> Result<String, PeachDynError> {
// we use the /etc/sudoers.d/bindctl to allow peach-dyndns user to restart bind as sudo without entering a password
// using a binary at /bin/reloadbind which runs 'systemctl reload bind9'
let status = Command::new("sudo")
.arg("/bin/reloadbind")
.arg("/usr/bin/reloadbind")
.status().expect("error restarting bind9");
if !status.success() {
return Err(PeachDynError::BindConfigurationError("There was an error in the bind configuration".to_string()));

View File

@ -4,8 +4,7 @@
extern crate rocket;
use crate::routes::{index, register_domain, check_available};
use rocket::Config;
use rocket::figment::{Figment, Profile, providers::{Format, Toml, Serialized, Env}};
use rocket::figment::{Figment, providers::{Format, Toml, Env}};
mod cli;
mod routes;
@ -18,9 +17,10 @@ async fn main() {
let _args = cli::args().expect("error parsing args");
// the following config says to use all default rocket configs
// and then override them with any configs specified in Rocket.toml
// and then override them with any configs specified in Rocket.toml if found
// and then override with any configs specified as env variables prefixed with APP_
let config = Figment::from(rocket::Config::default())
.merge(Toml::file("Rocket.toml").nested());
.merge(Toml::file("Rocket.toml").nested()).merge(Env::prefixed("ROCKET_").global());
let rocket_result = rocket::custom(config)
.mount("/", routes![index, register_domain, check_available])