feat(infrastructure): introduce ansible deployment for taler services

- add ansible playbooks and roles for deploying taler exchange and merchant
- configure PostgreSQL, GNU Taler repositories, and services

🔧 chore(config): provide example env and gitignore for sensitive files

- create .env-example with placeholders for sensitive info
- add .gitignore entries for .env and common editor files
This commit is contained in:
nocci 2025-11-03 13:15:46 +00:00
parent ca89a06864
commit fdc9234540
18 changed files with 525 additions and 0 deletions

View file

@ -0,0 +1,66 @@
---
- name: Determine project root
set_fact:
project_root: "{{ (playbook_dir | realpath) | dirname }}"
- name: Set default .env path
set_fact:
env_file_resolved: "{{ lookup('ansible.builtin.env', 'GNUTALER_ENV_FILE') }}"
- name: Override .env path with project default when not provided
set_fact:
env_file_resolved: "{{ project_root + '/.env' }}"
when: env_file_resolved | default('') | length == 0
- name: Check if .env file exists
ansible.builtin.stat:
path: "{{ env_file_resolved }}"
register: env_file_stat
- name: Load .env overrides when present
set_fact:
env_overrides: "{{ lookup('community.general.read_env', env_file_resolved) }}"
when: env_file_stat.stat.exists
- name: Warn when .env file is missing
ansible.builtin.debug:
msg: >-
.env file not found at {{ env_file_resolved }}.
Using defaults from group_vars/all.yml. Create one from .env-example.
when: not env_file_stat.stat.exists
- name: Merge defaults with .env overrides
set_fact:
taler_env: "{{ taler_defaults | combine(env_overrides | default({}), recursive=True) }}"
- name: Build structured variables for play consumption
set_fact:
taler_config:
domain: "{{ taler_env.TALER_DOMAIN }}"
admin_email: "{{ taler_env.TALER_ADMIN_EMAIL }}"
acme_contact: "{{ taler_env.LETSENCRYPT_CONTACT }}"
package_repo: "{{ taler_env.TALER_PACKAGE_REPO }}"
distribution: "{{ taler_env.TALER_DISTRIBUTION }}"
currency: "{{ taler_env.TALER_CURRENCY }}"
exchange_host: "{{ taler_env.TALER_EXCHANGE_HOST }}"
merchant_host: "{{ taler_env.TALER_MERCHANT_HOST }}"
pay_host: "{{ taler_env.TALER_PAY_HOST }}"
wordpress_host: "{{ taler_env.WORDPRESS_HOST }}"
exchange_master_key: "{{ taler_env.TALER_MASTER_PUBLIC_KEY }}"
db:
host: "{{ taler_env.TALER_DB_HOST }}"
port: "{{ taler_env.TALER_DB_PORT | int }}"
admin_user: "{{ taler_env.TALER_DB_ADMIN_USER }}"
admin_password: "{{ taler_env.TALER_DB_ADMIN_PASSWORD }}"
exchange:
name: "{{ taler_env.TALER_EXCHANGE_DB }}"
user: "{{ taler_env.TALER_EXCHANGE_DB_USER }}"
password: "{{ taler_env.TALER_EXCHANGE_DB_PASSWORD }}"
merchant:
name: "{{ taler_env.TALER_MERCHANT_DB }}"
user: "{{ taler_env.TALER_MERCHANT_DB_USER }}"
password: "{{ taler_env.TALER_MERCHANT_DB_PASSWORD }}"
wordpress_db:
name: "{{ taler_env.WORDPRESS_DB_NAME }}"
user: "{{ taler_env.WORDPRESS_DB_USER }}"
password: "{{ taler_env.WORDPRESS_DB_PASSWORD }}"