--- - name: Install prerequisites ansible.builtin.apt: name: - ca-certificates - curl - gnupg - apt-transport-https state: present update_cache: true - name: Check if Docker is installed ansible.builtin.command: which docker register: docker_installed changed_when: false failed_when: false - name: Add Docker GPG key ansible.builtin.get_url: url: https://download.docker.com/linux/debian/gpg dest: /usr/share/keyrings/docker-archive-keyring.asc mode: '0644' when: docker_installed.rc != 0 - name: Add Docker repository ansible.builtin.deb822_repository: name: docker types: deb uris: https://download.docker.com/linux/debian suites: "{{ ansible_facts['distribution_release'] }}" components: stable architectures: "{{ ansible_facts['architecture'] | replace('x86_64', 'amd64') }}" signed_by: /usr/share/keyrings/docker-archive-keyring.asc state: present when: docker_installed.rc != 0 - name: Install Docker packages ansible.builtin.apt: name: - docker-ce - docker-ce-cli - containerd.io - docker-compose-plugin state: present update_cache: true when: docker_installed.rc != 0 - name: Ensure Docker service is started and enabled ansible.builtin.systemd: name: docker state: started enabled: true - name: Add ansible user to docker group ansible.builtin.user: name: ansible groups: docker append: true - name: Create Forgejo data directory ansible.builtin.file: path: "{{ forgejo_data_dir }}" state: directory owner: root group: root mode: '0755' - name: Deploy docker-compose.yml ansible.builtin.template: src: docker-compose.yml.j2 dest: "{{ forgejo_data_dir }}/docker-compose.yml" owner: root group: root mode: '0644' - name: Check if Forgejo is running ansible.builtin.command: cmd: docker compose ps --services --filter "status=running" chdir: "{{ forgejo_data_dir }}" register: forgejo_running changed_when: false failed_when: false - name: Stop and remove stale Forgejo container ansible.builtin.command: cmd: docker compose down -v chdir: "{{ forgejo_data_dir }}" when: "'forgejo' in forgejo_running.stdout_lines | default([])" - name: Clean Forgejo data for fresh install ansible.builtin.file: path: "{{ forgejo_data_dir }}/data" state: absent - name: Recreate Forgejo data directory ansible.builtin.file: path: "{{ forgejo_data_dir }}" state: directory owner: root group: root mode: '0755' - name: Start Forgejo with INSTALL_LOCK ansible.builtin.command: cmd: docker compose up -d chdir: "{{ forgejo_data_dir }}" register: forgejo_started - name: Wait for Forgejo to be ready ansible.builtin.uri: url: http://127.0.0.1:3000/ method: GET status_code: 200 register: web_ready retries: 30 delay: 2 until: web_ready.status == 200 changed_when: false - name: Check if admin user exists ansible.builtin.uri: url: http://127.0.0.1:3000/api/v1/users/{{ forgejo_admin_user }} method: GET status_code: [200, 404] register: admin_check changed_when: false - name: Create admin user via docker exec ansible.builtin.command: cmd: > docker exec -u git -w /data/gitea forgejo forgejo admin user create --config /data/gitea/conf/app.ini --username {{ forgejo_admin_user }} --password {{ forgejo_admin_password }} --email {{ forgejo_admin_email }} --admin when: admin_check.status == 404 no_log: true - name: Verify admin user exists ansible.builtin.uri: url: http://127.0.0.1:3000/api/v1/users/{{ forgejo_admin_user }} method: GET status_code: 200 changed_when: false