Files
michaelschiemer/ansible/netcup-simple-deploy/roles/webapp/tasks/main.yml

273 lines
7.7 KiB
YAML

---
# PHP Webapp Deployment (Handle missing PHP config files)
- name: Create app directory
file:
path: "{{ app_directory }}"
state: directory
mode: '0755'
- name: Check if docker-compose.yml exists locally first
local_action:
module: stat
path: "{{ local_app_path }}/docker-compose.yml"
register: local_compose_exists
become: no
- name: Show local docker-compose.yml status
debug:
msg: |
🔍 Local docker-compose.yml check:
- Path: {{ local_app_path }}/docker-compose.yml
- Exists: {{ local_compose_exists.stat.exists }}
- name: Fail if docker-compose.yml doesn't exist locally
fail:
msg: |
❌ docker-compose.yml nicht im lokalen Projekt gefunden!
Geprüft: {{ local_app_path }}/docker-compose.yml
Bitte stelle sicher, dass eine docker-compose.yml in deinem Projekt-Root existiert.
when: not local_compose_exists.stat.exists
- name: Upload project files with working synchronize
synchronize:
src: "{{ local_app_path }}/"
dest: "{{ app_directory }}/"
delete: no
archive: yes
checksum: yes
rsync_opts:
- "--exclude=ansible"
- "--exclude=.git"
- "--exclude=vendor"
- "--exclude=node_modules"
- "--exclude=storage/logs"
- "--exclude=cache"
- "--exclude=logs"
- "--exclude=dist"
- "--exclude=.archive"
- "--exclude=x_ansible"
- "--verbose"
register: sync_result
- name: Check if required PHP config files exist
stat:
path: "{{ app_directory }}/docker/php/php.production.ini"
register: php_prod_config
- name: Create missing PHP production config if needed
copy:
content: |
; PHP Production Configuration
memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300
max_input_vars = 3000
; Error reporting for production
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
; Opcache settings
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 0
dest: "{{ app_directory }}/docker/php/php.production.ini"
mode: '0644'
when: not php_prod_config.stat.exists
- name: Check if common PHP config exists
stat:
path: "{{ app_directory }}/docker/php/php.common.ini"
register: php_common_config
- name: Create missing PHP common config if needed
copy:
content: |
; PHP Common Configuration
date.timezone = Europe/Berlin
short_open_tag = Off
expose_php = Off
; Security
allow_url_fopen = On
allow_url_include = Off
dest: "{{ app_directory }}/docker/php/php.common.ini"
mode: '0644'
when: not php_common_config.stat.exists
- name: Ensure PHP config directory exists
file:
path: "{{ app_directory }}/docker/php"
state: directory
mode: '0755'
- name: Show what files were synced
debug:
msg: |
📂 Sync Result:
- Changed: {{ sync_result.changed }}
- name: Ensure proper permissions for directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
recurse: yes
loop:
- "{{ app_directory }}/public"
- "{{ app_directory }}/src"
- "{{ app_directory }}/docker"
ignore_errors: yes
- name: Create storage directories if they don't exist
file:
path: "{{ app_directory }}/{{ item }}"
state: directory
mode: '0777'
loop:
- "storage/logs"
- "storage/cache"
- "cache"
- "logs"
ignore_errors: yes
- name: Check if docker-compose.yml exists in project root
stat:
path: "{{ app_directory }}/docker-compose.yml"
register: compose_exists
- name: Check if docker-compose.yml exists in docker folder
stat:
path: "{{ app_directory }}/docker/docker-compose.yml"
register: compose_docker_exists
- name: Use docker-compose.yml from docker folder if available
copy:
src: "{{ app_directory }}/docker/docker-compose.yml"
dest: "{{ app_directory }}/docker-compose.yml"
remote_src: yes
when: compose_docker_exists.stat.exists and not compose_exists.stat.exists
- name: Manually copy docker-compose.yml if sync failed
copy:
src: "{{ local_app_path }}/docker-compose.yml"
dest: "{{ app_directory }}/docker-compose.yml"
mode: '0644'
when: local_compose_exists.stat.exists and not compose_exists.stat.exists
- name: Show which docker-compose.yml we found
debug:
msg: |
📋 Docker Compose Status:
- Root compose exists: {{ compose_exists.stat.exists }}
- Docker folder compose exists: {{ compose_docker_exists.stat.exists }}
- name: Fail if no docker-compose.yml found
fail:
msg: |
❌ Keine docker-compose.yml gefunden!
Erwartet in:
- {{ app_directory }}/docker-compose.yml
- {{ app_directory }}/docker/docker-compose.yml
Bitte erstelle eine docker-compose.yml in deinem Projekt.
when: not compose_exists.stat.exists and not compose_docker_exists.stat.exists
- name: Check if public/index.php exists after sync
stat:
path: "{{ app_directory }}/public/index.php"
register: index_exists
- name: Fail if index.php not found
fail:
msg: |
❌ index.php nicht gefunden!
Geprüft: {{ app_directory }}/public/index.php
Die Dateien wurden nicht korrekt übertragen.
when: not index_exists.stat.exists
- name: Create environment file
template:
src: app.env.j2
dest: "{{ app_directory }}/.env"
register: env_result
- name: Check which docker compose command is available
shell: |
if docker compose version >/dev/null 2>&1; then
echo "docker compose"
elif docker-compose --version >/dev/null 2>&1; then
echo "docker-compose"
else
echo "none"
fi
register: docker_compose_cmd
changed_when: false
- name: Stop existing containers (if any)
shell: "cd {{ app_directory }} && {{ docker_compose_cmd.stdout }} down"
when: docker_compose_cmd.stdout != "none"
ignore_errors: yes
- name: Start containers with your docker-compose.yml
shell: "cd {{ app_directory }} && {{ docker_compose_cmd.stdout }} up -d --build"
register: start_result
when: docker_compose_cmd.stdout != "none"
- name: Wait for application to start
wait_for:
port: "{{ app_port }}"
host: "127.0.0.1"
delay: 5
timeout: 60
- name: Test if app is accessible
uri:
url: "http://127.0.0.1:{{ app_port }}/"
method: GET
status_code: [200, 301, 302]
register: app_test
ignore_errors: yes
- name: Show container status
shell: "cd {{ app_directory }} && {{ docker_compose_cmd.stdout }} ps"
register: container_status
when: docker_compose_cmd.stdout != "none"
ignore_errors: yes
- name: Show deployment result
debug:
msg: |
🎉 Projekt {{ app_name }} erfolgreich deployed!
📂 Projektdateien synchronisiert von: {{ local_app_path }}
🐳 Verwendete docker-compose.yml:
{% if compose_exists.stat.exists %}
✅ Aus Projekt-Root: {{ app_directory }}/docker-compose.yml
{% elif compose_docker_exists.stat.exists %}
✅ Aus docker/ Ordner: {{ app_directory }}/docker/docker-compose.yml
{% endif %}
🌐 Erreichbar unter: https://{{ domain }}
⚙️ Docker Compose: {{ docker_compose_cmd.stdout }}
📁 index.php Status: {{ 'Gefunden ✅' if index_exists.stat.exists else 'Nicht gefunden ❌' }}
🐳 Container Status:
{{ container_status.stdout if container_status.stdout is defined else 'Status konnte nicht abgerufen werden' }}
{% if app_test.status is defined and (app_test.status == 200 or app_test.status == 301 or app_test.status == 302) %}
✅ App reagiert erfolgreich (HTTP {{ app_test.status }})
{% else %}
⚠️ App-Test fehlgeschlagen - prüfe Logs mit 'make logs'
{% endif %}