certbot cannot issue for internal hostnames (*.nas.local), which made nginx-enabled services with internal names fail on deploy. Add a <service>_nginx_letsencrypt flag (default false) and computed <service>_nginx_ssl_certificate/_key paths: when off the vhost uses the shared self-signed cert (nginx_default_ssl_cert), when on it uses the Let's Encrypt lineage. Gate the certbot include on the flag and apply the pattern to all service roles (deluge, fdroid, gitea, grafana, immich, metabase, ntfy, prowlarr, radarr, seerr, static_web, uptime_kuma).
168 lines
5.2 KiB
YAML
168 lines
5.2 KiB
YAML
---
|
|
- name: Validate required passwords are set
|
|
ansible.builtin.assert:
|
|
that:
|
|
- gitea_postgres_password is defined
|
|
- gitea_postgres_password | length >= 12
|
|
fail_msg: |
|
|
gitea_postgres_password is required (min 12 chars).
|
|
See roles/gitea/defaults/main.yml for configuration instructions.
|
|
success_msg: "Password validation passed"
|
|
|
|
- name: Create PostgreSQL user for Gitea
|
|
community.postgresql.postgresql_user:
|
|
name: "{{ gitea_postgres_user }}"
|
|
password: "{{ gitea_postgres_password }}"
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user }}"
|
|
|
|
- name: Create PostgreSQL database for Gitea
|
|
community.postgresql.postgresql_db:
|
|
name: "{{ gitea_postgres_db_name }}"
|
|
owner: "{{ gitea_postgres_user }}"
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user }}"
|
|
|
|
- name: Grant all privileges on database to Gitea user
|
|
community.postgresql.postgresql_privs:
|
|
login_db: "{{ gitea_postgres_db_name }}"
|
|
roles: "{{ gitea_postgres_user }}"
|
|
type: database
|
|
privs: ALL
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user }}"
|
|
|
|
- name: Ensure Gitea user has no superuser privileges
|
|
community.postgresql.postgresql_user:
|
|
name: "{{ gitea_postgres_user }}"
|
|
role_attr_flags: NOSUPERUSER,NOCREATEDB,NOCREATEROLE
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user | default('postgres') }}"
|
|
|
|
- name: Create PostgreSQL schema for Gitea
|
|
community.postgresql.postgresql_schema:
|
|
name: "{{ gitea_postgres_schema }}"
|
|
database: "{{ gitea_postgres_db_name }}"
|
|
owner: "{{ gitea_postgres_user }}"
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user | default('postgres') }}"
|
|
|
|
- name: Grant schema permissions to Gitea user
|
|
community.postgresql.postgresql_privs:
|
|
login_db: "{{ gitea_postgres_db_name }}"
|
|
roles: "{{ gitea_postgres_user }}"
|
|
type: schema
|
|
objs: "{{ gitea_postgres_schema }}"
|
|
privs: CREATE,USAGE
|
|
state: present
|
|
become: false
|
|
become_user: "{{ postgres_admin_user | default('postgres') }}"
|
|
|
|
- name: Create Gitea project directory
|
|
ansible.builtin.file:
|
|
path: "{{ podman_projects_dir | default('/opt/podman') }}/gitea"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
|
|
- name: Create Gitea data directory
|
|
ansible.builtin.file:
|
|
path: "{{ gitea_data_dir }}"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
|
|
- name: Get current gitea image ID
|
|
ansible.builtin.command: "podman image inspect --format {% raw %}{{.Id}}{% endraw %} {{ gitea_image }}:{{ gitea_version }}"
|
|
register: gitea_image_id_before
|
|
failed_when: false # image may not exist yet on first deploy
|
|
changed_when: false
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Pull Gitea container image
|
|
ansible.builtin.command: "podman pull --quiet {{ gitea_image }}:{{ gitea_version }}"
|
|
register: pull_result
|
|
changed_when: pull_result.stdout != gitea_image_id_before.stdout
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
notify: Restart gitea
|
|
|
|
- name: Deploy Kubernetes YAML for Gitea
|
|
ansible.builtin.template:
|
|
src: gitea.yaml.j2
|
|
dest: "{{ podman_projects_dir | default('/opt/podman') }}/gitea/gitea.yaml"
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0600"
|
|
notify: Restart gitea
|
|
|
|
- name: Get home directory for {{ ansible_user }}
|
|
ansible.builtin.getent:
|
|
database: passwd
|
|
key: "{{ ansible_user }}"
|
|
|
|
- name: Set user home directory fact
|
|
ansible.builtin.set_fact:
|
|
user_home_dir: "{{ ansible_facts['getent_passwd'][ansible_user][4] }}"
|
|
|
|
- name: Create systemd user directory for Gitea
|
|
ansible.builtin.file:
|
|
path: "{{ user_home_dir }}/.config/systemd/user"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
|
|
- name: Create systemd service for Gitea (user scope)
|
|
ansible.builtin.template:
|
|
src: gitea.service.j2
|
|
dest: "{{ user_home_dir }}/.config/systemd/user/gitea.service"
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0644"
|
|
notify: Reload systemd user
|
|
|
|
- name: Enable lingering for user {{ ansible_user }}
|
|
ansible.builtin.command: "loginctl enable-linger {{ ansible_user }}"
|
|
when: ansible_user != 'root'
|
|
|
|
- name: Enable and start Gitea service (user scope)
|
|
ansible.builtin.systemd:
|
|
name: gitea.service
|
|
enabled: true
|
|
state: started
|
|
scope: user
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Provision TLS certificate for Gitea
|
|
ansible.builtin.include_tasks: "{{ role_path }}/../nginx/tasks/certbot.yml"
|
|
vars:
|
|
certbot_hostname: "{{ gitea_nginx_hostname }}"
|
|
when: gitea_nginx_enabled and gitea_nginx_letsencrypt
|
|
|
|
- name: Deploy nginx vhost configuration for Gitea
|
|
ansible.builtin.template:
|
|
src: nginx-vhost.conf.j2
|
|
dest: "{{ nginx_conf_dir | default('/etc/nginx/conf.d') }}/gitea.conf"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
when: gitea_nginx_enabled
|
|
notify: Reload nginx
|
|
|
|
- name: Remove nginx vhost configuration for Gitea
|
|
ansible.builtin.file:
|
|
path: "{{ nginx_conf_dir | default('/etc/nginx/conf.d') }}/gitea.conf"
|
|
state: absent
|
|
when: not gitea_nginx_enabled
|
|
notify: Reload nginx
|