diff --git a/.gitignore b/.gitignore index fedaa2b..4c3aef9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ /target +/rpmbuild .env +deb/usr/local/bin/dispenser +rpm/usr/local/bin/dispenser +*.deb +*.rpm diff --git a/Cargo.lock b/Cargo.lock index 7048e39..a156419 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -134,7 +134,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] -name = "contpose" +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "dispenser" version = "0.1.0" dependencies = [ "base64", @@ -150,15 +159,6 @@ dependencies = [ "urlencoding", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_filter" version = "0.1.2" diff --git a/Cargo.toml b/Cargo.toml index 8de2055..05ec8b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "contpose" +name = "dispenser" version = "0.1.0" edition = "2021" license = "MIT" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..84c442f --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONY: build-deb build-rpm + +WORK_DIR=$(shell pwd) +TARGET_BIN=target/x86_64-unknown-linux-musl/release/dispenser +USR_BIN_DEB=deb/usr/local/bin/dispenser +USR_BIN_RPM=rpm/usr/local/bin/dispenser + +$(TARGET_BIN): + CARGO_TARGET_DIR="./target" cargo build --release --target "x86_64-unknown-linux-musl" + +$(USR_BIN_RPM): $(TARGET_BIN) + mkdir -p deb/usr/local/bin/ + mv $(TARGET_BIN) $(USR_BIN_RPM) + +$(USR_BIN_DEB): $(TARGET_BIN) + mkdir -p deb/usr/local/bin/ + mv $(TARGET_BIN) $(USR_BIN_DEB) + +build-deb: $(USR_BIN_DEB) + dpkg-deb --build deb + mv deb.deb dispenser.deb + +build-rpm: $(USR_BIN_RPM) + cp -r rpm/ rpmbuild + mkdir -p rpmbuild/opt/dispenser + rpmbuild --target=x86_64 --buildroot $(WORK_DIR)/rpmbuild \ + -bb rpmbuild/dispenser.spec diff --git a/README.md b/README.md index 3c9ba41..9de62a0 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,44 @@ -# Contpose - -I am not very good at naming things. This is the convination of Continuous and -Compose. +# Dispenser This tool manages Docker Compose instances by constantly looking for new versions of images to deploying seemlessly. -Contpose works as a daemon that runs in the background of the host server. +Dispenser works as a daemon that runs in the background of the host server. + +## Build + +### RPM (RHEL) + +To build rpm make sure you have the following installed: + +- `cargo`: Rust package manager and build tool +- `rustc`: Rust compiler +- `make`: Run make files +- `rpmbuild`: Tool to build RPMs + +Once these dependencies are installed run: + +``` +make build-rpm +``` + + +This should create a file called roughly `../dispenser-$VERSION.x86_64.rpm`. + +### Deb (Debian & Ubuntu) + +To build deb make sure you have the following installed: + +- `cargo`: Rust package manager and build tool +- `rustc`: Rust compiler +- `make`: Run make files +- `dpkg-dev`: Tool to build DEB files + +Once these dependencies are installed run: + +``` +make build-deb +``` -## Installing +This should create a file called roughly `./dispenser.deb`. -TODO diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control new file mode 100644 index 0000000..6153341 --- /dev/null +++ b/deb/DEBIAN/control @@ -0,0 +1,6 @@ +Package: dispenser +Version: 0.1 +Maintainer: ixpantia S.A. +Architecture: amd64 +Description: Continously Deploy services with Docker Compose +Depends: docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin, gnupg2, pass diff --git a/deb/DEBIAN/install b/deb/DEBIAN/install new file mode 100644 index 0000000..e69de29 diff --git a/deb/DEBIAN/postinst b/deb/DEBIAN/postinst new file mode 100755 index 0000000..f1671f6 --- /dev/null +++ b/deb/DEBIAN/postinst @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +# Create the 'dispenser' user and home directory if it doesn't exist +if ! id -u dispenser > /dev/null 2>&1; then + useradd -r -d /opt/dispenser -s /bin/bash dispenser + usermod -aG docker dispenser + mkdir -p /opt/dispenser + chown dispenser:dispenser /opt/dispenser +fi + +# Create the dispenser.toml file if it doesn't exist +if [ ! -f /opt/dispenser/dispenser.toml ]; then + echo "delay=60 # Will watch for updates every 60 seconds" >> /opt/dispenser/dispenser.toml + chown dispenser:dispenser /opt/dispenser/dispenser.toml +fi + +# Restart the service on upgrade +if [ "$1" = "configure" ]; then + systemctl daemon-reload || true + systemctl enable dispenser.service || true + systemctl start dispenser.service || true +fi diff --git a/deb/DEBIAN/postrm b/deb/DEBIAN/postrm new file mode 100755 index 0000000..003f9bf --- /dev/null +++ b/deb/DEBIAN/postrm @@ -0,0 +1,15 @@ +#!/bin/sh +set -e + +if [ "$1" = "purge" ]; then + systemctl daemon-reload || true + rm -f /lib/systemd/system/dispenser.service +fi + +rm -rf /usr/local/bin/dispenser + +if [ "$1" = "purge" ]; then + # Remove the dispenser user and its home directory + userdel -r dispenser || true + rm -rf /opt/dispenser +fi diff --git a/deb/DEBIAN/prerm b/deb/DEBIAN/prerm new file mode 100755 index 0000000..e258bc2 --- /dev/null +++ b/deb/DEBIAN/prerm @@ -0,0 +1,7 @@ +#!/bin/sh +set -e + +if [ "$1" = "remove" ]; then + systemctl stop dispenser.service || true + systemctl disable dispenser.service || true +fi diff --git a/deb/DEBIAN/rules b/deb/DEBIAN/rules new file mode 100755 index 0000000..65a7eea --- /dev/null +++ b/deb/DEBIAN/rules @@ -0,0 +1,9 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_installinit: + dh_installinit --restart-after-upgrade + dh_systemd_enable + dh_systemd_start diff --git a/deb/lib/systemd/system/dispenser.service b/deb/lib/systemd/system/dispenser.service new file mode 100644 index 0000000..4323f52 --- /dev/null +++ b/deb/lib/systemd/system/dispenser.service @@ -0,0 +1,17 @@ +[Unit] +Description=Compose Watcher +After=docker.service +BindsTo=docker.service +StartLimitIntervalSec=0 +[Service] +Type=simple +Restart=always +RestartSec=1 +User=dispenser +Environment="RUST_LOG=info" +ExecStart=/usr/local/bin/dispenser --config /opt/dispenser/dispenser.toml +ExecReload=/bin/kill -HUP $MAINPID +WorkingDirectory=/opt/dispenser + +[Install] +WantedBy=multi-user.target diff --git a/rpm/dispenser.spec b/rpm/dispenser.spec new file mode 100644 index 0000000..6f8ffd7 --- /dev/null +++ b/rpm/dispenser.spec @@ -0,0 +1,65 @@ +Name: dispenser +Version: 0.1 +Release: 0 +Summary: Continously Deploy services with Docker Compose +License: see /usr/share/doc/dispenser/copyright +Distribution: Debian +Group: Converted/unknown +Requires: docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin, gnupg2, pass + +%define _rpmdir ./ +%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm +%define _unpackaged_files_terminate_build 0 + +%post +#!/bin/sh +set -e + +# Create the 'dispenser' user and home directory if it doesn't exist +if ! id -u dispenser > /dev/null 2>&1; then + useradd -r -d /opt/dispenser -s /bin/bash dispenser + usermod -aG docker dispenser + mkdir -p /opt/dispenser + chown dispenser:dispenser /opt/dispenser +fi + +# Create the dispenser.toml file if it doesn't exist +if [ ! -f /opt/dispenser/dispenser.toml ]; then + echo "delay=60 # Will watch for updates every 60 seconds" >> /opt/dispenser/dispenser.toml + chown dispenser:dispenser /opt/dispenser/dispenser.toml +fi + +# Restart the service on upgrade +systemctl daemon-reload || true +systemctl enable dispenser.service || true +systemctl start dispenser.service || true + + +%preun +#!/bin/sh +set -e + +systemctl stop dispenser.service || true +systemctl disable dispenser.service || true + + +%postun +#!/bin/sh +set -e + +systemctl daemon-reload || true +rm -f /lib/systemd/system/dispenser.service + +rm -rf /usr/local/bin/dispenser + +# Remove the dispenser user and its home directory +userdel -r dispenser || true +rm -rf /opt/dispenser + + +%description + +%files +%dir "/opt/dispenser" +"/usr/lib/systemd/system/dispenser.service" +"/usr/local/bin/dispenser" diff --git a/rpm/usr/lib/systemd/system/dispenser.service b/rpm/usr/lib/systemd/system/dispenser.service new file mode 100644 index 0000000..4323f52 --- /dev/null +++ b/rpm/usr/lib/systemd/system/dispenser.service @@ -0,0 +1,17 @@ +[Unit] +Description=Compose Watcher +After=docker.service +BindsTo=docker.service +StartLimitIntervalSec=0 +[Service] +Type=simple +Restart=always +RestartSec=1 +User=dispenser +Environment="RUST_LOG=info" +ExecStart=/usr/local/bin/dispenser --config /opt/dispenser/dispenser.toml +ExecReload=/bin/kill -HUP $MAINPID +WorkingDirectory=/opt/dispenser + +[Install] +WantedBy=multi-user.target diff --git a/src/cli.rs b/src/cli.rs index 389f5c9..63802db 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -7,7 +7,7 @@ use clap::Parser; #[command(version, about, long_about = None)] pub struct Args { /// Path to the config file. - #[arg(short, long, default_value = "contpose.toml")] + #[arg(short, long, default_value = "dispenser.toml")] pub config: PathBuf, } diff --git a/src/login.rs b/src/login.rs index e75801e..fe76d77 100644 --- a/src/login.rs +++ b/src/login.rs @@ -1,5 +1,3 @@ -// cat ~/my_password.txt | docker login --username foo --password-stdin - use base64::Engine; use std::collections::HashMap; use std::env;