mirror of
				https://github.com/wanderer-industries/wanderer
				synced 2025-10-30 05:57:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			235 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   description = "Main flake";
 | |
| 
 | |
|   nixConfig.bash-prompt = "\\e[0;32m[nix-develop@\\h] \\W>\\e[m ";
 | |
| 
 | |
|   inputs = {
 | |
|     nixpkgs = { url = "github:nixos/nixpkgs/nixpkgs-unstable"; };
 | |
|     flake-utils = { url = "github:numtide/flake-utils"; };
 | |
|   };
 | |
| 
 | |
|   outputs = { self, nixpkgs, flake-utils }:
 | |
|     flake-utils.lib.eachDefaultSystem (system:
 | |
|       let
 | |
|         LANG = "C.UTF-8";
 | |
|         # LANG= "en_US.UTF-8";
 | |
|         root = ./.;
 | |
|         inherit (pkgs.lib) optional optionals;
 | |
| 
 | |
|         overlay = (final: prev: {
 | |
|           yarn = prev.yarn.override {
 | |
|                   nodejs = final.pkgs.nodejs-18_x;
 | |
|                 };
 | |
|         });
 | |
| 
 | |
|         pkgs = import nixpkgs {
 | |
|           inherit system;
 | |
|           overlays = [ overlay ];
 | |
|         };
 | |
| 
 | |
|         pname = "wanderer";
 | |
| 
 | |
|         erlang = pkgs.beam.interpreters.erlang_27;
 | |
|         elixir = pkgs.beam.packages.erlang_27.elixir_1_17;
 | |
|         elixir-ls = pkgs.beam.packages.erlang_27.elixir_ls;
 | |
|         packages = pkgs.beam.packagesWith erlang;
 | |
|         nodejs = pkgs.nodejs-18_x;
 | |
|         postgresql = pkgs.postgresql_14;
 | |
|         yarn = pkgs.yarn;
 | |
| 
 | |
|         # This is opinionated instead of simple using:
 | |
|         # pkgs.beam.packages.erlang.hex;
 | |
|         hex = packages.hex;
 | |
|         MIX_PATH = "${hex}/archives/hex-${hex.version}/hex-${hex.version}/ebin";
 | |
| 
 | |
|         # This is opinionated instead of simple using:
 | |
|         # pkgs.beam.packages.erlang.rebar3;
 | |
|         rebar3 = pkgs.beam.packages.erlang_27.rebar3;
 | |
| 
 | |
|         MIX_REBAR3 = "${rebar3}/bin/rebar3";
 | |
|       in
 | |
|       with pkgs;
 | |
|       {
 | |
|         devShells.default = pkgs.mkShell {
 | |
|           inherit LANG MIX_PATH MIX_REBAR3 elixir erlang nodejs yarn;
 | |
|           # use local HOME to avoid global things
 | |
|           MIX_HOME = ".cache/mix";
 | |
|           HEX_HOME = ".cache/hex";
 | |
|           MIX_ENV = "dev";
 | |
|           # enable IEx shell history
 | |
|           ERL_AFLAGS = "-kernel shell_history enabled";
 | |
| 
 | |
|           shellHook = ''
 | |
|           # this allows mix to work on the local directory
 | |
|           if ! test -d .nix-shell; then
 | |
|             mkdir .nix-shell
 | |
|           fi
 | |
| 
 | |
|           export NIX_SHELL_DIR=$PWD/.nix-shell
 | |
|           # Put the PostgreSQL databases in the project directory.
 | |
|           export PGDATA=$NIX_SHELL_DIR/db
 | |
|           export MIX_HOME=$NIX_SHELL_DIR/.mix
 | |
|           export MIX_ARCHIVES=$MIX_HOME/archives
 | |
|           export HEX_HOME=$NIX_SHELL_DIR/.hex
 | |
| 
 | |
|           export PATH=$MIX_HOME/bin:$PATH
 | |
|           export PATH=$HEX_HOME/bin:$PATH
 | |
|           export PATH=$MIX_HOME/escripts:$PATH
 | |
|           export LIVEBOOK_HOME=$PWD
 | |
| 
 | |
|           # make hex from Nixpkgs available
 | |
|           # `mix local.hex` will install hex into MIX_HOME and should take precedence
 | |
|           export LANG=C.UTF-8
 | |
|           # keep your shell history in iex
 | |
|           export ERL_AFLAGS="-kernel shell_history enabled"
 | |
| 
 | |
|           # add your project env vars here, word readable in the nix store.
 | |
|           # export ENV_VAR="your_env_var"
 | |
|           ${elixir}/bin/mix --version
 | |
|           ${elixir}/bin/iex --version
 | |
|         '';
 | |
| 
 | |
|           buildInputs = [
 | |
|             nodejs
 | |
|             yarn
 | |
|             git
 | |
|             postgresql
 | |
|             elixir
 | |
|             elixir_ls
 | |
|             pgcli
 | |
|             flyctl
 | |
|             glibcLocales
 | |
|             nixpkgs-fmt
 | |
|             (pkgs.writeShellScriptBin "pg-stop" ''
 | |
|               pg_ctl -D $PGDATA -U postgres stop
 | |
|             '')
 | |
|             (pkgs.writeShellScriptBin "pg-reset" ''
 | |
|               rm -rf $PGDATA
 | |
|             '')
 | |
|             (pkgs.writeShellScriptBin "pg-setup" ''
 | |
|               ####################################################################
 | |
|               # If database is not initialized (i.e., $PGDATA directory does not
 | |
|               # exist), then set it up. Seems superfluous given the cleanup step
 | |
|               # above, but handy when one gets to force reboot the iron.
 | |
|               ####################################################################
 | |
|               if ! test -d $PGDATA; then
 | |
|                 ######################################################
 | |
|                 # Init PostgreSQL
 | |
|                 ######################################################
 | |
|                 pg_ctl initdb -D  $PGDATA -o "--no-locale --encoding=UTF8"
 | |
|                 #### initdb --locale=C --encoding=UTF8 --auth-local=peer --auth-host=scram-sha-256 > /dev/null || exit
 | |
|                 # initdb --encoding=UTF8 --no-locale --no-instructions -U postgres
 | |
|                 ######################################################
 | |
|                 # PORT ALREADY IN USE
 | |
|                 ######################################################
 | |
|                 # If another `nix-shell` is  running with a PostgreSQL
 | |
|                 # instance,  the logs  will show  complaints that  the
 | |
|                 # default port 5432  is already in use.  Edit the line
 | |
|                 # below with  a different  port number,  uncomment it,
 | |
|                 # and try again.
 | |
|                 ######################################################
 | |
|                 if [[ "$PGPORT" ]]; then
 | |
|                   sed -i "s|^#port.*$|port = $PGPORT|" $PGDATA/postgresql.conf
 | |
|                 fi
 | |
|                 echo "listen_addresses = ${"'"}${"'"}" >> $PGDATA/postgresql.conf
 | |
|                 echo "unix_socket_directories = '$PGDATA'" >> $PGDATA/postgresql.conf
 | |
|                 echo "CREATE USER postgres WITH PASSWORD 'postgres' CREATEDB SUPERUSER;" | postgres --single -E postgres
 | |
|               fi
 | |
|             '')
 | |
|             (pkgs.writeShellScriptBin "pg-start" ''
 | |
|               ## # Postgres Fallback using docker
 | |
|               ## docker run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres:14
 | |
| 
 | |
|               [ ! -d $PGDATA ] && pg-setup
 | |
| 
 | |
|               ####################################################################
 | |
|               # Start PostgreSQL
 | |
|               # ==================================================================
 | |
|               # Setting all  necessary configuration  options via  `pg_ctl` (which
 | |
|               # is  basically  a wrapper  around  `postgres`)  instead of  editing
 | |
|               # `postgresql.conf` directly with `sed`. See docs:
 | |
|               #
 | |
|               # + https://www.postgresql.org/docs/current/app-pg-ctl.html
 | |
|               # + https://www.postgresql.org/docs/current/app-postgres.html
 | |
|               #
 | |
|               # See more on the caveats at
 | |
|               # https://discourse.nixos.org/t/how-to-configure-postgresql-declaratively-nixos-and-non-nixos/4063/1
 | |
|               # but recapping out of paranoia:
 | |
|               #
 | |
|               # > use `SHOW`  commands to  check the  options because  `postgres -C`
 | |
|               # > "_returns values  from postgresql.conf_" (which is  not changed by
 | |
|               # > supplying  the  configuration options  on  the  command line)  and
 | |
|               # > "_it does  not reflect  parameters supplied  when the  cluster was
 | |
|               # > started._"
 | |
|               #
 | |
|               # OPTION SUMMARY
 | |
|               # --------------------------------------------------------------------
 | |
|               #
 | |
|               #  + `unix_socket_directories`
 | |
|               #
 | |
|               #    > PostgreSQL  will  attempt  to create  a  pidfile  in
 | |
|               #    > `/run/postgresql` by default, but it will fail as it
 | |
|               #    > doesn't exist. By  changing the configuration option
 | |
|               #    > below, it will get created in $PGDATA.
 | |
|               #
 | |
|               #   + `listen_addresses`
 | |
|               #
 | |
|               #     > In   tandem  with   edits   in  `pg_hba.conf`   (see
 | |
|               #     > `HOST_COMMON`  below), it  configures PostgreSQL  to
 | |
|               #     > allow remote connections (otherwise only `localhost`
 | |
|               #     > will get  authenticated and the rest  of the traffic
 | |
|               #     > discarded).
 | |
|               #     >
 | |
|               #     > NOTE: the  edit  to  `pga_hba.conf`  needs  to  come
 | |
|               #     >       **before**  `pg_ctl  start`  (or  the  service
 | |
|               #     >       needs to be restarted otherwise), because then
 | |
|               #     >       the changes are not being reloaded.
 | |
|               #     >
 | |
|               #     > More info  on setting up and  troubleshooting remote
 | |
|               #     > PosgreSQL connections (these are  all mirrors of the
 | |
|               #     > same text; again, paranoia):
 | |
|               #     >
 | |
|               #     >   + https://stackoverflow.com/questions/24504680/connect-to-postgres-server-on-google-compute-engine
 | |
|               #     >   + https://stackoverflow.com/questions/47794979/connecting-to-postgres-server-on-google-compute-engine
 | |
|               #     >   + https://medium.com/scientific-breakthrough-of-the-afternoon/configure-postgresql-to-allow-remote-connections-af5a1a392a38
 | |
|               #     >   + https://gist.github.com/toraritte/f8c7fe001365c50294adfe8509080201#file-configure-postgres-to-allow-remote-connection-md
 | |
|               HOST_COMMON="host\s\+all\s\+all"
 | |
|               sed -i "s|^$HOST_COMMON.*127.*$|host all all 0.0.0.0/0 trust|" $PGDATA/pg_hba.conf
 | |
|               sed -i "s|^$HOST_COMMON.*::1.*$|host all all ::/0 trust|"      $PGDATA/pg_hba.conf
 | |
|               #  + `log*`
 | |
|               #
 | |
|               #    > Setting up basic logging,  to see remote connections
 | |
|               #    > for example.
 | |
|               #    >
 | |
|               #    > See the docs for more:
 | |
|               #    > https://www.postgresql.org/docs/current/runtime-config-logging.html
 | |
| 
 | |
|               pg_ctl                                                  \
 | |
|                 -D $PGDATA                                            \
 | |
|                 -l $PGDATA/postgres.log                               \
 | |
|                 -o "-c unix_socket_directories='$PGDATA'"             \
 | |
|                 -o "-c listen_addresses='*'"                          \
 | |
|                 -o "-c log_destination='stderr'"                      \
 | |
|                 -o "-c logging_collector=on"                          \
 | |
|                 -o "-c log_directory='log'"                           \
 | |
|                 -o "-c log_filename='postgresql-%Y-%m-%d_%H%M%S.log'" \
 | |
|                 -o "-c log_min_messages=info"                         \
 | |
|                 -o "-c log_min_error_statement=info"                  \
 | |
|                 -o "-c log_connections=on"                            \
 | |
|                 start
 | |
|             '')
 | |
|             (pkgs.writeShellScriptBin "pg-console" ''
 | |
|               psql --host $PGDATA -U postgres
 | |
|             '')
 | |
|           ] ++ optional stdenv.isLinux inotify-tools
 | |
|             ++ optional stdenv.isDarwin terminal-notifier
 | |
|             ++ optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
 | |
|               CoreFoundation
 | |
|               CoreServices
 | |
|             ]);
 | |
| 
 | |
|           packages = with pkgs; [ nodejs yarn ];
 | |
|         };
 | |
|       });
 | |
| }
 | 
