all repos

mugit @ f9a31fe

🐮 git server that your cow will love

mugit/README.md(view raw)

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# mugit

A lightweight, self-hosted Git server that your cow will love.

[See it in action!](https://git.olexsmir.xyz)

## Features

- Web interface — browse repositories, view commits, files, and diffs (no javascript required)
- Git Smart HTTP — clone over HTTPS (use SSH for pushing)
- Git over SSH — push and clone over SSH
- Mirroring — automatically mirror repositories (supports GitHub authentication)
- Private repositories — repos accessible only via SSH
- CLI — command-line for managing your repositories

## Quick install & deploy

```sh
git clone https://git.olexsmir.xyz/mugit.git
cd mugit
go build

# or
go install github.com/olexsmir/mugit@latest
```

For nixos you can use our flake, see [my config](https://git.olexsmir.xyz/dotfiles/blob/master/nix/modules/mugit.nix) for reference.

Start the server:

```sh
# start server with default config lookup
mugit serve

# start with a custom config path
mugit -c /path/to/config.yaml serve
```


## Configuration

mugit uses YAML for configuration. By default the server looks for a configuration file in this order (override with `-c` / `--config`):
1. `./config.yaml`
2. `/etc/mugit.yaml`
3. `/var/lib/mugit/config.yaml`


Durations follow Go's duration syntax (examples: `1h`, `30m`, `5s`). See: https://pkg.go.dev/time#ParseDuration

Minimal configuration example:

```yaml
meta:
  host: git.olexsmir.xyz

repo:
  dir: /var/lib/mugit
```

Full example:

```yaml
server:
  host: 0.0.0.0 # bind address (0.0.0.0 = all interfaces)
  port: 5555    # HTTP port (defaults to 8080 when omitted)

meta:
  title: "My Git Server"    # site title shown on index page
  description: "A place for my projects"
  host: git.example.com     # used for clone URLs and go-import meta tag

repo:
  dir: /var/lib/mugit   # directory with repositories
  # Default README filenames (applied when omitted):
  readmes:
    - README.md
    - readme.md
    - README.html
    - readme.html
    - README.txt
    - readme.txt
    - readme
  # Default branch names considered the repository 'master' (applied when omitted):
  masters:
    - master
    - main

# ssh: push/clone over SSH
ssh:
  enable: true
  port: 2222  # SSH port (default 2222)
  host_key: /var/lib/mugit/host   # path to SSH host key (generate with ssh-keygen)
  # Only these public keys can access private repos and push to others.
  keys:
    - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA......
    - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA......

# mirror: automatic mirrors of external repositories
mirror:
  enable: true
  interval: 1h  # sync frequency
  # Tokens can be provided directly, or read from environment/file:
  # - literal: "ghp_xxxxxxxxxxxx"
  # - from env: "$env:GITHUB_TOKEN" (will read $GITHUB_TOKEN)
  # - from file: "$file:/abs/path/to/token.txt"
  github_token: "${env:GITHUB_TOKEN}"

cache:
  home_page: 5m   # cache index/home page
  readme: 1m      # cache rendered README per repo
  diff: 15m       # cache computed diffs
```

## CLI

```sh
# start server
mugit serve

# create new public repository
mugit repo new myproject

# create new private repository
mugit repo new --private myproject

# create a mirror of an external repository
mugit repo new myproject --mirror https://codeberg.org/user/repo
mugit repo new myproject --private --mirror https://github.com/user/repo

# toggle repository visibility
mugit repo private myproject

# show and set repository description
mugit repo description myproject
mugit repo description myproject "My awesome project"
```

## License

mugit is licensed under the MIT License.