iac/ansible/roles/forgejo_restore/tasks/main.yaml
2025-11-04 11:06:35 +02:00

142 lines
4 KiB
YAML

---
- name: Find backup files on server
find:
paths: "{{ backup_dest_dir }}"
patterns: "forgejo-full-backup-*.tar.gz"
register: server_backup_files
- name: Fail if no backup files found
fail:
msg: "No backup files found in {{ backup_dest_dir }}. Please run backup-forgejo.yaml first."
when: server_backup_files.files | length == 0
- name: Select most recent backup file
set_fact:
backup_file: "{{ (server_backup_files.files | sort(attribute='mtime', reverse=true) | first).path }}"
- name: Display backup file to be restored
debug:
msg: "Restoring from: {{ backup_file }}"
- name: Stop Forgejo container
community.docker.docker_compose_v2:
project_src: /opt/forgejo
state: stopped
ignore_errors: true
- name: Backup current Forgejo data (if exists)
archive:
path: /opt/forgejo/data
dest: "/opt/forgejo/data-backup-{{ ansible_date_time.epoch }}.tar.gz"
format: gz
ignore_errors: true
- name: Remove old data directory
file:
path: /opt/forgejo/data
state: absent
- name: Create fresh data directory structure
file:
path: "{{ item.path }}"
state: directory
owner: 1000
group: 1000
mode: "{{ item.mode | default('0755') }}"
loop:
- { path: '/opt/forgejo/data' }
- { path: '/opt/forgejo/data/gitea' }
- { path: '/opt/forgejo/data/gitea/data' }
- { path: '/opt/forgejo/data/git' }
- { path: '/opt/forgejo/data/git/repositories' }
- { path: '/opt/forgejo/data/git/.ssh', mode: '0700' }
- name: Create temporary restore directory
file:
path: /tmp/forgejo-restore
state: directory
mode: '0755'
- name: Extract backup to temporary location
unarchive:
src: "{{ backup_file }}"
dest: /tmp/forgejo-restore/
remote_src: true
- name: Set backup source path
set_fact:
backup_source: "/tmp/forgejo-restore/forgejo-backup-staging"
- name: Copy database from backup
copy:
src: "{{ backup_source }}/gitea.db"
dest: /opt/forgejo/data/gitea/gitea.db
remote_src: true
owner: 1000
group: 1000
mode: '0644'
- name: Copy data directories from backup
ansible.builtin.copy:
src: "{{ backup_source }}/data/{{ item.src }}/"
dest: "{{ forgejo_base_path | default('/opt/forgejo') }}/data/{{ item.dest }}/"
remote_src: true
owner: 1000
group: 1000
mode: preserve
loop:
- { src: "avatars", dest: "gitea/data/avatars" }
- { src: "repo-avatars", dest: "gitea/data/repo-avatars" }
- { src: "repo-archive", dest: "gitea/data/repo-archive" }
- { src: "attachments", dest: "gitea/data/attachments" }
- { src: "gitea-repositories", dest: "git/repositories" }
ignore_errors: "{{ item.src != 'gitea-repositories' }}" # Only fail on repositories copy failure
- name: Set correct ownership for all Forgejo data
ansible.builtin.file:
path: "{{ forgejo_base_path | default('/opt/forgejo') }}/data"
owner: 1000
group: 1000
recurse: true
- name: Start Forgejo container
community.docker.docker_compose_v2:
project_src: "{{ forgejo_base_path | default('/opt/forgejo') }}"
state: present
- name: Wait for Forgejo to be healthy
wait_for:
host: localhost
port: "{{ forgejo_http_port }}"
timeout: 60
delay: 5
- name: Clean up temporary files
file:
path: /tmp/forgejo-restore
state: absent
- name: Verify users in database
ansible.builtin.command: docker exec -u git forgejo forgejo admin user list
register: user_list
changed_when: false
ignore_errors: true
- name: Display restore information
debug:
msg: |
Forgejo restore completed successfully!
Users:
{{ user_list.stdout_lines | join('\n ') }}
Forgejo is now running at:
- Internal: http://{{ asxpio_ops_wireguard_ip }}:{{ forgejo_http_port }}
- External: https://{{ forgejo_domain }}
Next steps:
1. Test web interface: https://{{ forgejo_domain }}
2. Verify avatars and images are visible
3. Test login with your credentials
4. Test git clone: git clone https://{{ forgejo_domain }}/user/repo.git
5. Check logs: docker logs forgejo