134 lines
4.3 KiB
YAML
134 lines
4.3 KiB
YAML
---
|
|
# Stage 3: Setup S3FS on all servers
|
|
#
|
|
# This playbook sets up s3fs to mount S3 buckets as local filesystems.
|
|
# Must be run after Stage 2 (full deployment) to ensure Docker is installed.
|
|
#
|
|
# Mounts the following buckets:
|
|
# - asxpio-terraform-main -> /mnt/s3/terraform
|
|
# - asxpio-backups-main -> /mnt/s3/backups
|
|
# - asxpio-immich-main -> /mnt/s3/immich
|
|
#
|
|
# Cache sizes (per-host):
|
|
# - asxpio-ops (40GB disk): 10GB cache max
|
|
# - asxpio-services (160GB disk): 80GB cache max
|
|
#
|
|
# Usage:
|
|
# ansible-playbook playbooks/03-setup-s3fs.yaml
|
|
#
|
|
# IMPORTANT: Ensure S3 credentials are set in group_vars/all/vault.yaml:
|
|
# vault_s3_access_key: "your-access-key"
|
|
# vault_s3_secret_key: "your-secret-key"
|
|
#
|
|
|
|
- name: Setup S3FS on all servers
|
|
hosts: ops_servers,services_servers
|
|
become: true
|
|
gather_facts: true
|
|
|
|
pre_tasks:
|
|
- name: Validate S3 credentials are set
|
|
ansible.builtin.assert:
|
|
that:
|
|
- s3_access_key is defined
|
|
- s3_access_key != ""
|
|
- s3_secret_key is defined
|
|
- s3_secret_key != ""
|
|
fail_msg: |
|
|
S3 credentials not set!
|
|
Please set vault_s3_access_key and vault_s3_secret_key in:
|
|
- group_vars/all/vault.yaml (encrypted with ansible-vault)
|
|
OR
|
|
- Pass via command line: -e "s3_access_key=xxx s3_secret_key=yyy"
|
|
success_msg: "S3 credentials validated"
|
|
|
|
- name: Display S3 configuration
|
|
ansible.builtin.debug:
|
|
msg: |
|
|
========================================
|
|
S3FS Setup on {{ inventory_hostname }}
|
|
========================================
|
|
Target: {{ inventory_hostname }}
|
|
S3 Region: {{ s3_region }}
|
|
S3 Endpoint: {{ s3_endpoint }}
|
|
|
|
Buckets to mount:
|
|
{% for bucket in s3_buckets %}
|
|
- {{ bucket.name }} -> {{ bucket.mount_point }}
|
|
{% endfor %}
|
|
========================================
|
|
|
|
roles:
|
|
- role: s3fs
|
|
|
|
post_tasks:
|
|
- name: Display mounted filesystems
|
|
ansible.builtin.command:
|
|
cmd: df -h
|
|
register: df_output
|
|
changed_when: false
|
|
|
|
- name: Show S3 mounts
|
|
ansible.builtin.debug:
|
|
msg: "{{ df_output.stdout_lines | select('search', 's3fs') | list }}"
|
|
|
|
- name: Create immich library directory structure
|
|
ansible.builtin.file:
|
|
path: "{{ item }}"
|
|
state: directory
|
|
mode: '0775'
|
|
owner: root
|
|
group: docker
|
|
loop:
|
|
- /mnt/s3/immich/library
|
|
- /mnt/s3/immich/library/backups
|
|
- /mnt/s3/immich/library/encoded-video
|
|
- /mnt/s3/immich/library/library
|
|
- /mnt/s3/immich/library/profile
|
|
- /mnt/s3/immich/library/thumbs
|
|
- /mnt/s3/immich/library/upload
|
|
when: inventory_hostname in groups['services_servers']
|
|
|
|
- name: Display post-setup information
|
|
ansible.builtin.debug:
|
|
msg: |
|
|
========================================
|
|
S3FS Setup Complete on {{ inventory_hostname }}!
|
|
========================================
|
|
|
|
✅ All S3 buckets mounted successfully
|
|
|
|
Mount points:
|
|
{% for bucket in s3_buckets %}
|
|
- {{ bucket.mount_point }} ({{ bucket.name }})
|
|
{% endfor %}
|
|
|
|
Cache configuration:
|
|
- Location: /var/cache/s3fs
|
|
- Max size: ~{{ (40 - (s3fs_ensure_diskfree / 1024)) | int }}GB
|
|
- Free space reserved: {{ (s3fs_ensure_diskfree / 1024) | int }}GB
|
|
|
|
{% if inventory_hostname in groups['services_servers'] %}
|
|
Immich library structure created at:
|
|
/mnt/s3/immich/library/
|
|
├── backups/
|
|
├── encoded-video/
|
|
├── library/
|
|
├── profile/
|
|
├── thumbs/
|
|
└── upload/
|
|
|
|
Next steps for Immich migration:
|
|
1. Manually sync data from legacy server:
|
|
rsync -avz --info=progress2 \
|
|
asxpio-old:/srv/immich/library/ \
|
|
/mnt/s3/immich/library/
|
|
|
|
2. Backup Immich PostgreSQL database on legacy server:
|
|
docker exec immich_postgres pg_dumpall -U postgres | gzip > /tmp/immich-db.sql.gz
|
|
|
|
3. Deploy Immich service configured to use S3 storage:
|
|
IMMICH_MEDIA_LOCATION=/mnt/s3/immich/library
|
|
{% endif %}
|
|
|
|
========================================
|