From b4913e720e77cc1c1607995987bb5761eea6439e Mon Sep 17 00:00:00 2001 From: Alicante Core Date: Wed, 10 Dec 2025 22:25:12 +0000 Subject: [PATCH] feat: Alicante Core V4.1 - Joomla 6 + Dolibarr 22 + Teable fix --- alicante-v4.1-backup-20251210.tar.gz | Bin 0 -> 11969 bytes ansible.cfg | 12 ++ group_vars/all.yml | 99 ++++----- inventory | 5 - inventory/hosts | 5 + inventory/hosts.yml | 16 ++ playbooks/deploy_v4_1.yml | 32 +++ playbooks/deploy_v4_1_full.yml | 53 +++++ roles/app_dolibarr_native/handlers/main.yml | 5 + roles/app_dolibarr_native/tasks/main.yml | 72 +++++++ .../templates/dolibarr.conf.j2 | 13 ++ roles/app_joomla_native/handlers/main.yml | 5 + roles/app_joomla_native/tasks/main.yml | 76 +++++++ .../templates/joomla.conf.j2 | 13 ++ roles/app_nextcloud_native/handlers/main.yml | 5 + roles/app_nextcloud_native/tasks/main.yml | 74 +++++++ .../templates/nextcloud.conf.j2 | 17 ++ roles/apps_docker/tasks/main.yml | 203 ++++++++++++++++++ roles/base_system/tasks/main.yml | 31 +++ roles/docker_base/tasks/main.yml | 60 ++++++ roles/webmin_lamp/handlers/main.yml | 5 + roles/webmin_lamp/tasks/main.yml | 95 ++++++++ 22 files changed, 842 insertions(+), 54 deletions(-) create mode 100644 alicante-v4.1-backup-20251210.tar.gz create mode 100644 ansible.cfg delete mode 100644 inventory create mode 100644 inventory/hosts create mode 100644 inventory/hosts.yml create mode 100644 playbooks/deploy_v4_1.yml create mode 100644 playbooks/deploy_v4_1_full.yml create mode 100644 roles/app_dolibarr_native/handlers/main.yml create mode 100644 roles/app_dolibarr_native/tasks/main.yml create mode 100644 roles/app_dolibarr_native/templates/dolibarr.conf.j2 create mode 100644 roles/app_joomla_native/handlers/main.yml create mode 100644 roles/app_joomla_native/tasks/main.yml create mode 100644 roles/app_joomla_native/templates/joomla.conf.j2 create mode 100644 roles/app_nextcloud_native/handlers/main.yml create mode 100644 roles/app_nextcloud_native/tasks/main.yml create mode 100644 roles/app_nextcloud_native/templates/nextcloud.conf.j2 create mode 100644 roles/apps_docker/tasks/main.yml create mode 100644 roles/base_system/tasks/main.yml create mode 100644 roles/docker_base/tasks/main.yml create mode 100644 roles/webmin_lamp/handlers/main.yml create mode 100644 roles/webmin_lamp/tasks/main.yml diff --git a/alicante-v4.1-backup-20251210.tar.gz b/alicante-v4.1-backup-20251210.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2076164381116dfa7a0bd4ce69b204a0f0ced6a7 GIT binary patch literal 11969 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 TQ=anl38eoAS_{_R0B8XK_*d}d literal 0 HcmV?d00001 diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..ebde697 --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,12 @@ +[defaults] +inventory = inventory/hosts +roles_path = roles +host_key_checking = False +retry_files_enabled = False +stdout_callback = yaml + +[privilege_escalation] +become = True +become_method = sudo +become_user = root +become_ask_pass = False diff --git a/group_vars/all.yml b/group_vars/all.yml index 2fae967..a7576c9 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -1,54 +1,55 @@ --- +# Alicante Core V4.1 - Configuración Global + +# IPs +core_ip: "10.10.10.104" +dcc_ip: "10.10.10.101" + +# Credenciales +core_user: "CORE" +core_email: "ANT1NONAME@DISROOT.ORG" +core_password: "coreALICANTE@2026" + +# Rutas +data_root: "/DATA/VOLUMENES" +docker_root: "/opt/services" + +# PHP Multiversión +php_versions: + - "8.1" + - "8.2" + - "8.3" + +# Timezone timezone: "Europe/Madrid" -# Contraseñas Maestras (Se usan para configurar las DBs internas de cada stack) -global_db_pass: "RootSecret123" -global_redis_pass: "RedisSecret123" -authentik_secret: "AlicanteAuthSecret2025_ChangeMe" +# Puertos (Mantenidos de V4) +ports: + dolibarr: 8080 + nextcloud: 8088 + joomla: 8090 + teable: 3000 + activepieces: 8081 + wikijs: 6875 + metabase: 3001 + gotenberg: 3002 + dockge: 5001 + leantime: 8085 + vaultwarden: 8812 + pretix: 8095 + ontime: 4000 + opensign: 8086 + beszel: 8177 + webmin: 10000 -sysadmin_email: "admin@alicante.local" -global_db_root_pass: "RootSecret123" -global_db_app_pass: "AppSecret123" -global_redis_pass: "RedisSecret123" -authentik_secret: "GenerarStringLargoAleatorio123456" -authentik_pg_pass: "AuthDBSecret123" -pg_version: "16" +# URLs de descarga - VERSIONES MÁS RECIENTES +download_urls: + nextcloud: "https://download.nextcloud.com/server/releases/nextcloud-31.0.0.tar.bz2" + joomla: "https://github.com/joomla/joomla-cms/releases/download/6.0.0/Joomla_6.0.0-Stable-Full_Package.zip" + dolibarr: "https://github.com/Dolibarr/dolibarr/archive/refs/tags/22.0.1.tar.gz" -# ============================================================================ -# ALICANTE CORE V3.3 - Credenciales estándar -# ============================================================================ - -# Usuario estándar CORE -core_user: - username: "CORE" - firstname: "ALICANTE" - lastname: "CORE" - email: "ANT1NONAME@DISROOT.ORG" - password: "coreALICANTE@2026" - -# Credenciales de bases de datos -core_db_credentials: - postgres_root_password: "coreALICANTE@2026" - dolibarr_db_name: "dolibarr_db" - dolibarr_db_user: "dolibarr_core" - dolibarr_db_pass: "coreALICANTE@2026" - teable_db_name: "teable_db" - teable_db_user: "teable_core" - teable_db_pass: "coreALICANTE@2026" - activepieces_db_name: "activepieces_db" - activepieces_db_user: "activepieces_core" - activepieces_db_pass: "coreALICANTE@2026" - wikijs_db_name: "wikijs_db" - wikijs_db_user: "wikijs_core" - wikijs_db_pass: "coreALICANTE@2026" - metabase_db_name: "metabase_db" - metabase_db_user: "metabase_core" - metabase_db_pass: "coreALICANTE@2026" - -# Dominios (adaptar a tus dominios reales de NPM) -dolibarr_domain: "dolibarr.tudominio.com" -teable_domain: "teable.tudominio.com" -activepieces_domain: "activepieces.tudominio.com" -wikijs_domain: "wiki.tudominio.com" -metabase_domain: "metabase.tudominio.com" -authentik_domain: "auth.tudominio.com" +# Versiones +versions: + nextcloud: "31.0" + joomla: "6.0" + dolibarr: "22.0" diff --git a/inventory b/inventory deleted file mode 100644 index 0ee8966..0000000 --- a/inventory +++ /dev/null @@ -1,5 +0,0 @@ -[core] -10.10.10.104 ansible_user=root ansible_connection=ssh - -[all:vars] -ansible_python_interpreter=/usr/bin/python3 diff --git a/inventory/hosts b/inventory/hosts new file mode 100644 index 0000000..382d20c --- /dev/null +++ b/inventory/hosts @@ -0,0 +1,5 @@ +[core] +10.10.10.104 ansible_user=root ansible_ssh_private_key_file=~/.ssh/alicante_key + +[dcc] +localhost ansible_connection=local diff --git a/inventory/hosts.yml b/inventory/hosts.yml new file mode 100644 index 0000000..b62b614 --- /dev/null +++ b/inventory/hosts.yml @@ -0,0 +1,16 @@ +--- +all: + children: + alicante: + hosts: + alicante-core: + ansible_host: 10.10.10.104 + ansible_user: root + ansible_python_interpreter: /usr/bin/python3 + + dcc_servers: + hosts: + dcc: + ansible_host: 10.10.10.101 + ansible_user: root + ansible_connection: local diff --git a/playbooks/deploy_v4_1.yml b/playbooks/deploy_v4_1.yml new file mode 100644 index 0000000..2487418 --- /dev/null +++ b/playbooks/deploy_v4_1.yml @@ -0,0 +1,32 @@ +--- +- name: Alicante Core V4 -> V4.1 Actualización + hosts: core + become: yes + vars_files: + - ../group_vars/all.yml + + pre_tasks: + - name: Mostrar información de actualización + debug: + msg: "Actualizando CORE {{ core_ip }} a V4.1 - Híbrido LAMP+Docker" + + roles: + - base_system + - webmin_lamp + - docker_base + + post_tasks: + - name: Resumen de servicios instalados + debug: + msg: | + ✅ V4.1 Base instalada: + - Webmin: http://{{ core_ip }}:{{ ports.webmin }} + - PHP: 8.1, 8.2, 8.3 instalados + - MariaDB + PostgreSQL + Redis activos + - Docker + Dockge: http://{{ core_ip }}:{{ ports.dockge }} + + ⚠️ Nota: Webmin, MariaDB y PostgreSQL ya estaban instalados + + Próximos pasos: + - Desplegar apps nativas (Joomla, Dolibarr, Nextcloud) + - Desplegar apps Docker (Teable, Pretix, etc.) diff --git a/playbooks/deploy_v4_1_full.yml b/playbooks/deploy_v4_1_full.yml new file mode 100644 index 0000000..b1bc62b --- /dev/null +++ b/playbooks/deploy_v4_1_full.yml @@ -0,0 +1,53 @@ +--- +- name: Alicante Core V4.1 - Despliegue Completo + hosts: core + become: yes + vars_files: + - ../group_vars/all.yml + + pre_tasks: + - name: Información del despliegue + debug: + msg: | + 🚀 Desplegando Alicante Core V4.1 COMPLETO + 📍 Server: {{ core_ip }} + 🔧 Apps Nativas: Nextcloud, Joomla, Dolibarr + 🐳 Apps Docker: Teable, Wiki.js, Leantime, Vaultwarden, Metabase, Gotenberg, Ontime + + roles: + - base_system + - webmin_lamp + - docker_base + - app_nextcloud_native + - app_joomla_native + - app_dolibarr_native + - apps_docker + + post_tasks: + - name: Resumen Final + debug: + msg: | + ✅ ALICANTE CORE V4.1 DESPLEGADO COMPLETAMENTE + + 📱 APPS NATIVAS: + - Nextcloud: http://{{ core_ip }}:{{ ports.nextcloud }} + - Joomla: http://{{ core_ip }}:{{ ports.joomla }} + - Dolibarr: http://{{ core_ip }}:{{ ports.dolibarr }} + + 🐳 APPS DOCKER: + - Teable: http://{{ core_ip }}:{{ ports.teable }} + - Wiki.js: http://{{ core_ip }}:{{ ports.wikijs }} + - Leantime: http://{{ core_ip }}:{{ ports.leantime }} + - Vaultwarden: http://{{ core_ip }}:{{ ports.vaultwarden }} + - Metabase: http://{{ core_ip }}:{{ ports.metabase }} + - Gotenberg: http://{{ core_ip }}:{{ ports.gotenberg }} + - Ontime: http://{{ core_ip }}:{{ ports.ontime }} + - Dockge: http://{{ core_ip }}:{{ ports.dockge }} + + 🔧 ADMINISTRACIÓN: + - Webmin: http://{{ core_ip }}:{{ ports.webmin }} + + 📝 CREDENCIALES: + - Usuario: {{ core_user }} + - Email: {{ core_email }} + - Password: {{ core_password }} diff --git a/roles/app_dolibarr_native/handlers/main.yml b/roles/app_dolibarr_native/handlers/main.yml new file mode 100644 index 0000000..670471f --- /dev/null +++ b/roles/app_dolibarr_native/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart apache2 + service: + name: apache2 + state: restarted diff --git a/roles/app_dolibarr_native/tasks/main.yml b/roles/app_dolibarr_native/tasks/main.yml new file mode 100644 index 0000000..cc038b5 --- /dev/null +++ b/roles/app_dolibarr_native/tasks/main.yml @@ -0,0 +1,72 @@ +--- +- name: Verificar si Dolibarr ya existe + stat: + path: /var/www/html/dolibarr + register: dolibarr_exists + +- name: Crear base de datos MariaDB para Dolibarr + mysql_db: + name: dolibarr + state: present + login_unix_socket: /run/mysqld/mysqld.sock + when: not dolibarr_exists.stat.exists + +- name: Crear usuario MariaDB para Dolibarr + mysql_user: + name: dolibarr + password: "{{ core_password }}" + priv: 'dolibarr.*:ALL' + state: present + login_unix_socket: /run/mysqld/mysqld.sock + when: not dolibarr_exists.stat.exists + +- name: Descargar Dolibarr 22.0 + get_url: + url: "{{ download_urls.dolibarr }}" + dest: /tmp/dolibarr-22.0.tar.gz + when: not dolibarr_exists.stat.exists + +- name: Extraer Dolibarr + unarchive: + src: /tmp/dolibarr-22.0.tar.gz + dest: /tmp/ + remote_src: yes + when: not dolibarr_exists.stat.exists + +- name: Mover Dolibarr a /var/www/html + command: mv /tmp/dolibarr-22.0.1 /var/www/html/dolibarr + args: + creates: /var/www/html/dolibarr + when: not dolibarr_exists.stat.exists + +- name: Establecer permisos Dolibarr + file: + path: /var/www/html/dolibarr + owner: www-data + group: www-data + recurse: yes + +- name: Crear directorio documentos Dolibarr + file: + path: "{{ data_root }}/dolibarr" + state: directory + owner: www-data + group: www-data + mode: '0750' + +- name: Configurar VirtualHost Dolibarr + template: + src: dolibarr.conf.j2 + dest: /etc/apache2/sites-available/dolibarr.conf + notify: restart apache2 + +- name: Habilitar sitio Dolibarr + command: a2ensite dolibarr + args: + creates: /etc/apache2/sites-enabled/dolibarr.conf + notify: restart apache2 + +- name: Informar si Dolibarr ya existe + debug: + msg: "Dolibarr ya está instalado, saltando descarga" + when: dolibarr_exists.stat.exists diff --git a/roles/app_dolibarr_native/templates/dolibarr.conf.j2 b/roles/app_dolibarr_native/templates/dolibarr.conf.j2 new file mode 100644 index 0000000..ef1e68f --- /dev/null +++ b/roles/app_dolibarr_native/templates/dolibarr.conf.j2 @@ -0,0 +1,13 @@ + + DocumentRoot /var/www/html/dolibarr/htdocs + + + Require all granted + AllowOverride All + Options FollowSymLinks MultiViews + + + + SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" + + diff --git a/roles/app_joomla_native/handlers/main.yml b/roles/app_joomla_native/handlers/main.yml new file mode 100644 index 0000000..670471f --- /dev/null +++ b/roles/app_joomla_native/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart apache2 + service: + name: apache2 + state: restarted diff --git a/roles/app_joomla_native/tasks/main.yml b/roles/app_joomla_native/tasks/main.yml new file mode 100644 index 0000000..62975bf --- /dev/null +++ b/roles/app_joomla_native/tasks/main.yml @@ -0,0 +1,76 @@ +--- +- name: Verificar si Joomla ya existe + stat: + path: /var/www/html/joomla/configuration.php + register: joomla_exists + +- name: Crear base de datos MariaDB para Joomla + mysql_db: + name: joomla + state: present + login_unix_socket: /run/mysqld/mysqld.sock + when: not joomla_exists.stat.exists + +- name: Crear usuario MariaDB para Joomla + mysql_user: + name: joomla + password: "{{ core_password }}" + priv: 'joomla.*:ALL' + state: present + login_unix_socket: /run/mysqld/mysqld.sock + when: not joomla_exists.stat.exists + +- name: Crear directorio Joomla + file: + path: /var/www/html/joomla + state: directory + owner: www-data + group: www-data + +- name: Instalar unzip si no existe + apt: + name: unzip + state: present + when: not joomla_exists.stat.exists + +- name: Descargar Joomla 6.0 desde GitHub + get_url: + url: "{{ download_urls.joomla }}" + dest: /tmp/joomla-6.0.zip + timeout: 120 + force: yes + when: not joomla_exists.stat.exists + +- name: Extraer Joomla + unarchive: + src: /tmp/joomla-6.0.zip + dest: /var/www/html/joomla/ + remote_src: yes + owner: www-data + group: www-data + when: not joomla_exists.stat.exists + +- name: Establecer permisos Joomla + file: + path: /var/www/html/joomla + owner: www-data + group: www-data + recurse: yes + mode: '0755' + +- name: Configurar VirtualHost Joomla + template: + src: joomla.conf.j2 + dest: /etc/apache2/sites-available/joomla.conf + notify: restart apache2 + +- name: Habilitar sitio Joomla + command: a2ensite joomla + args: + creates: /etc/apache2/sites-enabled/joomla.conf + notify: restart apache2 + +- name: Informar si Joomla ya existe + debug: + msg: "Joomla ya está instalado, saltando descarga" + when: joomla_exists.stat.exists diff --git a/roles/app_joomla_native/templates/joomla.conf.j2 b/roles/app_joomla_native/templates/joomla.conf.j2 new file mode 100644 index 0000000..33342b1 --- /dev/null +++ b/roles/app_joomla_native/templates/joomla.conf.j2 @@ -0,0 +1,13 @@ + + DocumentRoot /var/www/html/joomla + + + Require all granted + AllowOverride All + Options FollowSymLinks MultiViews + + + + SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost" + + diff --git a/roles/app_nextcloud_native/handlers/main.yml b/roles/app_nextcloud_native/handlers/main.yml new file mode 100644 index 0000000..670471f --- /dev/null +++ b/roles/app_nextcloud_native/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart apache2 + service: + name: apache2 + state: restarted diff --git a/roles/app_nextcloud_native/tasks/main.yml b/roles/app_nextcloud_native/tasks/main.yml new file mode 100644 index 0000000..36d0b47 --- /dev/null +++ b/roles/app_nextcloud_native/tasks/main.yml @@ -0,0 +1,74 @@ +--- +- name: Verificar si Nextcloud ya existe + stat: + path: /var/www/html/nextcloud + register: nextcloud_exists + +- name: Crear base de datos PostgreSQL para Nextcloud + postgresql_db: + name: nextcloud + state: present + become_user: postgres + when: not nextcloud_exists.stat.exists + +- name: Crear usuario PostgreSQL para Nextcloud + postgresql_user: + name: nextcloud + password: "{{ core_password }}" + state: present + become_user: postgres + when: not nextcloud_exists.stat.exists + +- name: Otorgar privilegios al usuario Nextcloud + postgresql_privs: + database: nextcloud + roles: nextcloud + privs: ALL + type: database + become_user: postgres + when: not nextcloud_exists.stat.exists + +- name: Descargar Nextcloud 31 + get_url: + url: "{{ download_urls.nextcloud }}" + dest: /tmp/nextcloud-31.tar.bz2 + when: not nextcloud_exists.stat.exists + +- name: Extraer Nextcloud + unarchive: + src: /tmp/nextcloud-31.tar.bz2 + dest: /var/www/html/ + remote_src: yes + when: not nextcloud_exists.stat.exists + +- name: Establecer permisos Nextcloud + file: + path: /var/www/html/nextcloud + owner: www-data + group: www-data + recurse: yes + +- name: Crear directorio de datos Nextcloud + file: + path: "{{ data_root }}/nextcloud" + state: directory + owner: www-data + group: www-data + mode: '0750' + +- name: Configurar VirtualHost Nextcloud + template: + src: nextcloud.conf.j2 + dest: /etc/apache2/sites-available/nextcloud.conf + notify: restart apache2 + +- name: Habilitar sitio Nextcloud + command: a2ensite nextcloud + args: + creates: /etc/apache2/sites-enabled/nextcloud.conf + notify: restart apache2 + +- name: Informar si Nextcloud ya existe + debug: + msg: "Nextcloud ya está instalado, saltando descarga" + when: nextcloud_exists.stat.exists diff --git a/roles/app_nextcloud_native/templates/nextcloud.conf.j2 b/roles/app_nextcloud_native/templates/nextcloud.conf.j2 new file mode 100644 index 0000000..9c4edb4 --- /dev/null +++ b/roles/app_nextcloud_native/templates/nextcloud.conf.j2 @@ -0,0 +1,17 @@ + + DocumentRoot /var/www/html/nextcloud + + + Require all granted + AllowOverride All + Options FollowSymLinks MultiViews + + + Dav off + + + + + SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost" + + diff --git a/roles/apps_docker/tasks/main.yml b/roles/apps_docker/tasks/main.yml new file mode 100644 index 0000000..5740f4b --- /dev/null +++ b/roles/apps_docker/tasks/main.yml @@ -0,0 +1,203 @@ +--- +# Crear todos los directorios de datos +- name: Crear directorios para apps Docker + file: + path: "{{ data_root }}/{{ item }}" + state: directory + mode: '0755' + loop: + - teable + - teable/db + - wikijs + - wikijs/db + - activepieces + - activepieces/db + - leantime + - leantime/db + - vaultwarden + - pretix + - pretix/db + - pretix/redis + - ontime + - opensign + - opensign/db + - metabase + - gotenberg + +# TEABLE +- name: Desplegar Teable Stack + community.docker.docker_compose_v2: + project_name: teable + definition: + version: '3.8' + services: + teable-db: + image: postgres:15-alpine + restart: unless-stopped + environment: + POSTGRES_DB: teable + POSTGRES_USER: teable + POSTGRES_PASSWORD: "{{ core_password }}" + volumes: + - "{{ data_root }}/teable/db:/var/lib/postgresql/data" + networks: + - alicante-net + + teable: + image: ghcr.io/teableio/teable:latest + restart: unless-stopped + ports: + - "{{ ports.teable }}:3000" + environment: + DATABASE_URL: "postgresql://teable:{{ core_password }}@teable-db:5432/teable" + REDIS_HOST: teable-redis + REDIS_PORT: 6379 + PUBLIC_ORIGIN: "http://{{ core_ip }}:{{ ports.teable }}" + volumes: + - "{{ data_root }}/teable:/app/.assets" + networks: + - alicante-net + depends_on: + - teable-db + - teable-redis + + teable-redis: + image: redis:7-alpine + restart: unless-stopped + networks: + - alicante-net + + networks: + alicante-net: + external: true + +# WIKI.JS +- name: Desplegar Wiki.js Stack + community.docker.docker_compose_v2: + project_name: wikijs + definition: + version: '3.8' + services: + wikijs-db: + image: postgres:15-alpine + restart: unless-stopped + environment: + POSTGRES_DB: wikijs + POSTGRES_USER: wikijs + POSTGRES_PASSWORD: "{{ core_password }}" + volumes: + - "{{ data_root }}/wikijs/db:/var/lib/postgresql/data" + networks: + - alicante-net + + wikijs: + image: ghcr.io/requarks/wiki:2 + restart: unless-stopped + ports: + - "{{ ports.wikijs }}:3000" + environment: + DB_TYPE: postgres + DB_HOST: wikijs-db + DB_PORT: 5432 + DB_USER: wikijs + DB_PASS: "{{ core_password }}" + DB_NAME: wikijs + networks: + - alicante-net + depends_on: + - wikijs-db + + networks: + alicante-net: + external: true + +# GOTENBERG +- name: Desplegar Gotenberg + community.docker.docker_container: + name: gotenberg + image: gotenberg/gotenberg:8 + restart_policy: unless-stopped + ports: + - "{{ ports.gotenberg }}:3000" + networks: + - name: alicante-net + +# METABASE +- name: Desplegar Metabase + community.docker.docker_container: + name: metabase + image: metabase/metabase:latest + restart_policy: unless-stopped + ports: + - "{{ ports.metabase }}:3000" + volumes: + - "{{ data_root }}/metabase:/metabase-data" + env: + MB_DB_FILE: /metabase-data/metabase.db + networks: + - name: alicante-net + +# LEANTIME +- name: Desplegar Leantime Stack + community.docker.docker_compose_v2: + project_name: leantime + definition: + version: '3.8' + services: + leantime-db: + image: mysql:8 + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: "{{ core_password }}" + MYSQL_DATABASE: leantime + MYSQL_USER: leantime + MYSQL_PASSWORD: "{{ core_password }}" + volumes: + - "{{ data_root }}/leantime/db:/var/lib/mysql" + networks: + - alicante-net + + leantime: + image: leantime/leantime:latest + restart: unless-stopped + ports: + - "{{ ports.leantime }}:80" + environment: + LEAN_DB_HOST: leantime-db + LEAN_DB_USER: leantime + LEAN_DB_PASSWORD: "{{ core_password }}" + LEAN_DB_DATABASE: leantime + networks: + - alicante-net + depends_on: + - leantime-db + + networks: + alicante-net: + external: true + +# VAULTWARDEN +- name: Desplegar Vaultwarden + community.docker.docker_container: + name: vaultwarden + image: vaultwarden/server:latest + restart_policy: unless-stopped + ports: + - "{{ ports.vaultwarden }}:80" + volumes: + - "{{ data_root }}/vaultwarden:/data" + networks: + - name: alicante-net + +# ONTIME +- name: Desplegar Ontime + community.docker.docker_container: + name: ontime + image: getontime/ontime:latest + restart_policy: unless-stopped + ports: + - "{{ ports.ontime }}:4001" + volumes: + - "{{ data_root }}/ontime:/data" + networks: + - name: alicante-net diff --git a/roles/base_system/tasks/main.yml b/roles/base_system/tasks/main.yml new file mode 100644 index 0000000..3e525fc --- /dev/null +++ b/roles/base_system/tasks/main.yml @@ -0,0 +1,31 @@ +--- +- name: Actualizar sistema base + apt: + update_cache: yes + upgrade: dist + +- name: Instalar paquetes básicos + apt: + name: + - curl + - wget + - git + - htop + - vim + - unzip + - acl + - gnupg2 + - ca-certificates + - apt-transport-https + state: present + +- name: Crear directorios de datos + file: + path: "{{ item }}" + state: directory + mode: '0755' + loop: + - "{{ data_root }}" + - "{{ docker_root }}" + - "{{ data_root }}/backups" + - /var/www/html diff --git a/roles/docker_base/tasks/main.yml b/roles/docker_base/tasks/main.yml new file mode 100644 index 0000000..66be7d8 --- /dev/null +++ b/roles/docker_base/tasks/main.yml @@ -0,0 +1,60 @@ +--- +- name: Instalar dependencias Python para Docker + apt: + name: + - python3-requests + - python3-docker + state: present + +- name: Verificar si Docker está instalado + stat: + path: /usr/bin/docker + register: docker_exists + +- name: Instalar Docker + shell: curl -fsSL https://get.docker.com | sh + when: not docker_exists.stat.exists + +- name: Instalar Docker Compose v2 + shell: | + mkdir -p /usr/local/lib/docker/cli-plugins + curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose + chmod +x /usr/local/lib/docker/cli-plugins/docker-compose + args: + creates: /usr/local/lib/docker/cli-plugins/docker-compose + +- name: Crear red Docker compartida + community.docker.docker_network: + name: alicante-net + driver: bridge + +- name: Crear directorio para Dockge + file: + path: "{{ docker_root }}/dockge" + state: directory + +- name: Verificar si Dockge ya existe + community.docker.docker_container_info: + name: dockge + register: dockge_info + ignore_errors: yes + +- name: Desplegar Dockge (solo si no existe) + community.docker.docker_container: + name: dockge + image: louislam/dockge:1 + restart_policy: unless-stopped + ports: + - "{{ ports.dockge }}:5001" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - "{{ data_root }}/dockge:/app/data" + - "{{ docker_root }}:/opt/stacks" + env: + TZ: "{{ timezone }}" + when: not dockge_info.exists + +- name: Informar si Dockge ya existe + debug: + msg: "Dockge ya está corriendo en el puerto {{ ports.dockge }}" + when: dockge_info.exists diff --git a/roles/webmin_lamp/handlers/main.yml b/roles/webmin_lamp/handlers/main.yml new file mode 100644 index 0000000..670471f --- /dev/null +++ b/roles/webmin_lamp/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart apache2 + service: + name: apache2 + state: restarted diff --git a/roles/webmin_lamp/tasks/main.yml b/roles/webmin_lamp/tasks/main.yml new file mode 100644 index 0000000..7ef508b --- /dev/null +++ b/roles/webmin_lamp/tasks/main.yml @@ -0,0 +1,95 @@ +--- +- name: Añadir repositorio SURY para PHP multiversión + shell: | + curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg + echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list + apt-get update + args: + creates: /etc/apt/sources.list.d/php.list + +- name: Instalar Apache2 + apt: + name: + - apache2 + - libapache2-mod-fcgid + state: present + +- name: Instalar PHP 8.1, 8.2 y 8.3 + apt: + name: + - php8.1 + - php8.1-fpm + - php8.1-mysql + - php8.1-pgsql + - php8.1-gd + - php8.1-mbstring + - php8.1-xml + - php8.1-zip + - php8.1-intl + - php8.1-curl + - php8.2 + - php8.2-fpm + - php8.2-mysql + - php8.2-pgsql + - php8.2-gd + - php8.2-mbstring + - php8.2-xml + - php8.2-zip + - php8.2-intl + - php8.2-curl + - php8.3 + - php8.3-fpm + - php8.3-mysql + - php8.3-pgsql + - php8.3-gd + - php8.3-mbstring + - php8.3-xml + - php8.3-zip + - php8.3-intl + - php8.3-curl + - php8.3-apcu + - php8.3-redis + state: present + +- name: Instalar dependencias Python para Ansible + apt: + name: + - python3-psycopg2 + - python3-pymysql + state: present + +- name: Habilitar módulos Apache necesarios + apache2_module: + name: "{{ item }}" + state: present + loop: + - rewrite + - proxy + - proxy_fcgi + - setenvif + notify: restart apache2 + +- name: Instalar Redis Server + apt: + name: redis-server + state: present + +- name: Configurar puertos adicionales en Apache + lineinfile: + path: /etc/apache2/ports.conf + line: "Listen {{ item }}" + create: yes + loop: + - "{{ ports.nextcloud }}" + - "{{ ports.joomla }}" + - "{{ ports.dolibarr }}" + notify: restart apache2 + +- name: Iniciar y habilitar servicios + service: + name: "{{ item }}" + state: started + enabled: yes + loop: + - apache2 + - redis-server