Cómo Instalar Gitea en FreeBSD usando AppJail Director

Manejar nuestros proyectos de desarrollo es muy fácil actualmente, hay demasiados servicios para escoger, con menos o con más características, pero hay uno en particular, de código abierto, auto-hospedable, con muchísimas características, y la mejor parte, que se puede instalar en FreeBSD. Ese genial proyecto es Gitea, un software para hospedar nuestros proyectos usando git, que además cuenta con funciones colaborativas como rastreo de incidentes, revisión de código, integración continua, tickets y wikis.

En este artículo instalaremos Gitea y PostgreSQL en FreeBSD usando AppJail Director.

Pasos preliminares

En mi sistema tengo la siguiente configuración:

/etc/rc.conf (Solo lo relevante es mostrado):

# AppJail
appjail_enable="YES"
appjail_dns_enable="YES"
# Recomendable if tu dirección IP cambia, entonces podremos usar la siguiente dirección IP en nuestras jaulas.
ifconfig_tap0_name="ajdns"
ifconfig_ajdns="inet 172.0.0.1/32"
# DNSMasq
dnsmasq_enable="YES"
dnsmasq_conf="/usr/local/share/appjail/files/dnsmasq.conf"
# Habilitar net.inet.ip.forwarding.
gateway_enable="YES"

/usr/local/etc/appjail/appjail.conf:

EXT_IF=jext
ON_IF=jext
FREEBSD_VERSION=14.0-RELEASE
FREEBSD_ARCH=amd64
IMAGE_ARCH=amd64
ENABLE_DEBUG=0
ENABLE_ZFS=1
SHORTEN_DOMAIN_NAMES=1
DEFAULT_RESOLV_CONF=/usr/local/etc/appjail/resolv.conf
/usr/local/etc/appjail/resolv.conf:
nameserver 172.0.0.1 
/etc/pf.conf:
nameserver 172.0.0nat-anchor 'appjail-nat/jail/*'
nat-anchor "appjail-nat/network/*"
rdr-anchor "appjail-rdr/*".1
Console Output:
# service appjail-dns status
appjail_dns is running as pid 97063.
# service dnsmasq status
dnsmasq is running as pid 98251.
# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 1
# freebsd-version
14.0-RELEASE-p4
# uname -r
14.0-RELEASE-p4
# appjail version
3.0.0.20231220+9468250a2fb7e6f6e6f63a89eb0892e325d1cf83
# appjail-director --version
appjail-director, version 0.7.0
# zfs list zroot
NAME USED AVAIL REFER MOUNTPOINT
zroot 72.1G 531G 24K none
# ifconfig ajdns
ajdns: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 58:9c:fc:10:8e:0c
inet 172.0.0.1 netmask 0xffffffff broadcast 172.0.0.1
groups: tap
media: Ethernet 1000baseT <full-duplex>
status: no carrier
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
# ifconfig jext
jext: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=4e524bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
ether 00:1b:24:e0:6d:a3
inet 192.168.1.105 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
Estoy usando la versión de desarrollo de AppJail, por lo que estar atentos a la versión y al commit hash del que estén usando.

Nota: Mantener AppJail y Director actualizados y sincronizados.

La red virtual es la siguiente, pero en estos días no es necesario preocuparse por ella dado que AppJail la crea si no existe:
# appjail network list
NAME   NETWORK   CIDR  BROADCAST      GATEWAY   MINADDR   MAXADDR        ADDRESSES  DESCRIPTION
ajnet  10.0.0.0  10    10.63.255.255  10.0.0.1  10.0.0.1  10.63.255.254  4194302    AppJail network
Si necesitas más información, he aquí los lugares relevantes para este artículo en la documentación de AppJail:

*.- Introducción
*.- Configuración
*.- Introducción a las Redes Virtuales
*.- DNS


Desplegando Gitea

Como se explica en AppJail-makejails/gitea#basic-usage hay que pasar las variables de entorno de la siguiente forma:

1.- Las variables de entorno deben tener la siguiente forma: GITEA__SECTION_NAME__KEY_NAME.
2.- SECTION y KEY_NAME deben estar en mayúsculas. Pueden contener _ y números.
3.- _0X2E_ será remplazados por . y _0X2D_ por ..
4.- Para usar la sección global o predeterminada, usa DEFAULT como sección.

Por lo que nuestro archivo Director es el siguiente:


appjail-director.yml:
options:
- virtualnet: ":<random> default"
- nat:

services:
gitea:
name: gitea
makejail: gh+AppJail-makejails/gitea
options:
- expose: 3000
- expose: '2022:22'
- copydir: !ENV '${PWD}/gitea/files'
- file: /etc/rc.conf.local
arguments:
- gitea_tag: '14.0'
environment:
- GITEA__DATABASE__DB_TYPE: 'postgres'
- GITEA__DATABASE__HOST: 'gitea-postgres:5432'
- GITEA__DATABASE__NAME: 'gitea'
- GITEA__DATABASE__USER: 'gitea'
- GITEA__DATABASE__PASSWD: 'gitea'
- GITEA__SERVER__SSH_PORT: 2022
- GITEA__SERVER__DOMAIN: '192.168.1.105'
- GITEA__DEFAULT__APP_NAME: 'Welcome to my git server!'
volumes:
- gitea-db: gitea-db
- gitea-git: gitea-git

