| GOTD.CONF(5) | File Formats Manual | GOTD.CONF(5) |
gotd.conf — gotd
configuration file
gotd.conf is the run-time configuration
file for gotd(8).
The file format is line-based, with one configuration directive
per line. Comments can be put anywhere in the file using a hash mark
(‘#’), and extend to the end of the current line. Arguments
names not beginning with a letter, digit or underscore, as well as reserved
words (such as listen,
repository or
user), must be quoted. Arguments containing
whitespace should be surrounded by double quotes (").
Macros can be defined that are later expanded in context. Macro names must start with a letter, digit, or underscore, and may contain any of those characters, but may not be reserved words. Macros are not expanded inside quotes. For example:
path = "/var/run/gotd.sock" listen on $path
The available global configuration directives are as follows:
connection
optionThe connection directive may be
specified multiple times, and multiple option
arguments may be specified within curly braces:
connection
{...}
Each option should only be specified once. If a given option is listed multiple times, the last line which sets this option wins.
Valid connection options are:
request
timeout secondsThe timeout value may also have a suffix indicating its unit of measure. Supported suffixes are:
The default timeout is 1h (3600 seconds, one hour). This should only be changed if legitimate requests are exceeding the default timeout for some reason, such as the server spending an extraordinary amount of time generating a pack file.
limit
user identity
numberThe default per-user limit is 4. This should only be changed if concurrent connections from a given user are expected to exceed the default limit, for example if an anonymous user is granted read access and many concurrent connections will share this anonymous user identity.
listen
on pathuser
userAt least one repository context must exist for
gotd(8) to function. For each repository, access rules
must be configured using the permit and
deny configuration directives. Multiple access rules
can be specified, and the last matching rule determines the action taken. If
no rule matches, access to the repository is denied.
A repository context is declared with a unique name, followed by repository-specific configuration directives inside curly braces:
repository name
{...}
got(1) and git(1) clients can connect to a repository by including the repository's unique name in the request URL. Clients appending the string “.git” to the name will also be accepted.
If desired, the name may contain path-separators, “/”, to expose repositories as part of a virtual client-visible directory hierarchy.
The available repository configuration directives are as follows:
deny
identitypath
pathpermit
mode identityro for read-only access, or
rw for read-write access. Group names may be
matched by prepending a colon (‘:’) to
identity. Numeric IDs are also accepted.protect
{...}protect directive may be used to protect
branches and tags in a repository from being overwritten by potentially
destructive client-side commands, such as when got send
-f and git push -f are used to change the
history of a branch.
To build a set of protected branches and tags, multiple
protect directives may be specified per
repository and multiple protect directive
parameters may be specified within curly braces.
The available protect parameters are
as follows:
branch
nameIf the name does not already begin with “refs/heads/” it will be looked up in the “refs/heads/” reference namespace.
branch
namespace namespaceThe namespace argument must be absolute, starting with “refs/”.
tag
namespace namespaceThe namespace argument must be absolute, starting with “refs/”.
The special reference namespaces “refs/got/” and
“refs/remotes/” do not need to be listed in
gotd.conf. These namespaces are always protected
and even attempts to create new references in these namespaces will
always be denied.
notify
{...}notify directive enables notifications about
new commits or tags added to the repository.
Notifications via email require an SMTP daemon which accepts
mail for forwarding without requiring client authentication or
encryption. On OpenBSD the
smtpd(8) daemon can be used for this purpose. The
default content of email notifications looks similar to the output of
the got log -d command.
Notifications via HTTP require a HTTP or HTTPS server which is accepting POST requests with or without HTTP Basic authentication. Depending on the use case a custom server-side CGI script may be required for the processing of notifications. HTTP notifications can achieve functionality similar to Git's server-side post-receive hook script with gotd(8) by triggering arbitrary post-commit actions via the HTTP server.
The notify directive expects
parameters which must be enclosed in curly braces. The available
parameters are as follows:
branch
namebranch nor a
reference namespace are specified then changes
to any reference will trigger notifications.reference
namespace namespacebranch nor a reference
namespace are specified then changes to any reference will
trigger notifications.email
[from sender]
to recipient
[reply to responder]
[relay hostname
[port port]]The recipient must be an email addresses that accepts mail. The sender will be used as the From address. If not specified, the sender defaults to an email address composed of the user account running gotd(8) and the local hostname.
If a responder is specified via the
reply to directive, the
responder will be used as the Reply-to
address. Setting the Reply-to header can be useful if replies should
go to a mailing list instead of the sender,
for example.
By default, mail will be sent to the SMTP server listening
on the loopback address 127.0.0.1 on port 25. The
relay and port
directives can be used to specify a different SMTP server address
and port.
url
URL [auth
label [insecure]]
[hmac label]The notification will be sent as a POST request to the given URL, which must be a valid HTTP URL and begin with either “http://” or “https://”. If HTTPS is used, sending of notifications will only succeed if no TLS errors occur.
The optional auth directive
enables HTTP Basic authentication. Authentication credentials must
be specified in the separate gotd-secrets.conf(5)
file, using the label as identifier. Unless
the insecure option is specified the
notification target URL must be a
“https://” URL to avoid leaking of authentication
credentials.
If a hmac secret is provided, the
request body will be signed using HMAC, allowing the receiver to
verify the notification message's authenticity and integrity. The
HMAC secret to use must be specified in the separate
gotd-secrets.conf(5) file, using the
label as identifier. The signature uses
HMAC-SHA256 and will be sent in the HTTP header
“X-Gotd-Signature”.
The request body contains a JSON object with a “notifications” property containing an array of notification objects. The following notification object properties are always present:
repoauthenticated_usertypeEach notification object carries additional type-specific properties. The types and their type-specific properties are:
commitshortidcommitterdateshort_messagemessagediffstatactionfileaddedremovedThe ‘total’ object contains two fields: ‘added’ and ‘removed’ which are the number of added and removed lines respectively.
branch-deletedtagdateobjectmessagegotd.conf configuration file.# Run as the default user:
user _gotd
# Listen on the default socket:
listen on "/var/run/gotd.sock"
# This repository can be accessed via ssh://user@example.com/src
repository "src" {
path "/var/git/src.git"
permit rw flan_hacker
permit rw :developers
permit ro anonymous
protect branch "main"
protect tag namespace "refs/tags/"
}
# This repository can be accessed via
# ssh://user@example.com/openbsd/ports
repository "openbsd/ports" {
path "/var/git/ports.git"
permit rw :porters
permit ro anonymous
deny flan_hacker
protect {
branch "main"
tag namespace "refs/tags/"
}
notify {
branch "main"
reference namespace "refs/tags/"
email to openbsd-ports-changes@example.com
}
}
# Use a larger request timeout value:
connection request timeout 2h
# Some users are granted a higher concurrent connection limit:
connection {
limit user flan_hacker 16
limit user anonymous 32
}
| January 31, 2025 | Debian |