systemd_container.yml (3697B)
1 --- 2 # Rootless podman + package units: 3 # 1) sandbox → CAP_SYS_ADMIN / 217 USER 4 # 2) socket activation → ignores SERVE=tcp PORT=9011 5 # Fix: drop sandbox, mask .socket, install TCP-only httpd unit override. 6 7 - name: Ensure runtime dirs for exchange 8 ansible.builtin.file: 9 path: "{{ item.path }}" 10 state: directory 11 mode: "0755" 12 owner: "{{ item.owner }}" 13 group: "{{ item.group }}" 14 loop: 15 - { path: /run/taler-exchange, owner: root, group: root } 16 - { path: /run/taler-exchange/httpd, owner: taler-exchange-httpd, group: taler-exchange-secmod } 17 - { path: /run/taler-exchange/secmod-rsa, owner: taler-exchange-secmod-rsa, group: taler-exchange-secmod } 18 - { path: /run/taler-exchange/secmod-cs, owner: taler-exchange-secmod-cs, group: taler-exchange-secmod } 19 - { path: /run/taler-exchange/secmod-eddsa, owner: taler-exchange-secmod-eddsa, group: taler-exchange-secmod } 20 failed_when: false 21 22 - name: Ensure drop-in directories for helper units 23 ansible.builtin.file: 24 path: "/etc/systemd/system/{{ item }}.service.d" 25 state: directory 26 mode: "0755" 27 loop: 28 - taler-exchange-secmod-rsa 29 - taler-exchange-secmod-cs 30 - taler-exchange-secmod-eddsa 31 - taler-exchange-aggregator 32 - taler-exchange-closer 33 - taler-exchange-wirewatch 34 - taler-exchange-transfer 35 - taler-exchange-expire 36 37 - name: Install container-friendly drop-ins for helper units 38 ansible.builtin.copy: 39 dest: "/etc/systemd/system/{{ item }}.service.d/container.conf" 40 owner: root 41 group: root 42 mode: "0644" 43 content: | 44 [Service] 45 PrivateTmp=no 46 PrivateDevices=no 47 ProtectSystem=no 48 ProtectHome=no 49 ProtectKernelTunables=no 50 ProtectControlGroups=no 51 ProtectKernelModules=no 52 ProtectHostname=no 53 ProtectClock=no 54 RestrictNamespaces=no 55 NoNewPrivileges=no 56 AmbientCapabilities= 57 CapabilityBoundingSet= 58 loop: 59 - taler-exchange-secmod-rsa 60 - taler-exchange-secmod-cs 61 - taler-exchange-secmod-eddsa 62 - taler-exchange-aggregator 63 - taler-exchange-closer 64 - taler-exchange-wirewatch 65 - taler-exchange-transfer 66 - taler-exchange-expire 67 68 - name: Mask package socket unit (forces TCP SERVE, not unix sock) 69 ansible.builtin.systemd: 70 name: taler-exchange-httpd.socket 71 masked: true 72 state: stopped 73 enabled: false 74 failed_when: false 75 76 - name: Install TCP-only httpd unit override (no socket Requires) 77 ansible.builtin.copy: 78 dest: /etc/systemd/system/taler-exchange-httpd.service 79 owner: root 80 group: root 81 mode: "0644" 82 content: | 83 [Unit] 84 Description=GNU Taler payment system exchange REST API (container TCP) 85 AssertPathExists=/etc/taler-exchange/taler-exchange.conf 86 Requires=taler-exchange-secmod-cs.service taler-exchange-secmod-rsa.service taler-exchange-secmod-eddsa.service 87 After=postgresql.service network.target taler-exchange-secmod-cs.service taler-exchange-secmod-rsa.service taler-exchange-secmod-eddsa.service 88 PartOf=taler-exchange.target 89 90 [Service] 91 User=taler-exchange-httpd 92 Type=simple 93 EnvironmentFile=-/etc/taler-exchange/taler-exchange.env 94 Restart=always 95 RestartMode=direct 96 RestartSec=1ms 97 StartLimitBurst=5 98 StartLimitInterval=5s 99 ExecStart=/usr/bin/taler-exchange-httpd -c /etc/taler-exchange/taler-exchange.conf -L INFO 100 StandardOutput=journal 101 StandardError=journal 102 PrivateTmp=no 103 PrivateDevices=no 104 ProtectSystem=no 105 Slice=taler-exchange.slice 106 107 [Install] 108 WantedBy=multi-user.target 109 110 - name: Reload systemd after unit changes 111 ansible.builtin.systemd: 112 daemon_reload: true