db:
name: gitea-postgres
makejail: gh+AppJail-makejails/postgres
options:
- template: !ENV '${PWD}/postgres/template.conf'
arguments:
- postgres_tag: '14.0-16'
environment:
- POSTGRES_PASSWORD: 'gitea'
- POSTGRES_USER: 'gitea'
- POSTGRES_DB: 'gitea'
volumes:
- pg-done: pg-done
- pg-data: pg-data

default_volume_type: '<volumefs>'

volumes:
gitea-git:
device: .volumes/gitea/git
gitea-db:
device: .volumes/gitea/db
pg-data:
device: .volumes/postgres/data
pg-done:
device: .volumes/postgres/done
 .env:
DIRECTOR_PROJECT=gitea
postgres/template.conf:
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
sysvmsg: new
sysvsem: new
sysvshm: new
mount.devfs
gitea/files/etc/rc.conf.local:
sshd_enable="YES"
Hay muchas cosas que AppJail y Director realizan por nosotros en un solo archivo pero lo explicaré en breve. Por el momento solo ejecutemos el proyecto y veamos el resultado:
# appjail-director up
appjail-director up
Starting Director (project:gitea) ...
Creating db (gitea-postgres) ... Done.
Creating gitea (gitea) ... Done.
Finished: gitea
# appjail-director info
gitea:
state: DONE
last log: /root/.director/logs/2023-12-22_21h33m25s
locked: false
services:
+ db (gitea-postgres)
+ gitea (gitea)
Como se puede apreciar, solo un comando es lo que se usó para desplegar Gitea y PostgreSQL, pero si ingresamos a http://192.168.1.105:3000 en el navegador de otro sistema, Gitea no muestra nada. No hay de qué precouparse, veamos si el proceso está corriendo:
# appjail service jail gitea gitea status
gitea is running as pid 91657.
Después de que Gitea se inicialice correctamente, podemos registrarnos, crear un repositorio, o, por ejemplo, agregar nuestra clave SSH en Profile & Settings > Settings > SSH / GPG Keys.
 
Profile and Settings...
Profile and Settings...
 
SSH / GPG Keys
Concepto de efímero

Desde la página de inicio de Director:

Director trata cada jaula como efímera. Esto no quiere decir que sus jaulas no persistirán después de que las detengas o que su sistema se reinicie, lo que quiere decir es que Director asume que es seguro destruir sus jaulas ya que se ha separado los datos que deben persistir de los que no.

Incluso si nuestras jaulas son un tipo de "Jaulas con estado", esto no significa que no podamos usarlas como "Jaulas efímeras". La idea de tener jaulas efímeras es muy simple, pero tiene demasiadas ventajas que probablemente quedarían mejor descritas en otro artículo: los datos son separados en dos tipos, los que deben persistir de los que no. Ya hemos hecho esto, por lo que si realizamos lo siguiente...
# appjail-director down -d
Starting Director (project:gitea) ...
Stopping gitea (gitea) ... Done.
Destroying gitea (gitea) ... Done.
Stopping db (gitea-postgres) ... Done.
Destroying db (gitea-postgres) ... Done.
Destroying gitea ... Done.
# appjail-director info
gitea: Project not found.
 
¡Nuestro proyecto se ha ido!
 
No te preocupes, esto es lo que solucionan los volúmenes:
# tree -L 2 .volumes
.volumes
├── gitea
│ ├── db
│ └── git
└── postgres
├── data
└── done

7 directories, 0 files
 
Por lo que podremos crear nuestro proyecto otra vez (y los datos persistirán):
# appjail-director up
Starting Director (project:gitea) ...
Creating db (gitea-postgres) ... Done.
Creating gitea (gitea) ... Done.
Finished: gitea
# appjail-director info
gitea:
state: DONE
last log: /root/.director/logs/2023-12-22_21h51m23s
locked: false
services:
+ db (gitea-postgres)
+ gitea (gitea)
 
Y nuestras claves SSH estarán intactas:
# cat .volumes/gitea/git/.ssh/authorized_keys
# gitea public key
command="/usr/local/sbin/gitea --config=/usr/local/etc/gitea/conf/app.ini serv key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG8B02AxX4CBRHNQHAwQIZUE454ZixeqSkAG7b9OOMxa dtxdf@dtxdf-laptop
Fuente: https://dtxdf.github.io/post/how-to-install-gitea-on-freebsd-using-appjail-director/

Contribución gracias a ~ DtxdF

Comentarios