D11.4 Podman + systemd (Quadlets) ⚙️

Γιατί systemd;

Πρόβλημα χωρίς systemd:
  Reboot → rootless containers ΔΕΝ ξεκινούν αυτόματα!
  (δεν υπάρχει Docker daemon για auto-restart)

Λύση 1: podman generate systemd (παλιό)
Λύση 2: Quadlets (Podman 4.4+, ΠΡΟΤΕΙΝΕΤΑΙ)

Quadlets — Container as systemd unit

Τα Quadlets είναι αρχεία .container που ο Podman μετατρέπει αυτόματα σε systemd units:

tasks:

  # ── Δημιουργία quadlet directory ──────────
  - name: Quadlet directory (rootless)
    ansible.builtin.file:
      path:  "/home/{{ podman_user }}/.config/containers/systemd"
      state: directory
      owner: "{{ podman_user }}"
      mode:  '0755'

  # ── Nginx quadlet ─────────────────────────
  - name: "⚙️ Nginx quadlet"
    ansible.builtin.copy:
      dest:  "/home/{{ podman_user }}/.config/containers/systemd/nginx.container"
      owner: "{{ podman_user }}"
      mode:  '0644'
      content: |
        [Unit]
        Description=Nginx web server
        After=network-online.target

        [Container]
        Image=nginx:1.25-alpine
        PublishPort=8080:80
        Volume=/home/{{ podman_user }}/html:/usr/share/nginx/html:ro,Z
        Environment=TZ=Europe/Athens
        SecurityLabelDisable=false
        ReadOnly=true
        Tmpfs=/tmp:size=32m
        Tmpfs=/var/cache/nginx:size=128m
        Tmpfs=/var/run:size=16m

        [Service]
        Restart=always
        TimeoutStartSec=30

        [Install]
        WantedBy=default.target    # ← rootless: default.target
    notify: Reload systemd (user)

  # ── App quadlet ───────────────────────────
  - name: "⚙️ App quadlet"
    ansible.builtin.template:
      src:   templates/myapp.container.j2
      dest:  "/home/{{ podman_user }}/.config/containers/systemd/myapp.container"
      owner: "{{ podman_user }}"
      mode:  '0644'
    notify: Reload systemd (user)

  # ── Enable & start ────────────────────────
  - name: "▶️ Start quadlet services"
    ansible.builtin.systemd:
      name:    "{{ item }}"
      state:   started
      enabled: true
      scope:   user    # ← user scope!
    loop:
      - nginx
      - myapp
    become:       true
    become_user:  "{{ podman_user }}"
    environment:
      XDG_RUNTIME_DIR: "/run/user/{{ podman_uid }}"

handlers:

  - name: Reload systemd (user)
    ansible.builtin.command:
      cmd: "systemctl --user daemon-reload"
    become:      true
    become_user: "{{ podman_user }}"
    environment:
      XDG_RUNTIME_DIR: "/run/user/{{ podman_uid }}"

Quadlet template

# templates/myapp.container.j2
[Unit]
Description=MyApp
After=network-online.target

[Container]
Image=myapp:{{ app_version }}
Network=myapp_net.network
Volume=app_data.volume:/app/data:Z
Environment=NODE_ENV=production
Secret=app_secret_key,type=mount,target=/run/secrets/secret_key
ReadOnly=true
Tmpfs=/tmp:size=64m

[Service]
Restart=always
RestartSec=5s
TimeoutStartSec=60

[Install]
WantedBy=default.target

Σύνοψη D11.4

Podman + systemd Quadlets
│
├── Αρχεία: ~/.config/containers/systemd/*.container
├── Systemd: systemctl --user start nginx
├── Auto-start: loginctl enable-linger
└── Quadlet format:
    [Container] Image, Port, Volume, Env, Secret
    [Service]   Restart=always
    [Install]   WantedBy=default.target