232 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Nix
		
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Nix
		
	
	
| # A Nix flake that sets up a complete Synapse development environment. Dependencies
 | |
| # for the SyTest (https://github.com/matrix-org/sytest) and Complement
 | |
| # (https://github.com/matrix-org/complement) Matrix homeserver test suites are also
 | |
| # installed automatically.
 | |
| #
 | |
| # You must have already installed Nix (https://nixos.org) on your system to use this.
 | |
| # Nix can be installed on Linux or MacOS; NixOS is not required. Windows is not
 | |
| # directly supported, but Nix can be installed inside of WSL2 or even Docker
 | |
| # containers. Please refer to https://nixos.org/download for details.
 | |
| #
 | |
| # You must also enable support for flakes in Nix. See the following for how to
 | |
| # do so permanently: https://nixos.wiki/wiki/Flakes#Enable_flakes
 | |
| #
 | |
| # Be warned: you'll need over 3.75 GB of free space to download all the dependencies.
 | |
| #
 | |
| # Usage:
 | |
| #
 | |
| # With Nix installed, navigate to the directory containing this flake and run
 | |
| # `nix develop --impure`. The `--impure` is necessary in order to store state
 | |
| # locally from "services", such as PostgreSQL and Redis.
 | |
| #
 | |
| # You should now be dropped into a new shell with all programs and dependencies
 | |
| # availabile to you!
 | |
| #
 | |
| # You can start up pre-configured local Synapse, PostgreSQL and Redis instances by
 | |
| # running: `devenv up`. To stop them, use Ctrl-C.
 | |
| #
 | |
| # All state (the venv, postgres and redis data and config) are stored in
 | |
| # .devenv/state. Deleting a file from here and then re-entering the shell
 | |
| # will recreate these files from scratch.
 | |
| #
 | |
| # You can exit the development shell by typing `exit`, or using Ctrl-D.
 | |
| #
 | |
| # If you would like this development environment to activate automatically
 | |
| # upon entering this directory in your terminal, first install `direnv`
 | |
| # (https://direnv.net/). Then run `echo 'use flake . --impure' >> .envrc` at
 | |
| # the root of the Synapse repo. Finally, run `direnv allow .` to allow the
 | |
| # contents of '.envrc' to run every time you enter this directory. Voilà!
 | |
| 
 | |
