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!