155 lines
4.1 KiB
YAML
155 lines
4.1 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: Copy database from backup
|
|
copy:
|
|
src: /tmp/forgejo-restore/gitea.db
|
|
dest: /opt/forgejo/data/gitea/gitea.db
|
|
remote_src: true
|
|
owner: 1000
|
|
group: 1000
|
|
mode: '0644'
|
|
|
|
- name: Copy avatars from backup
|
|
synchronize:
|
|
src: /tmp/forgejo-restore/data/avatars/
|
|
dest: /opt/forgejo/data/gitea/data/avatars/
|
|
delegate_to: "{{ inventory_hostname }}"
|
|
ignore_errors: true
|
|
|
|
- name: Copy repo-avatars from backup
|
|
synchronize:
|
|
src: /tmp/forgejo-restore/data/repo-avatars/
|
|
dest: /opt/forgejo/data/gitea/data/repo-avatars/
|
|
delegate_to: "{{ inventory_hostname }}"
|
|
ignore_errors: true
|
|
|
|
- name: Copy repo-archive from backup
|
|
synchronize:
|
|
src: /tmp/forgejo-restore/data/repo-archive/
|
|
dest: /opt/forgejo/data/gitea/data/repo-archive/
|
|
delegate_to: "{{ inventory_hostname }}"
|
|
ignore_errors: true
|
|
|
|
- name: Copy attachments from backup
|
|
synchronize:
|
|
src: /tmp/forgejo-restore/data/attachments/
|
|
dest: /opt/forgejo/data/gitea/data/attachments/
|
|
delegate_to: "{{ inventory_hostname }}"
|
|
ignore_errors: true
|
|
|
|
- name: Copy repositories from backup
|
|
synchronize:
|
|
src: /tmp/forgejo-restore/data/gitea-repositories/
|
|
dest: /opt/forgejo/data/git/repositories/
|
|
delegate_to: "{{ inventory_hostname }}"
|
|
|
|
- name: Set correct ownership for all Forgejo data
|
|
file:
|
|
path: /opt/forgejo/data
|
|
owner: 1000
|
|
group: 1000
|
|
recurse: true
|
|
|
|
- name: Start Forgejo container
|
|
community.docker.docker_compose_v2:
|
|
project_src: /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
|
|
shell: docker exec -u git forgejo forgejo admin user list
|
|
register: user_list
|
|
ignore_errors: true
|
|
|
|
- name: Display restore information
|
|
debug:
|
|
msg: |
|
|
Forgejo restore completed successfully!
|
|
|
|
Users:
|
|
{{ user_list.stdout }}
|
|
|
|
Forgejo is now running at:
|
|
- Internal: http://localhost:{{ 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
|