# unitdore > *A door you open and close for container units.* Unitdore bridges your container runtime (Podman, Docker) and systemd. It discovers running containers and podman-compose stacks, stores them in a config file, and generates + manages systemd `.service` units for each one. ## Install **Arch Linux (AUR)** ```bash yay -S unitdore ``` **Debian / Ubuntu** Download the `.deb` from the [releases page](https://git.warky.dev/wdevs/unitdore/releases) and install: ```bash sudo dpkg -i unitdore_*.deb ``` **CentOS / AlmaLinux / Rocky Linux** Download the `.rpm` from the [releases page](https://git.warky.dev/wdevs/unitdore/releases) and install: ```bash sudo rpm -i unitdore-*.rpm # or with dnf: sudo dnf install unitdore-*.rpm ``` **From source** ```bash make build sudo make install ``` Or manually: ```bash go build -o unitdore . sudo cp unitdore /usr/local/bin/ ``` ## Usage ### Discover running containers ```bash sudo unitdore syncup ``` Queries Podman and Docker for running containers, adds new ones to the config, and reconciles any that have disappeared (marking them disabled). - Podman first; Docker only for names Podman doesn't have - podman-compose containers → one `kind: stack` unit per project; existing member units disabled (`part of stack `) - Root: root's containers + rootless Podman containers of each user in `users:` - Normal user: own Podman containers, config `~/.config/unitdore/units.yaml`, user units only ### Edit the config ```bash sudo unitdore edit ``` Opens `/etc/unitdore/units.yaml` in `$EDITOR` (falls back to `vi`). ### Install systemd unit files ```bash sudo unitdore install ``` Generates `.service` files for all enabled units and writes them to systemd. Use `--dry-run` to preview without writing. ```bash sudo unitdore install --dry-run ``` ### Enable and start units ```bash sudo unitdore active ``` Runs `systemctl enable --now` for all installed, enabled units in startup order. ### Check status ```bash sudo unitdore status ``` Prints a summary table: ``` NAME RUNTIME USER ENABLED INSTALLED STATE REASON nginx podman root yes yes active myapp docker hein yes yes active oldthing podman hein no no — container not found ``` ## Config file **Location:** `/etc/unitdore/units.yaml` ```yaml prefix: "" # optional: prepended to all service names, e.g. "prod-" suffix: "" # optional: appended to all service names, e.g. "-svc" users: [hein] # root only: rootless users scanned by syncup units: - name: nginx runtime: podman # podman | docker user: "" # empty = root/system unit command: "" # optional: override ExecStart entirely order: 1 # startup order (lower = earlier) delay: 0s # delay after previous order group enabled: true disabled_reason: "" # auto-set by syncup reconciliation - name: myapp runtime: docker user: hein # rootless: generates user unit for this user order: 2 delay: 5s enabled: true - name: shop # = compose project name kind: stack # container (default) | stack runtime: podman user: hein project: shop working_dir: /srv/shop # from compose labels (refreshed by syncup) compose_files: [compose.yaml] compose_bin: /usr/bin/podman-compose order: 3 enabled: true - name: backup # shell script unit runtime: script script: /opt/scripts/backup.sh # required stop_script: /opt/scripts/stop.sh # optional → ExecStop shell: /bin/bash # optional, default /bin/bash service_type: simple # simple (default) | oneshot working_dir: /opt/scripts # optional order: 4 enabled: true - name: agent # executable unit runtime: exec executable: /opt/agent/bin/agent # required args: [--config, /etc/agent.toml] # optional stop_executable: /opt/agent/bin/stop # optional → ExecStop order: 5 enabled: true ``` ### Script / executable units Added manually (`unitdore edit`); syncup never creates or disables them. | Key | Runtime | Meaning | |---|---|---| | `script` | script | Required. `ExecStart=