Despliegue automático de servidor Git (Gitea) con Ansible: fuente de código privada en minutos

Despliegue automático de servidor Git (Gitea) con Ansible: fuente de código privada en minutos

¿Te gustaría montar tu propio servidor Git privado en cuestión de minutos, totalmente gestionado y listo para tu equipo o tus proyectos personales? Hoy te traigo un playbook de Ansible para desplegar Gitea, la alternativa ligera y open source a GitHub y GitLab, ideal para equipos ágiles o makers tecnológicos. Además, vamos a incluir la gestión como servicio, la creación de usuarios iniciales ¡y soporte SSL automático opcional!

¿Por qué un servidor Gitea?

  • Repositorios privados sin depender de terceros.
  • Ligero y rápido: consumo de recursos muy bajo, ideal incluso para una VM pequeña o Raspberry Pi.
  • Gestión web sencilla para repos, usuarios, issues, wiki, pull requests, etiquetas…
  • Automatizable al 100%, ideal para integrar en pipelines de CI/CD y controlar tu infraestructura como código.

Playbook Ansible completo y comentado

El siguiente playbook instala
Gitea (binario oficial), configura el servicio, prepara las dependencias y recomienda el uso de Let’s Encrypt opcionalmente si deseas SSL seguro. Solo necesitas un servidor Linux (Ubuntu 20.04+/Debian 11+), con sudo y acceso por SSH.

Puedes adaptar las variables del principio para tu dominio, directorios, usuario inicial y contraseña.

---
- name: Despliega y configura un servidor Gitea supervisado
  hosts: gitea_server
  become: yes
  vars:
    gitea_version: "1.21.7"
    gitea_user: "git"
    gitea_group: "git"
    gitea_home: "/home/git"
    gitea_data_dir: "/var/lib/gitea"
    gitea_cfg_dir: "/etc/gitea"
    gitea_log_dir: "/var/log/gitea"
    gitea_domain: "git.midominio.local"
    gitea_ssl_enabled: false         # Cambia a true si quieres usar Let's Encrypt
    gitea_ssl_email: "[email protected]"
    gitea_http_port: 3000
    gitea_root_password: "supersegura123"   # Cambia esto en producción
    gitea_root_email: "[email protected]"

  tasks:
    - name: Instala dependencias necesarias
      ansible.builtin.apt:
        pkg:
          - git
          - wget
          - sqlite3
          - ca-certificates
          - openssl
          - nano
          - acl
          - curl
        update_cache: yes

    - name: Crea usuario y directorios para Gitea
      ansible.builtin.user:
        name: "{{ gitea_user }}"
        shell: /bin/bash
        home: "{{ gitea_home }}"
        create_home: yes
      register: gituser

    - name: Crea directorios de Gitea
      ansible.builtin.file:
        path: "{{ item }}"
        state: directory
        owner: "{{ gitea_user }}"
        group: "{{ gitea_group }}"
        mode: '0755'
      loop:
        - "{{ gitea_cfg_dir }}"
        - "{{ gitea_data_dir }}"
        - "{{ gitea_log_dir }}"

    - name: Descarga binario oficial de Gitea
      ansible.builtin.get_url:
        url: "https://dl.gitea.io/gitea/{{ gitea_version }}/gitea-{{ gitea_version }}-linux-amd64"
        dest: "/usr/local/bin/gitea"
        mode: '0755'
        owner: root
        group: root

    - name: Crea archivo de configuración
      ansible.builtin.template:
        src: gitea_app.ini.j2
        dest: "{{ gitea_cfg_dir }}/app.ini"
        owner: "{{ gitea_user }}"
        group: "{{ gitea_group }}"
        mode: '0640'

    - name: Crea servicio systemd para Gitea
      ansible.builtin.template:
        src: gitea.service.j2
        dest: /etc/systemd/system/gitea.service
        owner: root
        group: root
        mode: '0644'

    - name: Recarga systemd y habilita servicio
      ansible.builtin.systemd:
        name: gitea
        daemon_reload: yes
        state: started
        enabled: yes

    - name: Espera a que Gitea levante el puerto
      ansible.builtin.wait_for:
        port: "{{ gitea_http_port }}"
        host: 127.0.0.1
        delay: 2
        timeout: 30

    - name: Crea usuario administrador por API (opcional, requiere conexión localhost)
      ansible.builtin.command: >
        /usr/local/bin/gitea admin user create
        --username=admin
        --password="{{ gitea_root_password }}"
        --email="{{ gitea_root_email }}"
        --admin
        --config="{{ gitea_cfg_dir }}/app.ini"
      args:
        creates: "{{ gitea_data_dir }}/created_admin_flag"
      become_user: "{{ gitea_user }}"
      register: adminuser_out
      failed_when: false

    - name: Crea flag de usuario creado
      ansible.builtin.file:
        path: "{{ gitea_data_dir }}/created_admin_flag"
        state: touch
        owner: "{{ gitea_user }}"
        group: "{{ gitea_group }}"
      when: adminuser_out.rc == 0

    - name: Instala Certbot y configura SSL automático (opcional)
      ansible.builtin.include_tasks: ssl.yml
      when: gitea_ssl_enabled

  handlers:
    - name: Reinicia Gitea
      ansible.builtin.systemd:
        name: gitea
        state: restarted

Nota: Este playbook utiliza dos plantillas template (gitea_app.ini.j2 y gitea.service.j2) y un posible ssl.yml para Let’s Encrypt. Puedes personalizarlas fácilmente según tus necesidades.

Plantilla ejemplo gitea_app.ini.j2

[server]
DOMAIN = {{ gitea_domain }}
HTTP_PORT = {{ gitea_http_port }}
ROOT_URL = http://{{ gitea_domain }}:{{ gitea_http_port }}/
DISABLE_SSH = false
START_SSH_SERVER = true
SSH_PORT = 2222
[database]
DB_TYPE = sqlite3
PATH = {{ gitea_data_dir }}/gitea.db
[security]
INSTALL_LOCK = true
SECRET_KEY = cambiaestoluego
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false

Consejos extra y troubleshooting

  • Prueba acceso desde http://tu_servidor:3000 tras ejecutar el playbook.
  • Si planeas publicar el servicio en internet, activa la opción SSL y abre ambos puertos 80/443 en tu cortafuegos/seguridad cloud.
  • ¿Más usuarios? Usa la API de Gitea o repite el gitea admin user create cambiando credenciales.
  • Consulta el log en /var/log/gitea/gitea.log para depurar problemas de arranque.
  • Mantén actualizado Gitea cambiando simplemente la variable gitea_version y re-ejecutando el playbook.

¡Con esto tienes una base sólida y escalable para tus proyectos, hackatones o equipos internos!

Avatar

Por Mid