Resolved multiple critical discovery system issues: ## Discovery System Fixes - Fixed console commands not being discovered on first run - Implemented fallback discovery for empty caches - Added context-aware caching with separate cache keys - Fixed object serialization preventing __PHP_Incomplete_Class ## Cache System Improvements - Smart caching that only caches meaningful results - Separate caches for different execution contexts (console, web, test) - Proper array serialization/deserialization for cache compatibility - Cache hit logging for debugging and monitoring ## Object Serialization Fixes - Fixed DiscoveredAttribute serialization with proper string conversion - Sanitized additional data to prevent object reference issues - Added fallback for corrupted cache entries ## Performance & Reliability - All 69 console commands properly discovered and cached - 534 total discovery items successfully cached and restored - No more __PHP_Incomplete_Class cache corruption - Improved error handling and graceful fallbacks ## Testing & Quality - Fixed code style issues across discovery components - Enhanced logging for better debugging capabilities - Improved cache validation and error recovery Ready for production deployment with stable discovery system. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
273 lines
7.7 KiB
YAML
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 %}
|