tanshu 060173db5e Run Caddy as a rootless Podman Quadlet
Replaces the docker_container role with Quadlet systemd user units under
~/.config/containers/systemd, and moves state from /var/lib/caddy to
~/podman-data/caddy.

Caddy is now the base unit and no longer lists its upstream networks. Each
service registers itself by writing its own <name>.network unit plus a drop-in
into caddy.container.d/, so adding or removing a service never means editing the
Caddy playbook. Drop-ins are used rather than blockinfile because this playbook
re-templates caddy.container on every run, which would wipe appended blocks.

The play runs as the connecting user instead of using become: the rootless units
belong to it, so the connection's PAM session is what makes systemctl --user
work without setting XDG_RUNTIME_DIR. podman_user and the data directory are
derived from facts, so the play fails loudly if that resolves to root.

Two things that bit us and are worth keeping:

- The privileged-port sysctl is applied inline with sysctl -w, not via a
  handler. Handlers only run at the end of the play, by which point Caddy has
  already failed to bind 80/443.
- The Caddyfile is seeded with a minimal valid config. Caddy exits 1 with a
  bare "EOF" on an empty config file, so touching it into existence made the
  service crash-loop.
2026-10-15 22:12:29 +05:30
2025-07-31 11:14:47 +00:00
2024-09-19 06:49:59 +05:30
2020-10-17 12:29:51 +05:30
2024-12-17 17:52:46 +05:30
2020-05-04 17:05:08 +05:30
2026-08-29 12:31:09 +00:00
2024-09-19 06:49:39 +05:30
2025-07-31 11:11:27 +00:00
2020-10-17 12:28:36 +05:30
2024-05-27 13:25:44 +05:30
2026-09-21 14:09:22 +00:00
2020-04-20 18:13:06 +05:30
2025-07-31 11:12:18 +00:00
2020-05-04 17:04:48 +05:30
2023-01-02 12:23:38 +05:30
2026-10-15 21:24:32 +05:30
2026-10-15 16:06:49 +00:00
2026-10-15 16:04:41 +00:00

Ansible Playbooks

A collection of minimalist Ansible playbooks for automating server setups, based on DigitalOcean's Community guides.

*the Initial Server Setup should be your starting point for fresh servers.

Playbook Structure

The playbooks contained in this repository were created for educational purposes, and should serve as a base for you to create your own playbooks and roles.

Although we opt to not use roles, our playbooks follow a distinctive structure to facilitate reuse while keeping them mostly self-contained and straightforward.

For instance, this is how the lemp playbook is structured:

lemp_ubuntu1804
├── files
│   ├── info.php.j2
│   └── nginx.conf.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md
  • files/: directory containing templates and other files required by the playbook.
  • vars/: directory to save variable files. A default.yml var file is included by default.
  • playbook.yml: the playbook file.
  • readme.md: instructions and links related to this playbook.

Getting Started

To set up your Ansible environment, please follow our guide on How to Install and Configure Ansible on Ubuntu 18.04.

Connection Test

From your local machine or Ansible control node, run:

ansible all -m ping -u remote_user

If you're able to get a "pong" reply back from your node(s), your setup works as expected and you'll be able to run both ad-hoc commands and playbooks on your nodes, using Ansible.

Guides

The following guides cover how to use the playbooks you'll find in this repository.

Initial Server Setup

Once you have executed the initial server setup, you can choose from any of the available server setup playbooks:

Web Servers

Applications & CMSs

Containers & K8s

S
Description
Ansible playbooks for Digital Ocean host
Readme
733 KiB
0 Stars 1 Watchers 0 Forks
Languages
Jinja 58%
Shell 32.9%
JavaScript 6.1%
Dockerfile 1.7%
Makefile 1.3%