aboutsummaryrefslogtreecommitdiff
path: root/posts/cgit-nginx-ubuntu/main.md
blob: c225bd4443097c04ae53f83bf32be47be0306ccf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Installing cGit behind NGINX on Ubuntu
======================================

[cGit](https://git.zx2c4.com/cgit/about/) is a fast web interface based on the CGI specification. It is lightweight and doesn't require a database or web authentication system.

It's easy to configure. For some reason, all the online guides for Ubuntu decided they needed to compile it from scratch and write their own start scripts in a mix of perl and bash. You don't need superhero sysadmin skills from the late 90s. All components are packaged with systemd units... there is a better way...

### 1. Install `cgit` and `fcgiwrap`.

`fcgiwrap` will create a socket NGINX can use to pass the CGI variables to cGit: 
```
sudo apt install fcgiwrap
sudo apt install cgit
```

### 2. Modify the `cgitrc` file under `/etc/cgitrc` to your liking: 
```
# See cgitrc(5)
# prepend this string to every url
virtual-root=/
enable-index-links=1
enable-commit-graph=1

root-title=My Git Repos
root-desc=I exclusivly write code in Smalltalk-71
logo=/assets/my_custom_logo.png

# Add site-specific configuration
# ...

```

### 3. Optionally create an assets directory and add your custom logo / css:
```
mkdir /var/www/html/assets
cp my_custom_logo.png /var/www/html/assets
```

### 4. Configure NGINX

Add the site to NGINX. This launches the `cgit.cgi` executable passing it to the `fcgiwrap` socket:
```conf
echo >/etc/nginx/sites-available/cgit.conf <<EOF
server {
    listen 80;

    server_name  git.domain.com;
    server_name  www.git.domain.com;

    root /usr/share/cgit;

    # Maintainer overridden assets will live in /assets
    # This allows you to change add a custom logo or modified CSS
    # See cgitrc(5)
    location ~* /assets {
        root /var/www/html;
        expires 30d;
    }

    # Fallback to static assets included by cGit 
    location ~* ^.+\.(css|png|ico)$ {
        root /usr/share/cgit;
        expires 30d;
    }

    try_files $uri @cgit;

    location @cgit {
        fastcgi_param   SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
        fastcgi_param   PATH_INFO       $uri;
        fastcgi_param   QUERY_STRING    $args;
        fastcgi_param   HTTP_HOST       $server_name;
        fastcgi_pass    unix:/run/fcgiwrap.socket;
    }

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;
}
EOF
```

### 4. Enable the site:
```bash
ln -s /etc/nginx/sites-available/git.conf /etc/nginx/sites-enabled/cgit.conf
```

Note: all files in sites-enabled should be included in `nginx.conf`'s http section:
```conf
include /etc/nginx/sites-enabled/*;
```

### 5. Restart NGINX

```
sudo systemctl restart nginx
```