Files
computer-playbook/roles/web-app-pixelfed/tasks/02_bootstrap.yml
kevinveenbirkenbachandClaude Fable 5 40e553069d refactor(structure): nest prefix-grouped sibling files into subfolders
Move files that share a delimiter-bounded name prefix within a folder (threshold 2) into a subfolder named after the prefix, dropping the prefix from the filename. Covers plugins/filter (docker, generate, has, merge, get/all), env handler subpackages, utils/roles/entity, utils/tests/swarm/write, role SQL/scripts/templates, keycloak/mailu task-includes, shared tasks/utils/load, and CI scripts. Update every import, query_file/script/include_tasks/src/lookup target, compose bind mount, and python -m path to the new locations.

Extend the prefix-grouped-files lint to threshold 2 with dir-level .nocheck and file-head nocheck opt-outs, and skip groups whose shortest member's stem equals the shared prefix. Keep flat only where a loader forbids nesting: WordPress mu-plugins and the docs/requirements namespace. Ansible filter discovery is recursive, so nested filters stay Jinja-resolvable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 20:00:03 +02:00

177 lines
5.7 KiB
YAML

---
# The application container starts through a repo-managed entrypoint so Apache
# comes up first and the Ansible bootstrap can run without racing the image's
# first-start migration logic.
# Keep this wait at the top of the bootstrap flow. The later artisan commands
# assume the repo-managed entrypoint has already brought Apache up.
- name: "⏳ Wait until Pixelfed application container finished entrypoint bootstrap"
ansible.builtin.command:
argv:
- container
- exec
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- sh
- -lc
- 'ps -ef | grep -v grep | grep -q "apache2 -DFOREGROUND"'
register: pixelfed_entrypoint_bootstrap
changed_when: false
retries: 120
delay: 5
until: pixelfed_entrypoint_bootstrap.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "🔎 Check whether the Pixelfed bootstrap marker exists"
ansible.builtin.command:
argv:
- container
- exec
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- sh
- -lc
- test -e /var/www/storage/.docker.init
register: pixelfed_bootstrap_marker_exists
changed_when: false
failed_when: false
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "🔎 Check whether the Pixelfed users table exists"
database_query:
config: "{{ lookup('database', application_id) }}"
query_file: "{{ role_path }}/files/sql/select/users-table.sql"
named_args:
db_name: "{{ PIXELFED_DB_NAME }}"
expect_rows: true
mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
register: pixelfed_bootstrap_users_table
changed_when: false
retries: 20
delay: 3
until: pixelfed_bootstrap_users_table is success
no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
- name: "👥 Count existing Pixelfed users when the users table already exists"
database_query:
config: "{{ lookup('database', application_id) }}"
query_file: "{{ role_path }}/files/sql/count-users.sql"
expect_rows: true
mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
when: pixelfed_bootstrap_users_table.rows | length > 0
register: pixelfed_bootstrap_user_count
changed_when: false
retries: 20
delay: 3
until: pixelfed_bootstrap_user_count is success
no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
- name: "🚚 Choose Pixelfed migration strategy"
ansible.builtin.set_fact:
pixelfed_bootstrap_requires_reset: >-
{{
(pixelfed_bootstrap_marker_exists.rc | default(1) | int) != 0
and ((pixelfed_bootstrap_user_count.rows[0][0] | default('0')) | int) == 0
}}
pixelfed_migrate_argv: >-
{{
['container', 'exec', '-u', PIXELFED_APP_USER, PIXELFED_LOCAL_CID, 'php', 'artisan']
+ (
['migrate:fresh', '--force']
if (
(pixelfed_bootstrap_marker_exists.rc | default(1) | int) != 0
and ((pixelfed_bootstrap_user_count.rows[0][0] | default('0')) | int) == 0
)
else ['migrate', '--force', '--isolated']
)
}}
- name: "▶️ Run Pixelfed migrations"
ansible.builtin.command:
argv: "{{ pixelfed_migrate_argv }}"
register: pixelfed_migrate
changed_when: "'Nothing to migrate' not in pixelfed_migrate.stdout"
retries: 60
delay: 5
until: pixelfed_migrate.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "✅ Ensure Pixelfed Passport keys exist"
ansible.builtin.command:
argv:
- container
- exec
- -u
- "{{ PIXELFED_APP_USER }}"
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- sh
- -lc
- |
if [ ! -f /var/www/storage/oauth-private.key ] || [ ! -f /var/www/storage/oauth-public.key ]; then
php artisan passport:keys --force
fi
register: pixelfed_passport_keys
changed_when: false
retries: 20
delay: 5
until: pixelfed_passport_keys.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "✅ Ensure the Pixelfed public storage symlink exists"
ansible.builtin.command:
argv:
- container
- exec
- -u
- "{{ PIXELFED_APP_USER }}"
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- sh
- -lc
- |
if [ ! -L /var/www/public/storage ]; then
php artisan storage:link
fi
register: pixelfed_storage_link
changed_when: false
retries: 20
delay: 5
until: pixelfed_storage_link.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "🎬 Initialize the Pixelfed instance actor"
ansible.builtin.command:
argv:
- container
- exec
- -u
- "{{ PIXELFED_APP_USER }}"
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- php
- artisan
- instance:actor
register: pixelfed_instance_actor
changed_when: false
retries: 20
delay: 5
until: pixelfed_instance_actor.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"
- name: "🏷️ Mark Pixelfed bootstrap as complete for the worker container"
ansible.builtin.command:
argv:
- container
- exec
- -u
- "{{ PIXELFED_APP_USER }}"
- "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver PIXELFED_LOCAL_CID resolved at delegate_to runtime
- sh
- -lc
- |
if [ ! -e /var/www/storage/.docker.init ]; then
touch /var/www/storage/.docker.init
fi
register: pixelfed_bootstrap_marker
changed_when: false
retries: 20
delay: 5
until: pixelfed_bootstrap_marker.rc == 0
delegate_to: "{{ PIXELFED_HOST_NODE }}"