From 5da929c96b3e97483f3e2da27942bd9a1738357b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20A=2E=20Ortega=20Froysa?= Date: Fri, 10 Feb 2023 16:54:59 +0100 Subject: [PATCH] SRI::fossil-setup: add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolás A. Ortega Froysa --- .../assignments/fossil-setup/fossil-setup.md | 123 ++++++++++++++++++ .../assignments/fossil-setup/nginx-fossil.jpg | Bin 0 -> 19525 bytes 2 files changed, 123 insertions(+) create mode 100644 2/SRI/assignments/fossil-setup/fossil-setup.md create mode 100644 2/SRI/assignments/fossil-setup/nginx-fossil.jpg diff --git a/2/SRI/assignments/fossil-setup/fossil-setup.md b/2/SRI/assignments/fossil-setup/fossil-setup.md new file mode 100644 index 0000000..ac38ba1 --- /dev/null +++ b/2/SRI/assignments/fossil-setup/fossil-setup.md @@ -0,0 +1,123 @@ +# Configuración de un Servidor Fossil + +Nicolás A. Ortega Froysa + +## Introducción + +Fossil es un sistema de gestión de versiones, considerado generalmente como +alternativa a Git, pero que contiene además soporte para muchos elementos que +suelen estar asociados a los proyectos de código, como serían Wiki y una +herramienta de gestión de tarea. Es una herramienta poco usada en ámbitos +generales, pero sí se usa para el proyecto conocido SQLite. También tiene la +ventaja de que todo está contenido dentro del mismo repositorio, y por tanto se +puede compartir fácilmente, y descentralizar el control del código. + +## Instalación de Fossil + +Antes de configurar nuestro servicio hemos de instalar Fossil en nuestro +servidor. Como estamos usando un sistema Debian, lo instalamos utilizando el +comando siguiente: + +``` +# apt install fossil +``` + +## Creación del Repositorio + +Una vez instalado, vamos a crear el repositorio como tal, que consta de un +archivo que guardaremos en el servidor. Para hacer esto primero hemos de crear +el usuario y grupo que se encargará de gestionar este repositorio. + +``` +# groupadd fossil +# useradd -d /srv/fossil -m -g fossil -s /usr/sbin/nologin fossil +``` + +Esto creará el directorio `/srv/fossil` que lo usaremos para guardar el archivo +del repositorio. Para crear el repositorio como tal hemos de correr el comando +siguiente: + +``` +# cd /srv/fossil +# fossil init semanaverde.fossil +project-id: 88b14f646618a2bbef27386242a857e56c55ced3 +server-id: 23476a9b53e66b1866c04de1d59a4947bb068869 +admin-user: root (initial password is "qbHCunmSj8") +``` + +Esto nos mostrará el usuario y la contraseña del usuario administrador, que +deberíamos guardarlo para luego. + +Finalmente, para que el usuario `fossil` pueda acceder al archivo (y más +importante, modificarlo) cambiamos el dueño del archivo: + +``` +# chown fossil:fossil semanaverde.fossil +``` + +## Configuración del Servidor + +El servidor de Fossil (web) se accede mejor por medio de un SCGI. Para esto, lo +que más nos conviene (en un sistema Debian) es crear un servicio de Systemd para +que se inicialice al iniciar el sistema. Para eso crearemos +`/usr/lib/systemd/system/fossil-server.service` con el contenido siguiente: + +``` +[Unit] +Description=Fossil user server +After=network-online.target + +[Service] +WorkingDirectory=/srv/fossil +ExecStart=/usr/bin/fossil server --scgi --localhost --port 8080 /srv/fossil/semanaverde.fossil +User=fossil +Group=fossil +Restart=always +RestartSec=3 + +[Install] +WantedBy=multi-user.target +``` + +Ahora ya podremos gestionar nuestro servicio por medio de `systemctl` como +cualquier otro servicio. Como queremos habilitar y encender este servicio, +corremos los comandos siguientes: + +``` +# systemctl enable fossil-server.service +# systemctl start fossil-server.service +``` + +## Configuración del Proxy con Nginx + +Una vez que tengamos el servicio puesto, es necesario crear un proxy que apunta +(y traduce) a nuestro servidor Fossil. En nuestro caso usaremos el servidor HTTP +Nginx. Crearemos un archivo de configuración Nginx con el __path__ +`/etc/nginx/sites-available/repo.semanaverde.com.es.conf` con el contenido +siguiente: + +![Configuración Nginx Fossil](nginx-fossil.jpg) + +Ahora creamos un enlace simbólico para que Nginx vea esta configuración, +habilitándolo: + +``` +# cd /etc/nginx/sites-enabled +# ln -s ../sites-available/repo.semanaverde.com.es.conf ./ +``` + +Comprobamos que está escrito correctamente el código: + +``` +# nginx -t +``` + +Si todo sale bien, reiniciamos Nginx para poder tener acceso a nuestro servicio +de Fossil: + +``` +# systemctl reload nginx.service +``` + +Ya con esto podremos acceder a nuestro servicio Fossil desde +`repo.semanaverde.com.es`. diff --git a/2/SRI/assignments/fossil-setup/nginx-fossil.jpg b/2/SRI/assignments/fossil-setup/nginx-fossil.jpg new file mode 100644 index 0000000000000000000000000000000000000000..218dd19bff0c1dfd7267cf297254758c0c432344 GIT binary patch literal 19525 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