I've been using GitLab for years but recently opted to switch to Gitea, primarily because of timing and I was looking for something more lightweight, not because of any particular problems with GitLab.
To deploy Gitea via NixOps I chose to craft a Nix file (example) that would be included in a host definition. The linked and below definition provides a deployment of Gitea, using Postgres, Nginx, ACME certificates and ReStructured Text rendering with syntax highlighting.
version-management/gitea_for_NixOps.nix:
{ config, pkgs, lib, ... }:
{
services.gitea = {
enable = true; # Enable Gitea
appName = "MyDomain: Gitea Service"; # Give the site a name
database = {
type = "postgres"; # Database type
passwordFile = "/run/keys/gitea-dbpass"; # Where to find the password
};
domain = "source.mydomain.tld"; # Domain name
rootUrl = "https://source.mydomaain.tld/"; # Root web URL
httpPort = 3001; # Provided unique port
extraConfig = let
docutils =
pkgs.python37.withPackages (ps: with ps; [
docutils # Provides rendering of ReStructured Text files
pygments # Provides syntax highlighting
]);
in ''
[mailer]
ENABLED = true
FROM = "gitea@mydomain.tld"
[service]
REGISTER_EMAIL_CONFIRM = true
[markup.restructuredtext]
ENABLED = true
FILE_EXTENSIONS = .rst
RENDER_COMMAND = ${docutils}/bin/rst2html.py
IS_INPUT_FILE = false
'';
};
services.postgresql = {
enable = true; # Ensure postgresql is enabled
authentication = ''
local gitea all ident map=gitea-users
'';
identMap = # Map the gitea user to postgresql
''
gitea-users gitea gitea
'';
};
services.nginx = {
enable = true; # Enable Nginx
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts."source.MyDomain.tld" = { # Gitea hostname
enableACME = true; # Use ACME certs
forceSSL = true; # Force SSL
locations."/".proxyPass = "http://localhost:3001/"; # Proxy Gitea
};
};
security.acme.certs = {
"source.mydomain".email = "anEmail@mydomain.tld";
};
}
This line from the above file should stand out:
passwordFile = "/run/keys/gitea-dbpass"; # Where to find the password
Where does that file come from? It's pulled from a secrets.nix
file
(example)
that for this example, could look like this:
{ config, pkgs, ... }:
{
deployment.keys = {
# An example set of keys to be used for the Gitea service's DB authentication
gitea-dbpass = {
text = "uNgiakei+x>i7shuiwaeth3z"; # Password, generated using pwgen -yB 24
user = "gitea"; # User to own the key file
group = "wheel"; # Group to own the key file
permissions = "0640"; # Key file permissions
};
};
}
The file's path /run/keys/gitea-dbpass
is determined by the elements. So
deployment.keys
determines the initial path of /run/keys
and the next
element gitea-dbpass
is a descriptive name provided by the stanza's author to
describe the key's use and also provide the final file name.
Now that we have described the Gitea service in gitea_for_NixOps.nix and the required credentials in secrets.nix we need to pull it all together for deployment. We achieve that in this case by importing both these files into our existing host definition:
myhost.nix:
{
myhost =
{ config, pkgs, lib, ... }:
{
imports =
[
./secrets.nix # Import our secrets
./version-management/gitea_got_NixOps.nix # Import Gitea
];
deployment.targetHost = "192.168.132.123"; # Target's IP address
networking.hostName = "myhost"; # Target's hostname.
};
}
To deploy Gitea to your NixOps managed host, you merely run the deploy command for your already configured host and deployment, which would look like this:
$ nixops deploy -d MyDeployment --include myhost
You should now have a running Gitea server and be able to create an initial admin user.
In my nixos-examples repo I have a version-management directory with some example files and a README with information and instructions. You can use two of the files to generate a Gitea VM to take a quick poke around. There is also an example of how you can deploy Gitea in production using NixOps, as per this post.
If you wish to dig a little deeper, I have my production deployment over at mio-ops.