mirror of
https://github.com/element-hq/synapse
synced 2024-07-15 11:44:11 +00:00
Broke in https://github.com/matrix-org/synapse/pull/16019. This would have been caught if someone ran 'devenv up' during manual testing of that PR, or better yet, if we had CI for the nix developer environment. Switch back to the latest release version, which doesn't have the upstream issue: https://github.com/cachix/devenv/issues/756
245 lines
11 KiB
Nix
245 lines
11 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. Used to fetch the latest
|
|
# available versions of packages.
|
|
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/v0.6.3";
|
|
# Rust toolchain.
|
|
rust-overlay.url = "github:oxalica/rust-overlay";
|
|
};
|
|
|
|
outputs = { self, nixpkgs, devenv, systems, rust-overlay, ... } @ inputs:
|
|
let
|
|
forEachSystem = nixpkgs.lib.genAttrs (import systems);
|
|
in {
|
|
devShells = forEachSystem (system:
|
|
let
|
|
overlays = [ (import rust-overlay) ];
|
|
pkgs = import nixpkgs {
|
|
inherit system overlays;
|
|
};
|
|
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; [
|
|
# The rust toolchain and related tools.
|
|
# This will install the "default" profile of rust components.
|
|
# https://rust-lang.github.io/rustup/concepts/profiles.html
|
|
#
|
|
# NOTE: We currently need to set the Rust version unnecessarily high
|
|
# in order to work around https://github.com/matrix-org/synapse/issues/15939
|
|
(rust-bin.stable."1.70.0".default.override {
|
|
# Additionally install the "rust-src" extension to allow diving into the
|
|
# Rust source code in an IDE (rust-analyzer will also make use of it).
|
|
extensions = [ "rust-src" ];
|
|
})
|
|
# The rust-analyzer language server implementation.
|
|
rust-analyzer
|
|
|
|
# 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.
|
|
#
|
|
# * Golang is needed to run the Complement test suite.
|
|
# * Perl is needed to run the SyTest test suite.
|
|
# * Rust is used for developing and running Synapse.
|
|
# It is installed manually with `packages` above.
|
|
languages.go.enable = true;
|
|
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 -c 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
|
|
]}";
|
|
}
|
|
];
|
|
};
|
|
});
|
|
};
|
|
}
|