| {
 | |
|   inputs = {
 | |
|     # Use the master/unstable branch of nixpkgs. The latest stable, 22.11,
 | |
|     # does not contain 'perl536Packages.NetAsyncHTTP', needed by Sytest.
 | |
|     nixpkgs.url = "github:NixOS/nixpkgs/master";
 | |
|     # Output a development shell for x86_64/aarch64 Linux/Darwin (MacOS).
 | |
|     systems.url = "github:nix-systems/default";
 | |
|     # A development environment manager built on Nix. See https://devenv.sh.
 | |
|     devenv.url = "github:cachix/devenv/main";
 | |
|     # Rust toolchains and rust-analyzer nightly.
 | |
|     fenix = {
 | |
|       url = "github:nix-community/fenix";
 | |
|       inputs.nixpkgs.follows = "nixpkgs";
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   outputs = { self, nixpkgs, devenv, systems, ... } @ inputs:
 | |
|     let
 | |
|       forEachSystem = nixpkgs.lib.genAttrs (import systems);
 | |
|     in {
 | |
|       devShells = forEachSystem (system:
 | |
|         let
 | |
|           pkgs = nixpkgs.legacyPackages.${system};
 | |
|         in {
 | |
|           # Everything is configured via devenv - a Nix module for creating declarative
 | |
|           # developer environments. See https://devenv.sh/reference/options/ for a list
 | |
|           # of all possible options.
 | |
|           default = devenv.lib.mkShell {
 | |
|             inherit inputs pkgs;
 | |
|             modules = [
 | |
|               {
 | |
|                 # Make use of the Starship command prompt when this development environment
 | |
|                 # is manually activated (via `nix develop --impure`).
 | |
|                 # See https://starship.rs/ for details on the prompt itself.
 | |
|                 starship.enable = true;
 | |
| 
 | |
|                 # Configure packages to install.
 | |
|                 # Search for package names at https://search.nixos.org/packages?channel=unstable
 | |
|                 packages = with pkgs; [
 | |
|                   # Native dependencies for running Synapse.
 | |
|                   icu
 | |
|                   libffi
 | |
|                   libjpeg
 | |
|                   libpqxx
 | |
|                   libwebp
 | |
|                   libxml2
 | |
|                   libxslt
 | |
|                   sqlite
 | |
| 
 | |
|                   # Native dependencies for unit tests (SyTest also requires OpenSSL).
 | |
|                   openssl
 | |
|                   xmlsec
 | |
| 
 | |
|                   # Native dependencies for running Complement.
 | |
|                   olm
 | |
| 
 | |
|                   # For building the Synapse documentation website.
 | |
|                   mdbook
 | |
| 
 | |
|                   # For releasing Synapse
 | |
|                   debian-devscripts # (`dch` for manipulating the Debian changelog)
 | |
|                   libnotify # (the release script uses `notify-send` to tell you when CI jobs are done)
 | |
|                 ];
 | |
| 
 | |
|                 # Install Python and manage a virtualenv with Poetry.
 | |
|                 languages.python.enable = true;
 | |
|                 languages.python.poetry.enable = true;
 | |
|                 # Automatically activate the poetry virtualenv upon entering the shell.
 | |
|                 languages.python.poetry.activate.enable = true;
 | |
|                 # Install all extra Python dependencies; this is needed to run the unit
 | |
|                 # tests and utilitise all Synapse features.
 | |
|                 languages.python.poetry.install.arguments = ["--extras all"];
 | |
|                 # Install the 'matrix-synapse' package from the local checkout.
 | |
|                 languages.python.poetry.install.installRootPackage = true;
 | |
| 
 | |
|                 # This is a work-around for NixOS systems. NixOS is special in
 | |
|                 # that you can have multiple versions of packages installed at
 | |
|                 # once, including your libc linker!
 | |
|                 #
 | |
|                 # Some binaries built for Linux expect those to be in a certain
 | |
|                 # filepath, but that is not the case on NixOS. In that case, we
 | |
|                 # force compiling those binaries locally instead.
 | |
|                 env.POETRY_INSTALLER_NO_BINARY = "ruff";
 | |
| 
 | |
|                 # Install dependencies for the additional programming languages
 | |
|                 # involved with Synapse development.
 | |
|                 #
 | |
|                 # * Rust is used for developing and running Synapse.
 | |
|                 # * Golang is needed to run the Complement test suite.
 | |
|                 # * Perl is needed to run the SyTest test suite.
 | |
|                 languages.go.enable = true;
 | |
|                 languages.rust.enable = true;
 | |
|                 languages.rust.version = "stable";
 | |
|                 languages.perl.enable = true;
 | |
| 
 | |
|                 # Postgres is needed to run Synapse with postgres support and
 | |
|                 # to run certain unit tests that require postgres.
 | |
|                 services.postgres.enable = true;
 | |
| 
 | |
|                 # On the first invocation of `devenv up`, create a database for
 | |
|                 # Synapse to store data in.
 | |
|                 services.postgres.initdbArgs = ["--locale=C" "--encoding=UTF8"];
 | |
|                 services.postgres.initialDatabases = [
 | |
|                   { name = "synapse"; }
 | |
|                 ];
 | |
|                 # Create a postgres user called 'synapse_user' which has ownership
 | |
|                 # over the 'synapse' database.
 | |
|                 services.postgres.initialScript = ''
 | |
|                 CREATE USER synapse_user;
 | |
|                 ALTER DATABASE synapse OWNER TO synapse_user;
 | |
|                 '';
 | |
| 
 | |
|                 # Redis is needed in order to run Synapse in worker mode.
 | |
|                 services.redis.enable = true;
 | |
| 
 | |
|                 # Configure and start Synapse. Before starting Synapse, this shell code:
 | |
|                 #  * generates a default homeserver.yaml config file if one does not exist, and
 | |
|                 #  * ensures a directory containing two additional homeserver config files exists;
 | |
|                 #    one to configure using the development environment's PostgreSQL as the
 | |
|                 #    database backend and another for enabling Redis support.
 | |
|                 process.before = ''
 | |
|                   python -m synapse.app.homeserver -c homeserver.yaml --generate-config --server-name=synapse.dev --report-stats=no
 | |
|                   mkdir -p homeserver-config-overrides.d
 | |
|                   cat > homeserver-config-overrides.d/database.yaml << EOF
 | |
|                   ## Do not edit this file. This file is generated by flake.nix
 | |
|                   database:
 | |
|                     name: psycopg2
 | |
|                     args:
 | |
|                       user: synapse_user
 | |
|                       database: synapse
 | |
|                       host: $PGHOST
 | |
|                       cp_min: 5
 | |
|                       cp_max: 10
 | |
|                   EOF
 | |
|                   cat > homeserver-config-overrides.d/redis.yaml << EOF
 | |
|                   ## Do not edit this file. This file is generated by flake.nix
 | |
|                   redis:
 | |
|                     enabled: true
 | |
|                   EOF
 | |
|                 '';
 | |
|                 # Start synapse when `devenv up` is run.
 | |
|                 processes.synapse.exec = "poetry run python -m synapse.app.homeserver -c homeserver.yaml --config-directory homeserver-config-overrides.d";
 | |
| 
 | |
|                 # Define the perl modules we require to run SyTest.
 | |
|                 #
 | |
|                 # This list was compiled by cross-referencing https://metacpan.org/
 | |
|                 # with the modules defined in './cpanfile' and then finding the
 | |
|                 # corresponding Nix packages on https://search.nixos.org/packages.
 | |
|                 #
 | |
|                 # This was done until `./install-deps.pl --dryrun` produced no output.
 | |
|                 env.PERL5LIB = "${with pkgs.perl536Packages; makePerlPath [
 | |
|                   DBI
 | |
|                   ClassMethodModifiers
 | |
|                   CryptEd25519
 | |
|                   DataDump
 | |
|                   DBDPg
 | |
|                   DigestHMAC
 | |
|                   DigestSHA1
 | |
|                   EmailAddressXS
 | |
|                   EmailMIME
 | |
|                   EmailSimple  # required by Email::Mime
 | |
|                   EmailMessageID  # required by Email::Mime
 | |
|                   EmailMIMEContentType  # required by Email::Mime
 | |
|                   TextUnidecode  # required by Email::Mime
 | |
|                   ModuleRuntime  # required by Email::Mime
 | |
|                   EmailMIMEEncodings  # required by Email::Mime
 | |
|                   FilePath
 | |
|                   FileSlurper
 | |
|                   Future
 | |
|                   GetoptLong
 | |
|                   HTTPMessage
 | |
|                   IOAsync
 | |
|                   IOAsyncSSL
 | |
|                   IOSocketSSL
 | |
|                   NetSSLeay
 | |
|                   JSON
 | |
|                   ListUtilsBy
 | |
|                   ScalarListUtils
 | |
|                   ModulePluggable
 | |
|                   NetAsyncHTTP
 | |
|                   MetricsAny  # required by Net::Async::HTTP
 | |
|                   NetAsyncHTTPServer
 | |
|                   StructDumb
 | |
|                   URI
 | |
|                   YAMLLibYAML
 | |
|                 ]}";
 | |
|               }
 | |
|             ];
 | |
|           };
 | |
|         });
 | |
|     };
 | |
| }
 |