# Gitea

- [Gitea](#gitea)
  - [Staging](#staging)
  - [Install](#install)
  - [Backup and Restore](#backup-and-restore)
  - [Gitea Runners](#gitea-runners)
    - [Install](#install-1)
    - [Cache Cleanup](#cache-cleanup)

Gitea provides a helm chart [here](https://gitea.com/gitea/helm-chart/). We're not
going to modify much, but we are going to solidify some of the default values in case
they decide to change things. This is the first chart (besides ingress-nginx) where
we need to pay attention to the MetalLB annotation. This has been set in the values.yaml
file.

## Staging

There is a `gitea-staging.yaml` file with staging values. This should be installed in
the `gitea-staging` namespace. Follow the instructions below, but replace the `gitea`
namespace with `gitea-staging`. Staging is useful for testing major release upgrades,
especially since Gitea tends to change how `values.yaml` is structured.

## Install

First we need to create the gitea admin secret

```bash
kubectl create namespace gitea
kubectl create secret generic gitea-admin-secret \
    -n gitea \
    --from-literal=username='gitea-admin' \
    --from-literal=password="$(pwgen -c -s 64 | head -n 1)" \
    --from-literal=email=''
```

```bash
helm repo add gitea-charts https://dl.gitea.io/charts/
helm repo update
helm upgrade --install \
    gitea \
    gitea-charts/gitea \
    --values active/kubernetes_gitea/gitea-values.yaml \
    --namespace gitea \
    --create-namespace
```

## Backup and Restore

If you need to backup your database you can run:

```bash
# Backup
kubectl exec -it -n gitea gitea-postgresql-0 -- \
    pg_dump \
    --no-owner \
    --dbname=postgresql://gitea:gitea@localhost:5432 > gitea_backup.db

# Take gitea down to zero pods
kubectl scale statefulset gitea --replicas 0

# Drop the existing database
kubectl exec -it -n gitea gitea-postgresql-0 -- psql -U gitea

\c postgres;
drop database gitea;
CREATE DATABASE gitea WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
exit

# restore from backup
kubectl exec -it -n gitea gitea-postgresql-0 -- \
    psql \
    postgresql://gitea:gitea@localhost:5432 gitea < gitea_backup.db

# Restore gitea to 1 pod
kubectl scale statefulset gitea --replicas 1
```

## Gitea Runners

<https://docs.gitea.com/next/usage/actions/act-runner/#install-with-the-docker-image>

### Install

```bash
touch config.yaml

# Add `-e CONFIG_FILE=/config.yaml` to mount a config file

docker run \
    -v $PWD/config.yaml:/config.yaml \
    -v $PWD/data:/data \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e GITEA_INSTANCE_URL=https://gitea.reeseapps.com \
    -e GITEA_RUNNER_REGISTRATION_TOKEN=m8ZJGE5yEys6oC0trni1o2CkKrmufTnI7dxXZfIi \
    -e GITEA_RUNNER_NAME=kube_runner \
    -e GITEA_RUNNER_LABELS="ubuntu-latest:docker://catthehacker/ubuntu:act-latest", \
    --restart always \
    --name kube_runner \
    -d gitea/act_runner:latest
```

### Cache Cleanup

Each org or project with a package registry will have its own cleanup rules. For example,
services -> settings -> Packages -> Add Cleanup Rule will allow you to create a cleanup
rule for packages stored under the "services" org. These cleanup rules should run automatically.

On the other hand, the docker builder cache will balloon out of control over time. The gitea
docker runner is handled outside of Gitea's context, so you'll need to clean it up yourself.

```bash
# Check used system resources
docker system df
```

You should run something like this on a schedule:

```bash
# Prune the builder cache
docker builder prune -a
```

To run it every day at midnight: `crontab -e`

```bash
0 0 * * * yes | docker builder prune -a
```
