Deployment and lifecycle management for Nix
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

non-working config rewrite

+1317 -1080
+20 -11
.envrc
··· 2 2 3 3 dotenv_if_exists .secret.envrc 4 4 5 + genSecret() { 6 + SECRET="$1" 7 + if [ ! -f "$SECRET" ]; then 8 + echo "Creating development cookie file" 9 + dd if=/dev/urandom bs=1 count=64 | hexdump -e '64/1 "%02x"' >"$SECRET" 10 + fi 11 + } 12 + 13 + export SOWER_SERVER_CONFIG_FILE="$PWD/dev-server.json" 14 + 5 15 RELEASE_COOKIE_FILE="$PWD/.dev-cookie" 6 - if [ ! -f "$RELEASE_COOKIE_FILE" ]; then 7 - echo "Creating development cookie file" 8 - dd if=/dev/urandom bs=1 count=64 | hexdump -e '64/1 "%02x"' >"$RELEASE_COOKIE_FILE" 9 - fi 10 - export RELEASE_COOKIE=$(cat $RELEASE_COOKIE_FILE) 16 + genSecret "$RELEASE_COOKIE_FILE" 17 + RELEASE_COOKIE=$(cat "$RELEASE_COOKIE_FILE") 18 + export RELEASE_COOKIE 11 19 12 - export ERL_AFLAGS="-kernel shell_history enabled -kernel shell_history_file_bytes 1024000" 20 + export SOWER_SECRET_KEY_BASE_FILE="$PWD/.dev-secret-key-base" 21 + genSecret "$SOWER_SECRET_KEY_BASE_FILE" 13 22 14 23 export SOWER_BOOTSTRAP_TOKEN_FILE="$PWD/.bootstrap.token" 15 - if [ ! -f "$SOWER_BOOTSTRAP_TOKEN_FILE" ]; then 16 - echo "Creating development bootstrap token file" 17 - dd if=/dev/urandom bs=1 count=64 | hexdump -e '64/1 "%02x"' >"$SOWER_BOOTSTRAP_TOKEN_FILE" 18 - fi 19 - export SOWER_BOOTSTRAP_TOKEN=$(cat $SOWER_BOOTSTRAP_TOKEN_FILE) 24 + genSecret "$SOWER_BOOTSTRAP_TOKEN_FILE" 25 + 26 + export SOWER_AUTH_OIDC_CLIENT_SECRET_FILE="$PWD/.dev-oidc-secret" 27 + 28 + export ERL_AFLAGS="-kernel shell_history enabled -kernel shell_history_file_bytes 1024000"
+1 -1
.gitignore
··· 32 32 npm-debug.log 33 33 /assets/node_modules/ 34 34 35 - .dev-cookie 35 + /.dev-* 36 36 .secret.envrc 37 37 38 38 target/
+17 -8
client/src/main.rs
··· 174 174 175 175 let config_file = match cli.config { 176 176 Some(path) => path, 177 - None => match std::env::var("USER") { 178 - Ok(user) => match user.as_ref() { 179 - "root" => PathBuf::from("/etc/sower/config.toml"), 180 - _ => xdg::BaseDirectories::with_prefix("sower") 181 - .expect("cannot locate XDG directories") 182 - .get_config_file("config.toml"), 177 + None => match std::env::var("SOWER_CLIENT_CONFIG_FILE") { 178 + Ok(f) => PathBuf::from(f), 179 + Err(_) => match std::env::var("USER") { 180 + Ok(user) => match user.as_ref() { 181 + "root" => PathBuf::from("/etc/sower/config.toml"), 182 + _ => xdg::BaseDirectories::with_prefix("sower") 183 + .expect("cannot locate XDG directories") 184 + .get_config_file("config.toml"), 185 + }, 186 + Err(_) => PathBuf::from("/etc/sower/config.toml"), 183 187 }, 184 - Err(_) => PathBuf::from("/etc/sower/config.toml"), 185 188 }, 186 189 }; 187 190 ··· 203 206 }, 204 207 }; 205 208 206 - // cli overrides config 209 + // env overrides config 210 + let config = config.bootstrap_token_file(match std::env::var("SOWER_BOOTSTRAP_TOKEN_FILE") { 211 + Ok(f) => Some(PathBuf::from(f)), 212 + Err(_) => None, 213 + }); 214 + 215 + // cli overrides env and config 207 216 let config = config 208 217 .name(cli.name) 209 218 .seed_type(cli.seed_type)
+1 -11
config/dev.exs
··· 1 1 import Config 2 2 3 3 config :sower, 4 - dev_routes: true, 5 - bootstrap_token: System.get_env("SOWER_BOOTSTRAP_TOKEN"), 6 - oidc_base_url: System.get_env("SOWER_AUTH_OIDC_BASE_URL"), 7 - oidc_client_id: System.get_env("SOWER_AUTH_OIDC_CLIENT_ID"), 8 - oidc_client_secret: System.get_env("SOWER_AUTH_OIDC_CLIENT_SECRET"), 9 - oidc_redirect_uri: "http://localhost:4000/auth" 4 + dev_routes: true 10 5 11 6 # Configure your database 12 7 config :sower, Sower.Repo, 13 - username: "postgres", 14 - password: "postgres", 15 - hostname: "localhost", 16 - database: "sower_dev", 17 - port: 5432, 18 8 show_sensitive_data_on_connection_error: true, 19 9 pool_size: 10 20 10
-99
config/runtime.exs
··· 19 19 if System.get_env("PHX_SERVER") do 20 20 config :sower, SowerWeb.Endpoint, server: true 21 21 end 22 - 23 - config :sower, oidc_base_url: System.get_env("SOWER_AUTH_OIDC_BASE_URL") 24 - 25 - if config_env() == :prod do 26 - host = System.get_env("SOWER_HOSTNAME") || raise "missing $SOWER_HOSTNAME" 27 - scheme = System.get_env("SOWER_PUBLIC_SCHEME", "https") 28 - public_port = String.to_integer(System.get_env("SOWER_PUBLIC_PORT", "443")) 29 - 30 - config :sower, 31 - bootstrap_token: Sower.Application.credential!("SOWER_BOOTSTRAP_TOKEN_FILE"), 32 - oidc_base_url: 33 - System.get_env("SOWER_AUTH_OIDC_BASE_URL") || raise("missing $SOWER_AUTH_OIDC_BASE_URL"), 34 - oidc_client_id: Sower.Application.credential!("SOWER_AUTH_OIDC_CLIENT_ID_FILE"), 35 - oidc_client_secret: Sower.Application.credential!("SOWER_AUTH_OIDC_CLIENT_SECRET_FILE"), 36 - oidc_redirect_uri: 37 - System.get_env("SOWER_AUTH_OIDC_REDIRECT_URI", ~s"#{scheme}://#{host}:#{public_port}/auth") 38 - 39 - if System.get_env() |> Map.has_key?("SOWER_DATABASE_SOCKET") do 40 - config :sower, Sower.Repo, 41 - socket: System.get_env("SOWER_DATABASE_SOCKET"), 42 - database: System.get_env("SOWER_DATABASE_NAME", "sower") 43 - else 44 - config :sower, Sower.Repo, 45 - username: System.get_env("SOWER_DATABASE_USER", "sower"), 46 - password: Sower.Application.credential!("SOWER_DATABASE_PASS_FILE"), 47 - hostname: System.get_env("SOWER_DATABASE_HOST", "localhost"), 48 - database: System.get_env("SOWER_DATABASE_NAME", "sower"), 49 - port: System.get_env("SOWER_DATABASE_PORT", "5432") |> String.to_integer() 50 - end 51 - 52 - # The secret key base is used to sign/encrypt cookies and other secrets. 53 - # A default value is used in config/dev.exs and config/test.exs but you 54 - # want to use a different value for prod and you most likely don't want 55 - # to check this value into version control, so we use an environment 56 - # variable instead. 57 - secret_key_base = Sower.Application.credential!("SECRET_KEY_BASE_FILE") 58 - 59 - port = String.to_integer(System.get_env("SOWER_LISTEN_PORT", "4000")) 60 - 61 - {:ok, listen_ip} = 62 - System.get_env("SOWER_LISTEN_ADDRESS", "127.0.0.1") 63 - |> to_charlist() 64 - |> :inet.parse_address() 65 - 66 - config :sower, SowerWeb.Endpoint, 67 - url: [host: host, port: public_port, scheme: scheme], 68 - http: [ip: listen_ip, port: port], 69 - secret_key_base: secret_key_base 70 - 71 - # ## SSL Support 72 - # 73 - # To get SSL working, you will need to add the `https` key 74 - # to your endpoint configuration: 75 - # 76 - # config :sower, SowerWeb.Endpoint, 77 - # https: [ 78 - # ..., 79 - # port: 443, 80 - # cipher_suite: :strong, 81 - # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), 82 - # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") 83 - # ] 84 - # 85 - # The `cipher_suite` is set to `:strong` to support only the 86 - # latest and more secure SSL ciphers. This means old browsers 87 - # and clients may not be supported. You can set it to 88 - # `:compatible` for wider support. 89 - # 90 - # `:keyfile` and `:certfile` expect an absolute path to the key 91 - # and cert in disk or a relative path inside priv, for example 92 - # "priv/ssl/server.key". For all supported SSL configuration 93 - # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 94 - # 95 - # We also recommend setting `force_ssl` in your endpoint, ensuring 96 - # no data is ever sent via http, always redirecting to https: 97 - # 98 - # config :sower, SowerWeb.Endpoint, 99 - # force_ssl: [hsts: true] 100 - # 101 - # Check `Plug.SSL` for all available options in `force_ssl`. 102 - 103 - # ## Configuring the mailer 104 - # 105 - # In production you need to configure the mailer to use a different adapter. 106 - # Also, you may need to configure the Swoosh API client of your choice if you 107 - # are not using SMTP. Here is an example of the configuration: 108 - # 109 - # config :sower, Sower.Mailer, 110 - # adapter: Swoosh.Adapters.Mailgun, 111 - # api_key: System.get_env("MAILGUN_API_KEY"), 112 - # domain: System.get_env("MAILGUN_DOMAIN") 113 - # 114 - # For this example you need include a HTTP client required by Swoosh API client. 115 - # Swoosh supports Hackney and Finch out of the box: 116 - # 117 - # config :swoosh, :api_client, Swoosh.ApiClient.Hackney 118 - # 119 - # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details. 120 - end
+13
dev-server.json
··· 1 + { 2 + "public_url": "http://localhost:4000", 3 + "auth": { 4 + "oidc_base_url": "https://sower.junco.dev", 5 + "oidc_client_id": "sower-dev" 6 + }, 7 + "database": { 8 + "username": "postgres", 9 + "hostname": "localhost", 10 + "database": "sower_dev", 11 + "port": 5432 12 + } 13 + }
+1 -133
flake.lock
··· 63 63 "type": "github" 64 64 } 65 65 }, 66 - "crane_3": { 67 - "inputs": { 68 - "nixpkgs": [ 69 - "typhon", 70 - "nixpkgs" 71 - ] 72 - }, 73 - "locked": { 74 - "lastModified": 1706473964, 75 - "narHash": "sha256-Fq6xleee/TsX6NbtoRuI96bBuDHMU57PrcK9z1QEKbk=", 76 - "owner": "ipetkov", 77 - "repo": "crane", 78 - "rev": "c798790eabec3e3da48190ae3698ac227aab770c", 79 - "type": "github" 80 - }, 81 - "original": { 82 - "owner": "ipetkov", 83 - "repo": "crane", 84 - "type": "github" 85 - } 86 - }, 87 66 "flake-compat": { 88 67 "flake": false, 89 68 "locked": { ··· 100 79 "type": "github" 101 80 } 102 81 }, 103 - "flake-compat_2": { 104 - "flake": false, 105 - "locked": { 106 - "lastModified": 1696426674, 107 - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", 108 - "owner": "edolstra", 109 - "repo": "flake-compat", 110 - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", 111 - "type": "github" 112 - }, 113 - "original": { 114 - "owner": "edolstra", 115 - "repo": "flake-compat", 116 - "type": "github" 117 - } 118 - }, 119 82 "flake-parts": { 120 83 "inputs": { 121 84 "nixpkgs-lib": "nixpkgs-lib" ··· 134 97 "type": "github" 135 98 } 136 99 }, 137 - "flake-schemas": { 138 - "locked": { 139 - "lastModified": 1697467827, 140 - "narHash": "sha256-j8SR19V1SRysyJwpOBF4TLuAvAjF5t+gMiboN4gYQDU=", 141 - "owner": "determinatesystems", 142 - "repo": "flake-schemas", 143 - "rev": "764932025c817d4e500a8d2a4d8c565563923d29", 144 - "type": "github" 145 - }, 146 - "original": { 147 - "owner": "determinatesystems", 148 - "repo": "flake-schemas", 149 - "type": "github" 150 - } 151 - }, 152 100 "flake-utils": { 153 101 "locked": { 154 102 "lastModified": 1667395993, ··· 182 130 "type": "github" 183 131 } 184 132 }, 185 - "flake-utils_3": { 186 - "inputs": { 187 - "systems": "systems_2" 188 - }, 189 - "locked": { 190 - "lastModified": 1681202837, 191 - "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", 192 - "owner": "numtide", 193 - "repo": "flake-utils", 194 - "rev": "cfacdce06f30d2b68473a46042957675eebb3401", 195 - "type": "github" 196 - }, 197 - "original": { 198 - "owner": "numtide", 199 - "repo": "flake-utils", 200 - "type": "github" 201 - } 202 - }, 203 133 "next-ls": { 204 134 "inputs": { 205 135 "nixpkgs": "nixpkgs_2" ··· 317 247 "nixpkgs": "nixpkgs_3", 318 248 "process-compose-flake": "process-compose-flake", 319 249 "rust-overlay": "rust-overlay", 320 - "services-flake": "services-flake", 321 - "typhon": "typhon" 250 + "services-flake": "services-flake" 322 251 } 323 252 }, 324 253 "rust-overlay": { ··· 342 271 "type": "github" 343 272 } 344 273 }, 345 - "rust-overlay_2": { 346 - "inputs": { 347 - "flake-utils": "flake-utils_3", 348 - "nixpkgs": [ 349 - "typhon", 350 - "nixpkgs" 351 - ] 352 - }, 353 - "locked": { 354 - "lastModified": 1706494265, 355 - "narHash": "sha256-4ilEUJEwNaY9r/8BpL3VmZiaGber0j09lvvx0e/bosA=", 356 - "owner": "oxalica", 357 - "repo": "rust-overlay", 358 - "rev": "246ba7102553851af60e0382f558f6bc5f63fa13", 359 - "type": "github" 360 - }, 361 - "original": { 362 - "owner": "oxalica", 363 - "repo": "rust-overlay", 364 - "type": "github" 365 - } 366 - }, 367 274 "services-flake": { 368 275 "locked": { 369 276 "lastModified": 1716920880, ··· 391 298 "original": { 392 299 "owner": "nix-systems", 393 300 "repo": "default", 394 - "type": "github" 395 - } 396 - }, 397 - "systems_2": { 398 - "locked": { 399 - "lastModified": 1681028828, 400 - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 401 - "owner": "nix-systems", 402 - "repo": "default", 403 - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 404 - "type": "github" 405 - }, 406 - "original": { 407 - "owner": "nix-systems", 408 - "repo": "default", 409 - "type": "github" 410 - } 411 - }, 412 - "typhon": { 413 - "inputs": { 414 - "crane": "crane_3", 415 - "flake-compat": "flake-compat_2", 416 - "flake-schemas": "flake-schemas", 417 - "nixpkgs": [ 418 - "nixpkgs" 419 - ], 420 - "rust-overlay": "rust-overlay_2" 421 - }, 422 - "locked": { 423 - "lastModified": 1708693001, 424 - "narHash": "sha256-1jRuMCCSabHPcaNvkcyd+4HdDFnn4Wr2JiB57kwba40=", 425 - "owner": "typhon-ci", 426 - "repo": "typhon", 427 - "rev": "f4bafa37cc195831d7ed6f52ef69b0de5b880b9f", 428 - "type": "github" 429 - }, 430 - "original": { 431 - "owner": "typhon-ci", 432 - "repo": "typhon", 433 301 "type": "github" 434 302 } 435 303 }
-13
flake.nix
··· 10 10 rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; 11 11 rust-overlay.url = "github:oxalica/rust-overlay"; 12 12 services-flake.url = "github:juspay/services-flake"; 13 - typhon.inputs.nixpkgs.follows = "nixpkgs"; 14 - typhon.url = "github:typhon-ci/typhon"; 15 13 }; 16 14 17 15 outputs = ··· 130 128 flake = { 131 129 nixosModules.sower = ./nix/nixos-module.nix; 132 130 homeModules.sower = ./nix/home-module.nix; 133 - 134 - typhonProject = inputs.typhon.lib.gitea.mkProject { 135 - instance = "git.junco.dev"; 136 - owner = "adam"; 137 - repo = "sower"; 138 - secrets = ./nix/typhon-secrets.age; 139 - typhonUrl = "https://typhon.junco.dev"; 140 - }; 141 - typhonJobs = lib.recursiveUpdate (inputs.nixpkgs.lib.genAttrs systems (system: { 142 - inherit (self.packages.${system}) client; 143 - })) { x86_64-linux.server = self.packages.x86_64-linux.server; }; 144 131 }; 145 132 } 146 133 );
+3
justfile
··· 35 35 start: 36 36 iex -S mix phx.server 37 37 38 + test: 39 + nix build .#checks.x86_64-linux.default --print-build-logs 40 + 38 41 update-elixir: && nix-lock 39 42 mix deps.update --all 40 43 mix deps.clean --unused --unlock
+2 -15
lib/sower/application.ex
··· 19 19 config: %{metadata: [:file, :line]} 20 20 }) 21 21 22 + Sower.Config.load() 23 + 22 24 # See https://hexdocs.pm/elixir/Supervisor.html 23 25 # for other strategies and supported options 24 26 opts = [strategy: :one_for_one, name: Sower.Supervisor] ··· 32 34 SowerWeb.Endpoint.config_change(changed, removed) 33 35 :ok 34 36 end 35 - 36 - def credential!(name) do 37 - credential_dir = System.get_env("CREDENTIALS_DIRECTORY") 38 - credential = System.get_env(name) 39 - 40 - case read_credential(name, credential_dir, credential) do 41 - {:ok, value} -> value |> String.trim() 42 - {:error, err} -> raise ~s"unable to load credential #{name}, #{err}" 43 - end 44 - end 45 - 46 - defp read_credential(_, nil, cred), do: read_credential(cred) 47 - defp read_credential(name, dir, nil), do: read_credential(~s"#{dir}/#{name}") 48 - defp read_credential(_, dir, cred), do: read_credential(~s"#{dir}/#{cred}") 49 - defp read_credential(path), do: File.read(path) 50 37 end
+212
lib/sower/config.ex
··· 1 + defmodule Sower.Config do 2 + require Logger 3 + 4 + @credentials [ 5 + "SOWER_AUTH_OIDC_CLIENT_SECRET_FILE" 6 + ] 7 + 8 + @schema %{ 9 + "type" => "object", 10 + "required" => ["auth", "database"], 11 + "properties" => %{ 12 + "auth" => %{ 13 + "type" => "object", 14 + "required" => ["oidc_base_url", "oidc_client_id"], 15 + "properties" => %{ 16 + "oidc_base_url" => %{ 17 + "type" => "string" 18 + }, 19 + "oidc_client_id" => %{ 20 + "type" => "string" 21 + }, 22 + "oidc_redirect_url" => %{ 23 + "type" => "string" 24 + } 25 + } 26 + }, 27 + "database" => %{ 28 + "type" => "object", 29 + "properties" => %{ 30 + "host" => %{ 31 + "type" => "string" 32 + }, 33 + "database" => %{ 34 + "type" => "string" 35 + }, 36 + "pass_file" => %{ 37 + "type" => "string" 38 + }, 39 + "port" => %{ 40 + "type" => "integer", 41 + "minimum" => 80, 42 + "maximum" => 65535 43 + }, 44 + "socket" => %{ 45 + "type" => "string" 46 + }, 47 + "user" => %{ 48 + "type" => "string" 49 + } 50 + } 51 + }, 52 + "public_url" => %{ 53 + "type" => "string", 54 + "format" => "uri" 55 + }, 56 + "listen_address" => %{ 57 + "type" => "string", 58 + "format" => "ipv4" 59 + }, 60 + "listen_port" => %{ 61 + "default" => 4000, 62 + "type" => "integer", 63 + "minimum" => 80, 64 + "maximum" => 65535 65 + } 66 + } 67 + } 68 + 69 + def load() do 70 + Logger.debug("Loading configuration") 71 + {:ok, _} = Application.ensure_all_started(:jason) 72 + 73 + config_file = System.get_env("SOWER_SERVER_CONFIG_FILE", "/etc/sower/server.json") 74 + 75 + json_config = 76 + with {:ok, contents} <- File.read(config_file), 77 + {:ok, json} <- Jason.decode(contents), 78 + :ok <- ExJsonSchema.Validator.validate(ExJsonSchema.Schema.resolve(@schema), json) do 79 + json 80 + else 81 + {:error, err} -> 82 + Logger.error(~s"Failed to read configuration file #{config_file}") 83 + Logger.error(err) 84 + Kernel.exit(1) 85 + end 86 + 87 + Logger.debug("Loaded configuration:") 88 + Logger.debug(json_config) 89 + 90 + # load some defaults 91 + public_url = json_config |> Map.get("public_url", "http://127.0.0.1:4000") 92 + put_env(:auth, oidc_redirect_url: ~s"#{public_url}/auth") 93 + put_env(:listen_address, "127.0.0.1") 94 + put_env(:listen_port, 4000) 95 + 96 + json_config |> Enum.map(&load_config(&1)) 97 + @credentials |> Enum.map(&load_credential(&1)) 98 + 99 + # load some non-app namespaced configs 100 + %URI{scheme: scheme, host: host, port: port} = URI.parse(public_url) 101 + 102 + put_env(SowerWeb.Endpoint, 103 + url: [host: host, port: port, scheme: scheme], 104 + http: [ip: ip_to_inet(fetch_env!(:listen_address)), port: fetch_env!(:listen_port)], 105 + secret_key_base: credential!("SOWER_SECRET_KEY_BASE_FILE"), 106 + persistent: true 107 + ) 108 + 109 + Logger.debug("Finished loading configuration") 110 + end 111 + 112 + defp load_config({config_atom, values}) when is_map(values) do 113 + config_atom = String.to_atom(config_atom) 114 + values = Keyword.new(values, fn {k, v} -> {String.to_atom(k), v} end) 115 + put_env(config_atom, values) 116 + end 117 + 118 + defp load_config({config_atom, value}) when is_binary(value) do 119 + config_atom = String.to_atom(config_atom) 120 + put_env(config_atom, value) 121 + end 122 + 123 + defp credential(name) do 124 + credential_dir = System.get_env("CREDENTIALS_DIRECTORY") 125 + credential = System.get_env(name) 126 + 127 + case read_credential(name, credential_dir, credential) do 128 + {:ok, value} -> {:ok, value |> String.trim()} 129 + {:error, err} -> {:error, ~s"unable to load credential #{name}, #{err}"} 130 + end 131 + end 132 + 133 + defp load_credential(cred) when is_binary(cred) do 134 + Logger.debug(~s"Loading credential #{cred}") 135 + 136 + captures = 137 + ~r/SOWER_(?<section>[[:alnum:]]+)_(?<key>.+)_FILE/ 138 + |> Regex.named_captures(cred) 139 + 140 + if captures == nil do 141 + Logger.error(~s"Credential #{cred} cannot be parsed") 142 + Kernel.exit(1) 143 + end 144 + 145 + section = captures["section"] |> String.downcase() |> String.to_atom() 146 + 147 + key = captures["key"] |> String.downcase() |> String.to_atom() 148 + 149 + case credential(cred) do 150 + {:ok, path} -> 151 + put_env(section, [{key, path}]) 152 + :ok 153 + 154 + {:error, _err} -> 155 + :error 156 + end 157 + end 158 + 159 + def credential!(name) do 160 + case credential(name) do 161 + {:ok, value} -> value 162 + {:error, err} -> raise err 163 + end 164 + end 165 + 166 + defp read_credential(name, nil, nil) do 167 + Logger.warning(~s"Could not load credential from env: #{name}") 168 + {:error, "not found"} 169 + end 170 + 171 + defp read_credential(_, nil, cred), do: read_credential(cred) 172 + 173 + defp read_credential(name, dir, nil), do: read_credential(~s"#{dir}/#{name}") 174 + defp read_credential(_, dir, cred), do: read_credential(~s"#{dir}/#{cred}") 175 + defp read_credential(path) when is_binary(path), do: path |> File.read() 176 + 177 + defp read_credential(nil) do 178 + Logger.error("Could not find credential") 179 + Kernel.exit(1) 180 + end 181 + 182 + defp put_env(config_atom, new_values) when is_atom(config_atom) and is_list(new_values) do 183 + config = 184 + case Application.fetch_env(:sower, config_atom) do 185 + {:ok, previous_values} -> Keyword.merge(previous_values, new_values) 186 + :error -> new_values 187 + end 188 + 189 + Application.put_env(:sower, config_atom, config, persistent: true) 190 + end 191 + 192 + defp put_env(config_atom, new_value) when is_atom(config_atom) do 193 + Application.put_env(:sower, config_atom, new_value, persistent: true) 194 + end 195 + 196 + defp fetch_env!(config_atom) when is_atom(config_atom) do 197 + Application.fetch_env!(:sower, config_atom) 198 + end 199 + 200 + defp ip_to_inet(ip) do 201 + case ip 202 + |> to_charlist() 203 + |> :inet.parse_address() do 204 + {:ok, ip} -> 205 + ip 206 + 207 + {:error, _err} -> 208 + Logger.error(~s"Failed to parse ip #{ip}") 209 + Kernel.exit(1) 210 + end 211 + end 212 + end
+4
lib/sower/repo.ex
··· 9 9 "uuid-ossp" 10 10 ] 11 11 end 12 + 13 + def init(_context, config) do 14 + {:ok, Keyword.merge(config, Application.get_env(:sower, :database))} 15 + end 12 16 end
+4 -4
lib/sower_web/client_channel.ex
··· 34 34 def handle_in( 35 35 "seed:sync", 36 36 %{ 37 - "booted_seed" => booted_seed, 38 - "current_seed" => current_seed, 39 - "profile_seed" => profile_seed 37 + # "booted_seed" => booted_seed, 38 + # "current_seed" => current_seed, 39 + # "profile_seed" => profile_seed 40 40 }, 41 41 socket 42 42 ) do 43 - tree = 43 + _tree = 44 44 Sower.Tree.by_id(socket.assigns.tree_id) 45 45 |> Ash.load([:booted_seed, :current_seed, :profile_seed, :latest_seed]) 46 46
+7 -1
lib/sower_web/client_socket.ex
··· 6 6 7 7 @impl true 8 8 def connect(%{"token" => token}, socket, _connect_info) do 9 - signer = Joken.Signer.create("HS256", Application.fetch_env!(:sower, :bootstrap_token)) 9 + bootstrap_token = 10 + case Application.fetch_env(:sower, :bootstrap_token) do 11 + {:ok, token} -> token 12 + :error -> Kernel.exit(:no_bootstrap_token) 13 + end 14 + 15 + signer = Joken.Signer.create("HS256", bootstrap_token) 10 16 11 17 case Joken.Signer.verify(token, signer) do 12 18 {:ok, claims} ->
+1
mix.exs
··· 23 23 {:ash_postgres, "~> 2.0.0"}, 24 24 {:bandit, "~> 1.0"}, 25 25 {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, 26 + {:ex_json_schema, "~> 0.10.2"}, 26 27 {:finch, "~> 0.13"}, 27 28 {:floki, ">= 0.30.0", only: :test}, 28 29 {:gettext, "~> 0.20"},
+1
mix.lock
··· 22 22 "enough": {:hex, :enough, "0.1.0", "0254710c52d324e2dadde54cb56fbb80a792c2eb285669b8379efd0752bf89f0", [:rebar3], [], "hexpm", "0460c7abda5f5e0ea592b12bc6976b8a5c4b96e42f332059cd396525374bf9a1"}, 23 23 "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, 24 24 "ets": {:hex, :ets, "0.9.0", "79c6a6c205436780486f72d84230c6cba2f8a9920456750ddd1e47389107d5fd", [:mix], [], "hexpm", "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"}, 25 + "ex_json_schema": {:hex, :ex_json_schema, "0.10.2", "7c4b8c1481fdeb1741e2ce66223976edfb9bccebc8014f6aec35d4efe964fb71", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "37f43be60f8407659d4d0155a7e45e7f406dab1f827051d3d35858a709baf6a6"}, 25 26 "expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"}, 26 27 "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, 27 28 "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"},
+972 -742
nix/mix.nix
··· 1 - { lib, beamPackages, overrides ? (x: y: {}) }: 1 + { 2 + lib, 3 + beamPackages, 4 + overrides ? (x: y: { }), 5 + }: 2 6 3 7 let 4 8 buildRebar3 = lib.makeOverridable beamPackages.buildRebar3; ··· 7 11 8 12 self = packages // (overrides self packages); 9 13 10 - packages = with beamPackages; with self; { 11 - ash = buildMix rec { 12 - name = "ash"; 13 - version = "3.0.8"; 14 + packages = 15 + with beamPackages; 16 + with self; 17 + { 18 + ash = buildMix rec { 19 + name = "ash"; 20 + version = "3.0.8"; 21 + 22 + src = fetchHex { 23 + pkg = "ash"; 24 + version = "${version}"; 25 + sha256 = "92436ab7c465d8a8706383cb9cfd9fbf074d4bd8632b86895a6e6bf3b9eee2cd"; 26 + }; 14 27 15 - src = fetchHex { 16 - pkg = "ash"; 17 - version = "${version}"; 18 - sha256 = "92436ab7c465d8a8706383cb9cfd9fbf074d4bd8632b86895a6e6bf3b9eee2cd"; 28 + beamDeps = [ 29 + comparable 30 + decimal 31 + ecto 32 + ets 33 + jason 34 + plug 35 + reactor 36 + spark 37 + splode 38 + stream_data 39 + telemetry 40 + ]; 19 41 }; 20 42 21 - beamDeps = [ comparable decimal ecto ets jason plug reactor spark splode stream_data telemetry ]; 22 - }; 43 + ash_authentication = buildMix rec { 44 + name = "ash_authentication"; 45 + version = "4.0.0"; 23 46 24 - ash_authentication = buildMix rec { 25 - name = "ash_authentication"; 26 - version = "4.0.0"; 47 + src = fetchHex { 48 + pkg = "ash_authentication"; 49 + version = "${version}"; 50 + sha256 = "9da852e60c89596e35363f7866f6500bad1639b5e8c626a77ccad20d40db91f5"; 51 + }; 27 52 28 - src = fetchHex { 29 - pkg = "ash_authentication"; 30 - version = "${version}"; 31 - sha256 = "9da852e60c89596e35363f7866f6500bad1639b5e8c626a77ccad20d40db91f5"; 53 + beamDeps = [ 54 + ash 55 + ash_postgres 56 + assent 57 + bcrypt_elixir 58 + castore 59 + finch 60 + jason 61 + joken 62 + plug 63 + spark 64 + splode 65 + ]; 32 66 }; 33 67 34 - beamDeps = [ ash ash_postgres assent bcrypt_elixir castore finch jason joken plug spark splode ]; 35 - }; 68 + ash_authentication_phoenix = buildMix rec { 69 + name = "ash_authentication_phoenix"; 70 + version = "2.0.0"; 36 71 37 - ash_authentication_phoenix = buildMix rec { 38 - name = "ash_authentication_phoenix"; 39 - version = "2.0.0"; 72 + src = fetchHex { 73 + pkg = "ash_authentication_phoenix"; 74 + version = "${version}"; 75 + sha256 = "6a7c24d57ef6f7a4456d5ba139c8221df6a7ed81f15707a23fc33ad369e43a36"; 76 + }; 40 77 41 - src = fetchHex { 42 - pkg = "ash_authentication_phoenix"; 43 - version = "${version}"; 44 - sha256 = "6a7c24d57ef6f7a4456d5ba139c8221df6a7ed81f15707a23fc33ad369e43a36"; 78 + beamDeps = [ 79 + ash 80 + ash_authentication 81 + ash_phoenix 82 + bcrypt_elixir 83 + jason 84 + phoenix 85 + phoenix_html 86 + phoenix_html_helpers 87 + phoenix_live_view 88 + phoenix_view 89 + slugify 90 + ]; 45 91 }; 46 92 47 - beamDeps = [ ash ash_authentication ash_phoenix bcrypt_elixir jason phoenix phoenix_html phoenix_html_helpers phoenix_live_view phoenix_view slugify ]; 48 - }; 93 + ash_json_api = buildMix rec { 94 + name = "ash_json_api"; 95 + version = "1.1.0"; 49 96 50 - ash_json_api = buildMix rec { 51 - name = "ash_json_api"; 52 - version = "1.1.0"; 97 + src = fetchHex { 98 + pkg = "ash_json_api"; 99 + version = "${version}"; 100 + sha256 = "0db08bc19ac52d3adb31df5a2090cfa0da2937b413b9f4cd7738b0a876200454"; 101 + }; 53 102 54 - src = fetchHex { 55 - pkg = "ash_json_api"; 56 - version = "${version}"; 57 - sha256 = "0db08bc19ac52d3adb31df5a2090cfa0da2937b413b9f4cd7738b0a876200454"; 103 + beamDeps = [ 104 + ash 105 + jason 106 + json_xema 107 + open_api_spex 108 + plug 109 + ]; 58 110 }; 59 111 60 - beamDeps = [ ash jason json_xema open_api_spex plug ]; 61 - }; 112 + ash_phoenix = buildMix rec { 113 + name = "ash_phoenix"; 114 + version = "2.0.2"; 62 115 63 - ash_phoenix = buildMix rec { 64 - name = "ash_phoenix"; 65 - version = "2.0.2"; 116 + src = fetchHex { 117 + pkg = "ash_phoenix"; 118 + version = "${version}"; 119 + sha256 = "fc7ee7bf3bbc8abe36e4e940d754bd326aa360092d01f64095fbbb31fe3fe606"; 120 + }; 66 121 67 - src = fetchHex { 68 - pkg = "ash_phoenix"; 69 - version = "${version}"; 70 - sha256 = "fc7ee7bf3bbc8abe36e4e940d754bd326aa360092d01f64095fbbb31fe3fe606"; 122 + beamDeps = [ 123 + ash 124 + phoenix 125 + phoenix_html 126 + phoenix_live_view 127 + ]; 71 128 }; 72 129 73 - beamDeps = [ ash phoenix phoenix_html phoenix_live_view ]; 74 - }; 130 + ash_postgres = buildMix rec { 131 + name = "ash_postgres"; 132 + version = "2.0.6"; 75 133 76 - ash_postgres = buildMix rec { 77 - name = "ash_postgres"; 78 - version = "2.0.6"; 134 + src = fetchHex { 135 + pkg = "ash_postgres"; 136 + version = "${version}"; 137 + sha256 = "9b096d4ba605bcf6909fa04f4dee3f982141b89822bb1a2e52a58065615ddf88"; 138 + }; 79 139 80 - src = fetchHex { 81 - pkg = "ash_postgres"; 82 - version = "${version}"; 83 - sha256 = "9b096d4ba605bcf6909fa04f4dee3f982141b89822bb1a2e52a58065615ddf88"; 140 + beamDeps = [ 141 + ash 142 + ash_sql 143 + ecto 144 + ecto_sql 145 + jason 146 + postgrex 147 + ]; 84 148 }; 85 149 86 - beamDeps = [ ash ash_sql ecto ecto_sql jason postgrex ]; 87 - }; 150 + ash_sql = buildMix rec { 151 + name = "ash_sql"; 152 + version = "0.2.0"; 88 153 89 - ash_sql = buildMix rec { 90 - name = "ash_sql"; 91 - version = "0.2.0"; 154 + src = fetchHex { 155 + pkg = "ash_sql"; 156 + version = "${version}"; 157 + sha256 = "bc8997b6fdf52a0144c17969aef88bd2dc22958c8d1b1c18fbcfb4bec3b849f1"; 158 + }; 92 159 93 - src = fetchHex { 94 - pkg = "ash_sql"; 95 - version = "${version}"; 96 - sha256 = "bc8997b6fdf52a0144c17969aef88bd2dc22958c8d1b1c18fbcfb4bec3b849f1"; 160 + beamDeps = [ 161 + ash 162 + ecto 163 + ecto_sql 164 + ]; 97 165 }; 98 166 99 - beamDeps = [ ash ecto ecto_sql ]; 100 - }; 167 + assent = buildMix rec { 168 + name = "assent"; 169 + version = "0.2.10"; 101 170 102 - assent = buildMix rec { 103 - name = "assent"; 104 - version = "0.2.10"; 171 + src = fetchHex { 172 + pkg = "assent"; 173 + version = "${version}"; 174 + sha256 = "8483bf9621e994795a70a4ad8fda725abfb6a9675d63a9bfd4217c76d4a2d82a"; 175 + }; 105 176 106 - src = fetchHex { 107 - pkg = "assent"; 108 - version = "${version}"; 109 - sha256 = "8483bf9621e994795a70a4ad8fda725abfb6a9675d63a9bfd4217c76d4a2d82a"; 177 + beamDeps = [ 178 + certifi 179 + finch 180 + jason 181 + jose 182 + mint 183 + ssl_verify_fun 184 + ]; 110 185 }; 111 186 112 - beamDeps = [ certifi finch jason jose mint ssl_verify_fun ]; 113 - }; 187 + bandit = buildMix rec { 188 + name = "bandit"; 189 + version = "1.5.2"; 114 190 115 - bandit = buildMix rec { 116 - name = "bandit"; 117 - version = "1.5.2"; 191 + src = fetchHex { 192 + pkg = "bandit"; 193 + version = "${version}"; 194 + sha256 = "35ddbdce7e8a2a3c6b5093f7299d70832a43ed2f4a1852885a61d334cab1b4ad"; 195 + }; 118 196 119 - src = fetchHex { 120 - pkg = "bandit"; 121 - version = "${version}"; 122 - sha256 = "35ddbdce7e8a2a3c6b5093f7299d70832a43ed2f4a1852885a61d334cab1b4ad"; 197 + beamDeps = [ 198 + hpax 199 + plug 200 + telemetry 201 + thousand_island 202 + websock 203 + ]; 123 204 }; 124 205 125 - beamDeps = [ hpax plug telemetry thousand_island websock ]; 126 - }; 206 + bcrypt_elixir = buildMix rec { 207 + name = "bcrypt_elixir"; 208 + version = "3.1.0"; 127 209 128 - bcrypt_elixir = buildMix rec { 129 - name = "bcrypt_elixir"; 130 - version = "3.1.0"; 210 + src = fetchHex { 211 + pkg = "bcrypt_elixir"; 212 + version = "${version}"; 213 + sha256 = "2ad2acb5a8bc049e8d5aa267802631912bb80d5f4110a178ae7999e69dca1bf7"; 214 + }; 131 215 132 - src = fetchHex { 133 - pkg = "bcrypt_elixir"; 134 - version = "${version}"; 135 - sha256 = "2ad2acb5a8bc049e8d5aa267802631912bb80d5f4110a178ae7999e69dca1bf7"; 216 + beamDeps = [ 217 + comeonin 218 + elixir_make 219 + ]; 136 220 }; 137 221 138 - beamDeps = [ comeonin elixir_make ]; 139 - }; 222 + castore = buildMix rec { 223 + name = "castore"; 224 + version = "1.0.7"; 140 225 141 - castore = buildMix rec { 142 - name = "castore"; 143 - version = "1.0.7"; 226 + src = fetchHex { 227 + pkg = "castore"; 228 + version = "${version}"; 229 + sha256 = "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"; 230 + }; 144 231 145 - src = fetchHex { 146 - pkg = "castore"; 147 - version = "${version}"; 148 - sha256 = "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"; 232 + beamDeps = [ ]; 149 233 }; 150 234 151 - beamDeps = []; 152 - }; 235 + certifi = buildRebar3 rec { 236 + name = "certifi"; 237 + version = "2.12.0"; 153 238 154 - certifi = buildRebar3 rec { 155 - name = "certifi"; 156 - version = "2.12.0"; 239 + src = fetchHex { 240 + pkg = "certifi"; 241 + version = "${version}"; 242 + sha256 = "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"; 243 + }; 157 244 158 - src = fetchHex { 159 - pkg = "certifi"; 160 - version = "${version}"; 161 - sha256 = "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"; 245 + beamDeps = [ ]; 162 246 }; 163 247 164 - beamDeps = []; 165 - }; 248 + comeonin = buildMix rec { 249 + name = "comeonin"; 250 + version = "5.4.0"; 166 251 167 - comeonin = buildMix rec { 168 - name = "comeonin"; 169 - version = "5.4.0"; 252 + src = fetchHex { 253 + pkg = "comeonin"; 254 + version = "${version}"; 255 + sha256 = "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"; 256 + }; 170 257 171 - src = fetchHex { 172 - pkg = "comeonin"; 173 - version = "${version}"; 174 - sha256 = "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"; 258 + beamDeps = [ ]; 175 259 }; 176 260 177 - beamDeps = []; 178 - }; 261 + comparable = buildMix rec { 262 + name = "comparable"; 263 + version = "1.0.0"; 179 264 180 - comparable = buildMix rec { 181 - name = "comparable"; 182 - version = "1.0.0"; 265 + src = fetchHex { 266 + pkg = "comparable"; 267 + version = "${version}"; 268 + sha256 = "277c11eeb1cd726e7cd41c6c199e7e52fa16ee6830b45ad4cdc62e51f62eb60c"; 269 + }; 183 270 184 - src = fetchHex { 185 - pkg = "comparable"; 186 - version = "${version}"; 187 - sha256 = "277c11eeb1cd726e7cd41c6c199e7e52fa16ee6830b45ad4cdc62e51f62eb60c"; 271 + beamDeps = [ typable ]; 188 272 }; 189 273 190 - beamDeps = [ typable ]; 191 - }; 274 + conv_case = buildMix rec { 275 + name = "conv_case"; 276 + version = "0.2.3"; 192 277 193 - conv_case = buildMix rec { 194 - name = "conv_case"; 195 - version = "0.2.3"; 278 + src = fetchHex { 279 + pkg = "conv_case"; 280 + version = "${version}"; 281 + sha256 = "88f29a3d97d1742f9865f7e394ed3da011abb7c5e8cc104e676fdef6270d4b4a"; 282 + }; 196 283 197 - src = fetchHex { 198 - pkg = "conv_case"; 199 - version = "${version}"; 200 - sha256 = "88f29a3d97d1742f9865f7e394ed3da011abb7c5e8cc104e676fdef6270d4b4a"; 284 + beamDeps = [ ]; 201 285 }; 202 286 203 - beamDeps = []; 204 - }; 287 + db_connection = buildMix rec { 288 + name = "db_connection"; 289 + version = "2.6.0"; 205 290 206 - db_connection = buildMix rec { 207 - name = "db_connection"; 208 - version = "2.6.0"; 291 + src = fetchHex { 292 + pkg = "db_connection"; 293 + version = "${version}"; 294 + sha256 = "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"; 295 + }; 209 296 210 - src = fetchHex { 211 - pkg = "db_connection"; 212 - version = "${version}"; 213 - sha256 = "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"; 297 + beamDeps = [ telemetry ]; 214 298 }; 215 299 216 - beamDeps = [ telemetry ]; 217 - }; 300 + decimal = buildMix rec { 301 + name = "decimal"; 302 + version = "2.1.1"; 218 303 219 - decimal = buildMix rec { 220 - name = "decimal"; 221 - version = "2.1.1"; 304 + src = fetchHex { 305 + pkg = "decimal"; 306 + version = "${version}"; 307 + sha256 = "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"; 308 + }; 222 309 223 - src = fetchHex { 224 - pkg = "decimal"; 225 - version = "${version}"; 226 - sha256 = "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"; 310 + beamDeps = [ ]; 227 311 }; 228 312 229 - beamDeps = []; 230 - }; 313 + deep_merge = buildMix rec { 314 + name = "deep_merge"; 315 + version = "1.0.0"; 231 316 232 - ecto = buildMix rec { 233 - name = "ecto"; 234 - version = "3.11.2"; 317 + src = fetchHex { 318 + pkg = "deep_merge"; 319 + version = "${version}"; 320 + sha256 = "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"; 321 + }; 235 322 236 - src = fetchHex { 237 - pkg = "ecto"; 238 - version = "${version}"; 239 - sha256 = "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"; 323 + beamDeps = [ ]; 240 324 }; 241 325 242 - beamDeps = [ decimal jason telemetry ]; 243 - }; 326 + ecto = buildMix rec { 327 + name = "ecto"; 328 + version = "3.11.2"; 244 329 245 - ecto_sql = buildMix rec { 246 - name = "ecto_sql"; 247 - version = "3.11.2"; 330 + src = fetchHex { 331 + pkg = "ecto"; 332 + version = "${version}"; 333 + sha256 = "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"; 334 + }; 248 335 249 - src = fetchHex { 250 - pkg = "ecto_sql"; 251 - version = "${version}"; 252 - sha256 = "73c07f995ac17dbf89d3cfaaf688fcefabcd18b7b004ac63b0dc4ef39499ed6b"; 336 + beamDeps = [ 337 + decimal 338 + jason 339 + telemetry 340 + ]; 253 341 }; 254 342 255 - beamDeps = [ db_connection ecto postgrex telemetry ]; 256 - }; 343 + ecto_sql = buildMix rec { 344 + name = "ecto_sql"; 345 + version = "3.11.2"; 257 346 258 - elixir_make = buildMix rec { 259 - name = "elixir_make"; 260 - version = "0.8.3"; 347 + src = fetchHex { 348 + pkg = "ecto_sql"; 349 + version = "${version}"; 350 + sha256 = "73c07f995ac17dbf89d3cfaaf688fcefabcd18b7b004ac63b0dc4ef39499ed6b"; 351 + }; 261 352 262 - src = fetchHex { 263 - pkg = "elixir_make"; 264 - version = "${version}"; 265 - sha256 = "5c99a18571a756d4af7a4d89ca75c28ac899e6103af6f223982f09ce44942cc9"; 353 + beamDeps = [ 354 + db_connection 355 + ecto 356 + postgrex 357 + telemetry 358 + ]; 266 359 }; 267 360 268 - beamDeps = [ castore certifi ]; 269 - }; 361 + elixir_make = buildMix rec { 362 + name = "elixir_make"; 363 + version = "0.8.3"; 270 364 271 - enough = buildRebar3 rec { 272 - name = "enough"; 273 - version = "0.1.0"; 365 + src = fetchHex { 366 + pkg = "elixir_make"; 367 + version = "${version}"; 368 + sha256 = "5c99a18571a756d4af7a4d89ca75c28ac899e6103af6f223982f09ce44942cc9"; 369 + }; 274 370 275 - src = fetchHex { 276 - pkg = "enough"; 277 - version = "${version}"; 278 - sha256 = "0460c7abda5f5e0ea592b12bc6976b8a5c4b96e42f332059cd396525374bf9a1"; 371 + beamDeps = [ 372 + castore 373 + certifi 374 + ]; 279 375 }; 280 376 281 - beamDeps = []; 282 - }; 377 + enough = buildRebar3 rec { 378 + name = "enough"; 379 + version = "0.1.0"; 283 380 284 - esbuild = buildMix rec { 285 - name = "esbuild"; 286 - version = "0.8.1"; 381 + src = fetchHex { 382 + pkg = "enough"; 383 + version = "${version}"; 384 + sha256 = "0460c7abda5f5e0ea592b12bc6976b8a5c4b96e42f332059cd396525374bf9a1"; 385 + }; 287 386 288 - src = fetchHex { 289 - pkg = "esbuild"; 290 - version = "${version}"; 291 - sha256 = "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"; 387 + beamDeps = [ ]; 292 388 }; 293 389 294 - beamDeps = [ castore jason ]; 295 - }; 390 + esbuild = buildMix rec { 391 + name = "esbuild"; 392 + version = "0.8.1"; 296 393 297 - ets = buildMix rec { 298 - name = "ets"; 299 - version = "0.9.0"; 394 + src = fetchHex { 395 + pkg = "esbuild"; 396 + version = "${version}"; 397 + sha256 = "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"; 398 + }; 300 399 301 - src = fetchHex { 302 - pkg = "ets"; 303 - version = "${version}"; 304 - sha256 = "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"; 400 + beamDeps = [ 401 + castore 402 + jason 403 + ]; 305 404 }; 306 405 307 - beamDeps = []; 308 - }; 406 + ets = buildMix rec { 407 + name = "ets"; 408 + version = "0.9.0"; 309 409 310 - expo = buildMix rec { 311 - name = "expo"; 312 - version = "0.5.2"; 410 + src = fetchHex { 411 + pkg = "ets"; 412 + version = "${version}"; 413 + sha256 = "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"; 414 + }; 313 415 314 - src = fetchHex { 315 - pkg = "expo"; 316 - version = "${version}"; 317 - sha256 = "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"; 416 + beamDeps = [ ]; 318 417 }; 319 418 320 - beamDeps = []; 321 - }; 419 + ex_json_schema = buildMix rec { 420 + name = "ex_json_schema"; 421 + version = "0.10.2"; 322 422 323 - file_system = buildMix rec { 324 - name = "file_system"; 325 - version = "1.0.0"; 423 + src = fetchHex { 424 + pkg = "ex_json_schema"; 425 + version = "${version}"; 426 + sha256 = "37f43be60f8407659d4d0155a7e45e7f406dab1f827051d3d35858a709baf6a6"; 427 + }; 326 428 327 - src = fetchHex { 328 - pkg = "file_system"; 329 - version = "${version}"; 330 - sha256 = "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"; 429 + beamDeps = [ decimal ]; 331 430 }; 332 431 333 - beamDeps = []; 334 - }; 432 + expo = buildMix rec { 433 + name = "expo"; 434 + version = "0.5.2"; 335 435 336 - finch = buildMix rec { 337 - name = "finch"; 338 - version = "0.18.0"; 436 + src = fetchHex { 437 + pkg = "expo"; 438 + version = "${version}"; 439 + sha256 = "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"; 440 + }; 339 441 340 - src = fetchHex { 341 - pkg = "finch"; 342 - version = "${version}"; 343 - sha256 = "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"; 442 + beamDeps = [ ]; 344 443 }; 345 444 346 - beamDeps = [ castore mime mint nimble_options nimble_pool telemetry ]; 347 - }; 445 + file_system = buildMix rec { 446 + name = "file_system"; 447 + version = "1.0.0"; 348 448 349 - floki = buildMix rec { 350 - name = "floki"; 351 - version = "0.36.2"; 449 + src = fetchHex { 450 + pkg = "file_system"; 451 + version = "${version}"; 452 + sha256 = "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"; 453 + }; 352 454 353 - src = fetchHex { 354 - pkg = "floki"; 355 - version = "${version}"; 356 - sha256 = "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"; 455 + beamDeps = [ ]; 357 456 }; 358 457 359 - beamDeps = []; 360 - }; 458 + finch = buildMix rec { 459 + name = "finch"; 460 + version = "0.18.0"; 361 461 362 - gettext = buildMix rec { 363 - name = "gettext"; 364 - version = "0.24.0"; 462 + src = fetchHex { 463 + pkg = "finch"; 464 + version = "${version}"; 465 + sha256 = "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"; 466 + }; 365 467 366 - src = fetchHex { 367 - pkg = "gettext"; 368 - version = "${version}"; 369 - sha256 = "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"; 468 + beamDeps = [ 469 + castore 470 + mime 471 + mint 472 + nimble_options 473 + nimble_pool 474 + telemetry 475 + ]; 370 476 }; 371 477 372 - beamDeps = [ expo ]; 373 - }; 478 + floki = buildMix rec { 479 + name = "floki"; 480 + version = "0.36.2"; 374 481 375 - hackney = buildRebar3 rec { 376 - name = "hackney"; 377 - version = "1.20.1"; 482 + src = fetchHex { 483 + pkg = "floki"; 484 + version = "${version}"; 485 + sha256 = "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"; 486 + }; 378 487 379 - src = fetchHex { 380 - pkg = "hackney"; 381 - version = "${version}"; 382 - sha256 = "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"; 488 + beamDeps = [ ]; 383 489 }; 384 490 385 - beamDeps = [ certifi idna metrics mimerl parse_trans ssl_verify_fun unicode_util_compat ]; 386 - }; 491 + gettext = buildMix rec { 492 + name = "gettext"; 493 + version = "0.24.0"; 387 494 388 - hpax = buildMix rec { 389 - name = "hpax"; 390 - version = "0.1.2"; 495 + src = fetchHex { 496 + pkg = "gettext"; 497 + version = "${version}"; 498 + sha256 = "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"; 499 + }; 391 500 392 - src = fetchHex { 393 - pkg = "hpax"; 394 - version = "${version}"; 395 - sha256 = "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"; 501 + beamDeps = [ expo ]; 396 502 }; 397 503 398 - beamDeps = []; 399 - }; 504 + hackney = buildRebar3 rec { 505 + name = "hackney"; 506 + version = "1.20.1"; 400 507 401 - idna = buildRebar3 rec { 402 - name = "idna"; 403 - version = "6.1.1"; 508 + src = fetchHex { 509 + pkg = "hackney"; 510 + version = "${version}"; 511 + sha256 = "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"; 512 + }; 404 513 405 - src = fetchHex { 406 - pkg = "idna"; 407 - version = "${version}"; 408 - sha256 = "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"; 514 + beamDeps = [ 515 + certifi 516 + idna 517 + metrics 518 + mimerl 519 + parse_trans 520 + ssl_verify_fun 521 + unicode_util_compat 522 + ]; 409 523 }; 410 524 411 - beamDeps = [ unicode_util_compat ]; 412 - }; 525 + hpax = buildMix rec { 526 + name = "hpax"; 527 + version = "0.1.2"; 413 528 414 - jason = buildMix rec { 415 - name = "jason"; 416 - version = "1.4.1"; 529 + src = fetchHex { 530 + pkg = "hpax"; 531 + version = "${version}"; 532 + sha256 = "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"; 533 + }; 417 534 418 - src = fetchHex { 419 - pkg = "jason"; 420 - version = "${version}"; 421 - sha256 = "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"; 535 + beamDeps = [ ]; 422 536 }; 423 537 424 - beamDeps = [ decimal ]; 425 - }; 538 + idna = buildRebar3 rec { 539 + name = "idna"; 540 + version = "6.1.1"; 426 541 427 - joken = buildMix rec { 428 - name = "joken"; 429 - version = "2.6.1"; 542 + src = fetchHex { 543 + pkg = "idna"; 544 + version = "${version}"; 545 + sha256 = "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"; 546 + }; 430 547 431 - src = fetchHex { 432 - pkg = "joken"; 433 - version = "${version}"; 434 - sha256 = "ab26122c400b3d254ce7d86ed066d6afad27e70416df947cdcb01e13a7382e68"; 548 + beamDeps = [ unicode_util_compat ]; 435 549 }; 436 550 437 - beamDeps = [ jose ]; 438 - }; 551 + jason = buildMix rec { 552 + name = "jason"; 553 + version = "1.4.1"; 439 554 440 - jose = buildMix rec { 441 - name = "jose"; 442 - version = "1.11.10"; 555 + src = fetchHex { 556 + pkg = "jason"; 557 + version = "${version}"; 558 + sha256 = "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"; 559 + }; 443 560 444 - src = fetchHex { 445 - pkg = "jose"; 446 - version = "${version}"; 447 - sha256 = "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"; 561 + beamDeps = [ decimal ]; 448 562 }; 449 563 450 - beamDeps = []; 451 - }; 564 + joken = buildMix rec { 565 + name = "joken"; 566 + version = "2.6.1"; 452 567 453 - json_xema = buildMix rec { 454 - name = "json_xema"; 455 - version = "0.6.2"; 568 + src = fetchHex { 569 + pkg = "joken"; 570 + version = "${version}"; 571 + sha256 = "ab26122c400b3d254ce7d86ed066d6afad27e70416df947cdcb01e13a7382e68"; 572 + }; 456 573 457 - src = fetchHex { 458 - pkg = "json_xema"; 459 - version = "${version}"; 460 - sha256 = "50c84c537c95fcc76677f1f030af4aed188f538820fc488aeaa3f7dfe04d0edf"; 574 + beamDeps = [ jose ]; 461 575 }; 462 576 463 - beamDeps = [ conv_case xema ]; 464 - }; 577 + jose = buildMix rec { 578 + name = "jose"; 579 + version = "1.11.10"; 465 580 466 - libgraph = buildMix rec { 467 - name = "libgraph"; 468 - version = "0.16.0"; 581 + src = fetchHex { 582 + pkg = "jose"; 583 + version = "${version}"; 584 + sha256 = "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"; 585 + }; 469 586 470 - src = fetchHex { 471 - pkg = "libgraph"; 472 - version = "${version}"; 473 - sha256 = "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"; 587 + beamDeps = [ ]; 474 588 }; 475 589 476 - beamDeps = []; 477 - }; 590 + json_xema = buildMix rec { 591 + name = "json_xema"; 592 + version = "0.6.2"; 478 593 479 - makeup = buildMix rec { 480 - name = "makeup"; 481 - version = "1.1.2"; 594 + src = fetchHex { 595 + pkg = "json_xema"; 596 + version = "${version}"; 597 + sha256 = "50c84c537c95fcc76677f1f030af4aed188f538820fc488aeaa3f7dfe04d0edf"; 598 + }; 482 599 483 - src = fetchHex { 484 - pkg = "makeup"; 485 - version = "${version}"; 486 - sha256 = "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"; 600 + beamDeps = [ 601 + conv_case 602 + xema 603 + ]; 487 604 }; 488 605 489 - beamDeps = [ nimble_parsec ]; 490 - }; 606 + libgraph = buildMix rec { 607 + name = "libgraph"; 608 + version = "0.16.0"; 491 609 492 - makeup_json = buildMix rec { 493 - name = "makeup_json"; 494 - version = "0.1.1"; 610 + src = fetchHex { 611 + pkg = "libgraph"; 612 + version = "${version}"; 613 + sha256 = "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"; 614 + }; 495 615 496 - src = fetchHex { 497 - pkg = "makeup_json"; 498 - version = "${version}"; 499 - sha256 = "3879d78117e37a9b1e567b9cc76c1b5b51b9efc5f4f4301ea5e53fb70c59c718"; 616 + beamDeps = [ ]; 500 617 }; 501 618 502 - beamDeps = [ makeup nimble_parsec ]; 503 - }; 619 + makeup = buildMix rec { 620 + name = "makeup"; 621 + version = "1.1.2"; 504 622 505 - metrics = buildRebar3 rec { 506 - name = "metrics"; 507 - version = "1.0.1"; 623 + src = fetchHex { 624 + pkg = "makeup"; 625 + version = "${version}"; 626 + sha256 = "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"; 627 + }; 508 628 509 - src = fetchHex { 510 - pkg = "metrics"; 511 - version = "${version}"; 512 - sha256 = "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"; 629 + beamDeps = [ nimble_parsec ]; 513 630 }; 514 631 515 - beamDeps = []; 516 - }; 632 + makeup_json = buildMix rec { 633 + name = "makeup_json"; 634 + version = "0.1.1"; 517 635 518 - mime = buildMix rec { 519 - name = "mime"; 520 - version = "2.0.5"; 636 + src = fetchHex { 637 + pkg = "makeup_json"; 638 + version = "${version}"; 639 + sha256 = "3879d78117e37a9b1e567b9cc76c1b5b51b9efc5f4f4301ea5e53fb70c59c718"; 640 + }; 521 641 522 - src = fetchHex { 523 - pkg = "mime"; 524 - version = "${version}"; 525 - sha256 = "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"; 642 + beamDeps = [ 643 + makeup 644 + nimble_parsec 645 + ]; 526 646 }; 527 647 528 - beamDeps = []; 529 - }; 648 + metrics = buildRebar3 rec { 649 + name = "metrics"; 650 + version = "1.0.1"; 530 651 531 - mimerl = buildRebar3 rec { 532 - name = "mimerl"; 533 - version = "1.3.0"; 652 + src = fetchHex { 653 + pkg = "metrics"; 654 + version = "${version}"; 655 + sha256 = "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"; 656 + }; 534 657 535 - src = fetchHex { 536 - pkg = "mimerl"; 537 - version = "${version}"; 538 - sha256 = "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"; 658 + beamDeps = [ ]; 539 659 }; 540 660 541 - beamDeps = []; 542 - }; 661 + mime = buildMix rec { 662 + name = "mime"; 663 + version = "2.0.5"; 543 664 544 - mint = buildMix rec { 545 - name = "mint"; 546 - version = "1.6.0"; 665 + src = fetchHex { 666 + pkg = "mime"; 667 + version = "${version}"; 668 + sha256 = "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"; 669 + }; 547 670 548 - src = fetchHex { 549 - pkg = "mint"; 550 - version = "${version}"; 551 - sha256 = "3c5ae85d90a5aca0a49c0d8b67360bbe407f3b54f1030a111047ff988e8fefaa"; 671 + beamDeps = [ ]; 552 672 }; 553 673 554 - beamDeps = [ castore hpax ]; 555 - }; 674 + mimerl = buildRebar3 rec { 675 + name = "mimerl"; 676 + version = "1.3.0"; 556 677 557 - nimble_options = buildMix rec { 558 - name = "nimble_options"; 559 - version = "1.1.1"; 678 + src = fetchHex { 679 + pkg = "mimerl"; 680 + version = "${version}"; 681 + sha256 = "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"; 682 + }; 560 683 561 - src = fetchHex { 562 - pkg = "nimble_options"; 563 - version = "${version}"; 564 - sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; 684 + beamDeps = [ ]; 565 685 }; 566 686 567 - beamDeps = []; 568 - }; 687 + mint = buildMix rec { 688 + name = "mint"; 689 + version = "1.6.0"; 569 690 570 - nimble_ownership = buildMix rec { 571 - name = "nimble_ownership"; 572 - version = "0.3.1"; 691 + src = fetchHex { 692 + pkg = "mint"; 693 + version = "${version}"; 694 + sha256 = "3c5ae85d90a5aca0a49c0d8b67360bbe407f3b54f1030a111047ff988e8fefaa"; 695 + }; 573 696 574 - src = fetchHex { 575 - pkg = "nimble_ownership"; 576 - version = "${version}"; 577 - sha256 = "4bf510adedff0449a1d6e200e43e57a814794c8b5b6439071274d248d272a549"; 697 + beamDeps = [ 698 + castore 699 + hpax 700 + ]; 578 701 }; 579 702 580 - beamDeps = []; 581 - }; 703 + nimble_options = buildMix rec { 704 + name = "nimble_options"; 705 + version = "1.1.1"; 582 706 583 - nimble_parsec = buildMix rec { 584 - name = "nimble_parsec"; 585 - version = "1.4.0"; 707 + src = fetchHex { 708 + pkg = "nimble_options"; 709 + version = "${version}"; 710 + sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; 711 + }; 586 712 587 - src = fetchHex { 588 - pkg = "nimble_parsec"; 589 - version = "${version}"; 590 - sha256 = "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"; 713 + beamDeps = [ ]; 591 714 }; 592 715 593 - beamDeps = []; 594 - }; 716 + nimble_ownership = buildMix rec { 717 + name = "nimble_ownership"; 718 + version = "0.3.1"; 595 719 596 - nimble_pool = buildMix rec { 597 - name = "nimble_pool"; 598 - version = "1.1.0"; 720 + src = fetchHex { 721 + pkg = "nimble_ownership"; 722 + version = "${version}"; 723 + sha256 = "4bf510adedff0449a1d6e200e43e57a814794c8b5b6439071274d248d272a549"; 724 + }; 725 + 726 + beamDeps = [ ]; 727 + }; 728 + 729 + nimble_parsec = buildMix rec { 730 + name = "nimble_parsec"; 731 + version = "1.4.0"; 732 + 733 + src = fetchHex { 734 + pkg = "nimble_parsec"; 735 + version = "${version}"; 736 + sha256 = "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"; 737 + }; 599 738 600 - src = fetchHex { 601 - pkg = "nimble_pool"; 602 - version = "${version}"; 603 - sha256 = "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"; 739 + beamDeps = [ ]; 604 740 }; 605 741 606 - beamDeps = []; 607 - }; 742 + nimble_pool = buildMix rec { 743 + name = "nimble_pool"; 744 + version = "1.1.0"; 608 745 609 - open_api_spex = buildMix rec { 610 - name = "open_api_spex"; 611 - version = "3.19.1"; 746 + src = fetchHex { 747 + pkg = "nimble_pool"; 748 + version = "${version}"; 749 + sha256 = "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"; 750 + }; 612 751 613 - src = fetchHex { 614 - pkg = "open_api_spex"; 615 - version = "${version}"; 616 - sha256 = "392895827ce2984a3459c91a484e70708132d8c2c6c5363972b4b91d6bbac3dd"; 752 + beamDeps = [ ]; 617 753 }; 618 754 619 - beamDeps = [ jason plug ]; 620 - }; 755 + open_api_spex = buildMix rec { 756 + name = "open_api_spex"; 757 + version = "3.19.1"; 621 758 622 - parse_trans = buildRebar3 rec { 623 - name = "parse_trans"; 624 - version = "3.4.1"; 759 + src = fetchHex { 760 + pkg = "open_api_spex"; 761 + version = "${version}"; 762 + sha256 = "392895827ce2984a3459c91a484e70708132d8c2c6c5363972b4b91d6bbac3dd"; 763 + }; 625 764 626 - src = fetchHex { 627 - pkg = "parse_trans"; 628 - version = "${version}"; 629 - sha256 = "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"; 765 + beamDeps = [ 766 + jason 767 + plug 768 + ]; 630 769 }; 631 770 632 - beamDeps = []; 633 - }; 771 + parse_trans = buildRebar3 rec { 772 + name = "parse_trans"; 773 + version = "3.4.1"; 634 774 635 - phoenix = buildMix rec { 636 - name = "phoenix"; 637 - version = "1.7.12"; 775 + src = fetchHex { 776 + pkg = "parse_trans"; 777 + version = "${version}"; 778 + sha256 = "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"; 779 + }; 638 780 639 - src = fetchHex { 640 - pkg = "phoenix"; 641 - version = "${version}"; 642 - sha256 = "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"; 781 + beamDeps = [ ]; 643 782 }; 644 783 645 - beamDeps = [ castore jason phoenix_pubsub phoenix_template phoenix_view plug plug_crypto telemetry websock_adapter ]; 646 - }; 784 + phoenix = buildMix rec { 785 + name = "phoenix"; 786 + version = "1.7.12"; 647 787 648 - phoenix_ecto = buildMix rec { 649 - name = "phoenix_ecto"; 650 - version = "4.6.1"; 788 + src = fetchHex { 789 + pkg = "phoenix"; 790 + version = "${version}"; 791 + sha256 = "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"; 792 + }; 651 793 652 - src = fetchHex { 653 - pkg = "phoenix_ecto"; 654 - version = "${version}"; 655 - sha256 = "0ae544ff99f3c482b0807c5cec2c8289e810ecacabc04959d82c3337f4703391"; 794 + beamDeps = [ 795 + castore 796 + jason 797 + phoenix_pubsub 798 + phoenix_template 799 + phoenix_view 800 + plug 801 + plug_crypto 802 + telemetry 803 + websock_adapter 804 + ]; 656 805 }; 657 806 658 - beamDeps = [ ecto phoenix_html plug postgrex ]; 659 - }; 807 + phoenix_ecto = buildMix rec { 808 + name = "phoenix_ecto"; 809 + version = "4.6.1"; 660 810 661 - phoenix_html = buildMix rec { 662 - name = "phoenix_html"; 663 - version = "4.1.1"; 811 + src = fetchHex { 812 + pkg = "phoenix_ecto"; 813 + version = "${version}"; 814 + sha256 = "0ae544ff99f3c482b0807c5cec2c8289e810ecacabc04959d82c3337f4703391"; 815 + }; 664 816 665 - src = fetchHex { 666 - pkg = "phoenix_html"; 667 - version = "${version}"; 668 - sha256 = "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"; 817 + beamDeps = [ 818 + ecto 819 + phoenix_html 820 + plug 821 + postgrex 822 + ]; 669 823 }; 670 824 671 - beamDeps = []; 672 - }; 825 + phoenix_html = buildMix rec { 826 + name = "phoenix_html"; 827 + version = "4.1.1"; 673 828 674 - phoenix_html_helpers = buildMix rec { 675 - name = "phoenix_html_helpers"; 676 - version = "1.0.1"; 829 + src = fetchHex { 830 + pkg = "phoenix_html"; 831 + version = "${version}"; 832 + sha256 = "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"; 833 + }; 677 834 678 - src = fetchHex { 679 - pkg = "phoenix_html_helpers"; 680 - version = "${version}"; 681 - sha256 = "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"; 835 + beamDeps = [ ]; 682 836 }; 683 837 684 - beamDeps = [ phoenix_html plug ]; 685 - }; 838 + phoenix_html_helpers = buildMix rec { 839 + name = "phoenix_html_helpers"; 840 + version = "1.0.1"; 686 841 687 - phoenix_live_dashboard = buildMix rec { 688 - name = "phoenix_live_dashboard"; 689 - version = "0.8.3"; 842 + src = fetchHex { 843 + pkg = "phoenix_html_helpers"; 844 + version = "${version}"; 845 + sha256 = "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"; 846 + }; 690 847 691 - src = fetchHex { 692 - pkg = "phoenix_live_dashboard"; 693 - version = "${version}"; 694 - sha256 = "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"; 848 + beamDeps = [ 849 + phoenix_html 850 + plug 851 + ]; 695 852 }; 696 853 697 - beamDeps = [ ecto mime phoenix_live_view telemetry_metrics ]; 698 - }; 854 + phoenix_live_dashboard = buildMix rec { 855 + name = "phoenix_live_dashboard"; 856 + version = "0.8.3"; 699 857 700 - phoenix_live_reload = buildMix rec { 701 - name = "phoenix_live_reload"; 702 - version = "1.5.3"; 858 + src = fetchHex { 859 + pkg = "phoenix_live_dashboard"; 860 + version = "${version}"; 861 + sha256 = "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"; 862 + }; 703 863 704 - src = fetchHex { 705 - pkg = "phoenix_live_reload"; 706 - version = "${version}"; 707 - sha256 = "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"; 864 + beamDeps = [ 865 + ecto 866 + mime 867 + phoenix_live_view 868 + telemetry_metrics 869 + ]; 708 870 }; 709 871 710 - beamDeps = [ file_system phoenix ]; 711 - }; 872 + phoenix_live_reload = buildMix rec { 873 + name = "phoenix_live_reload"; 874 + version = "1.5.3"; 712 875 713 - phoenix_live_view = buildMix rec { 714 - name = "phoenix_live_view"; 715 - version = "0.20.14"; 876 + src = fetchHex { 877 + pkg = "phoenix_live_reload"; 878 + version = "${version}"; 879 + sha256 = "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"; 880 + }; 716 881 717 - src = fetchHex { 718 - pkg = "phoenix_live_view"; 719 - version = "${version}"; 720 - sha256 = "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"; 882 + beamDeps = [ 883 + file_system 884 + phoenix 885 + ]; 721 886 }; 722 887 723 - beamDeps = [ floki jason phoenix phoenix_html phoenix_template phoenix_view plug telemetry ]; 724 - }; 888 + phoenix_live_view = buildMix rec { 889 + name = "phoenix_live_view"; 890 + version = "0.20.14"; 725 891 726 - phoenix_pubsub = buildMix rec { 727 - name = "phoenix_pubsub"; 728 - version = "2.1.3"; 892 + src = fetchHex { 893 + pkg = "phoenix_live_view"; 894 + version = "${version}"; 895 + sha256 = "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"; 896 + }; 729 897 730 - src = fetchHex { 731 - pkg = "phoenix_pubsub"; 732 - version = "${version}"; 733 - sha256 = "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"; 898 + beamDeps = [ 899 + floki 900 + jason 901 + phoenix 902 + phoenix_html 903 + phoenix_template 904 + phoenix_view 905 + plug 906 + telemetry 907 + ]; 734 908 }; 735 909 736 - beamDeps = []; 737 - }; 910 + phoenix_pubsub = buildMix rec { 911 + name = "phoenix_pubsub"; 912 + version = "2.1.3"; 738 913 739 - phoenix_template = buildMix rec { 740 - name = "phoenix_template"; 741 - version = "1.0.4"; 914 + src = fetchHex { 915 + pkg = "phoenix_pubsub"; 916 + version = "${version}"; 917 + sha256 = "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"; 918 + }; 742 919 743 - src = fetchHex { 744 - pkg = "phoenix_template"; 745 - version = "${version}"; 746 - sha256 = "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"; 920 + beamDeps = [ ]; 747 921 }; 748 922 749 - beamDeps = [ phoenix_html ]; 750 - }; 923 + phoenix_template = buildMix rec { 924 + name = "phoenix_template"; 925 + version = "1.0.4"; 751 926 752 - phoenix_view = buildMix rec { 753 - name = "phoenix_view"; 754 - version = "2.0.3"; 927 + src = fetchHex { 928 + pkg = "phoenix_template"; 929 + version = "${version}"; 930 + sha256 = "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"; 931 + }; 755 932 756 - src = fetchHex { 757 - pkg = "phoenix_view"; 758 - version = "${version}"; 759 - sha256 = "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64"; 933 + beamDeps = [ phoenix_html ]; 760 934 }; 761 935 762 - beamDeps = [ phoenix_html phoenix_template ]; 763 - }; 936 + phoenix_view = buildMix rec { 937 + name = "phoenix_view"; 938 + version = "2.0.3"; 764 939 765 - plug = buildMix rec { 766 - name = "plug"; 767 - version = "1.16.0"; 940 + src = fetchHex { 941 + pkg = "phoenix_view"; 942 + version = "${version}"; 943 + sha256 = "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64"; 944 + }; 768 945 769 - src = fetchHex { 770 - pkg = "plug"; 771 - version = "${version}"; 772 - sha256 = "cbf53aa1f5c4d758a7559c0bd6d59e286c2be0c6a1fac8cc3eee2f638243b93e"; 946 + beamDeps = [ 947 + phoenix_html 948 + phoenix_template 949 + ]; 773 950 }; 774 951 775 - beamDeps = [ mime plug_crypto telemetry ]; 776 - }; 952 + plug = buildMix rec { 953 + name = "plug"; 954 + version = "1.16.0"; 777 955 778 - plug_crypto = buildMix rec { 779 - name = "plug_crypto"; 780 - version = "2.1.0"; 956 + src = fetchHex { 957 + pkg = "plug"; 958 + version = "${version}"; 959 + sha256 = "cbf53aa1f5c4d758a7559c0bd6d59e286c2be0c6a1fac8cc3eee2f638243b93e"; 960 + }; 781 961 782 - src = fetchHex { 783 - pkg = "plug_crypto"; 784 - version = "${version}"; 785 - sha256 = "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"; 962 + beamDeps = [ 963 + mime 964 + plug_crypto 965 + telemetry 966 + ]; 786 967 }; 787 968 788 - beamDeps = []; 789 - }; 969 + plug_crypto = buildMix rec { 970 + name = "plug_crypto"; 971 + version = "2.1.0"; 790 972 791 - postgrex = buildMix rec { 792 - name = "postgrex"; 793 - version = "0.18.0"; 973 + src = fetchHex { 974 + pkg = "plug_crypto"; 975 + version = "${version}"; 976 + sha256 = "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"; 977 + }; 794 978 795 - src = fetchHex { 796 - pkg = "postgrex"; 797 - version = "${version}"; 798 - sha256 = "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"; 979 + beamDeps = [ ]; 799 980 }; 800 981 801 - beamDeps = [ db_connection decimal jason ]; 802 - }; 982 + postgrex = buildMix rec { 983 + name = "postgrex"; 984 + version = "0.18.0"; 803 985 804 - reactor = buildMix rec { 805 - name = "reactor"; 806 - version = "0.8.4"; 986 + src = fetchHex { 987 + pkg = "postgrex"; 988 + version = "${version}"; 989 + sha256 = "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"; 990 + }; 807 991 808 - src = fetchHex { 809 - pkg = "reactor"; 810 - version = "${version}"; 811 - sha256 = "49c1fd3c786603cec8140ce941c41c7ea72cc4411860ccdee9876c4ca2204f81"; 992 + beamDeps = [ 993 + db_connection 994 + decimal 995 + jason 996 + ]; 812 997 }; 813 998 814 - beamDeps = [ libgraph spark splode telemetry ]; 815 - }; 999 + reactor = buildMix rec { 1000 + name = "reactor"; 1001 + version = "0.8.4"; 816 1002 817 - redoc_ui_plug = buildMix rec { 818 - name = "redoc_ui_plug"; 819 - version = "0.2.1"; 1003 + src = fetchHex { 1004 + pkg = "reactor"; 1005 + version = "${version}"; 1006 + sha256 = "49c1fd3c786603cec8140ce941c41c7ea72cc4411860ccdee9876c4ca2204f81"; 1007 + }; 820 1008 821 - src = fetchHex { 822 - pkg = "redoc_ui_plug"; 823 - version = "${version}"; 824 - sha256 = "7be01db31f210887e9fc18f8fbccc7788de32c482b204623556e415ed1fe714b"; 1009 + beamDeps = [ 1010 + libgraph 1011 + spark 1012 + splode 1013 + telemetry 1014 + ]; 825 1015 }; 826 1016 827 - beamDeps = [ jason plug ]; 828 - }; 1017 + redoc_ui_plug = buildMix rec { 1018 + name = "redoc_ui_plug"; 1019 + version = "0.2.1"; 829 1020 830 - sentry = buildMix rec { 831 - name = "sentry"; 832 - version = "10.6.0"; 1021 + src = fetchHex { 1022 + pkg = "redoc_ui_plug"; 1023 + version = "${version}"; 1024 + sha256 = "7be01db31f210887e9fc18f8fbccc7788de32c482b204623556e415ed1fe714b"; 1025 + }; 833 1026 834 - src = fetchHex { 835 - pkg = "sentry"; 836 - version = "${version}"; 837 - sha256 = "31404d43d9235219c5a020236a8ee56de3bef3a87e2c6399795c564157b831af"; 1027 + beamDeps = [ 1028 + jason 1029 + plug 1030 + ]; 838 1031 }; 839 1032 840 - beamDeps = [ hackney jason nimble_options nimble_ownership phoenix phoenix_live_view plug telemetry ]; 841 - }; 1033 + sentry = buildMix rec { 1034 + name = "sentry"; 1035 + version = "10.6.0"; 842 1036 843 - slugify = buildMix rec { 844 - name = "slugify"; 845 - version = "1.3.1"; 1037 + src = fetchHex { 1038 + pkg = "sentry"; 1039 + version = "${version}"; 1040 + sha256 = "31404d43d9235219c5a020236a8ee56de3bef3a87e2c6399795c564157b831af"; 1041 + }; 846 1042 847 - src = fetchHex { 848 - pkg = "slugify"; 849 - version = "${version}"; 850 - sha256 = "cb090bbeb056b312da3125e681d98933a360a70d327820e4b7f91645c4d8be76"; 1043 + beamDeps = [ 1044 + hackney 1045 + jason 1046 + nimble_options 1047 + nimble_ownership 1048 + phoenix 1049 + phoenix_live_view 1050 + plug 1051 + telemetry 1052 + ]; 851 1053 }; 852 1054 853 - beamDeps = []; 854 - }; 1055 + slugify = buildMix rec { 1056 + name = "slugify"; 1057 + version = "1.3.1"; 855 1058 856 - sourceror = buildMix rec { 857 - name = "sourceror"; 858 - version = "1.2.1"; 1059 + src = fetchHex { 1060 + pkg = "slugify"; 1061 + version = "${version}"; 1062 + sha256 = "cb090bbeb056b312da3125e681d98933a360a70d327820e4b7f91645c4d8be76"; 1063 + }; 859 1064 860 - src = fetchHex { 861 - pkg = "sourceror"; 862 - version = "${version}"; 863 - sha256 = "e4d97087e67584a7585b5fe3d5a71bf8e7332f795dd1a44983d750003d5e750c"; 1065 + beamDeps = [ ]; 864 1066 }; 865 1067 866 - beamDeps = []; 867 - }; 1068 + sourceror = buildMix rec { 1069 + name = "sourceror"; 1070 + version = "1.2.1"; 868 1071 869 - spark = buildMix rec { 870 - name = "spark"; 871 - version = "2.1.22"; 1072 + src = fetchHex { 1073 + pkg = "sourceror"; 1074 + version = "${version}"; 1075 + sha256 = "e4d97087e67584a7585b5fe3d5a71bf8e7332f795dd1a44983d750003d5e750c"; 1076 + }; 872 1077 873 - src = fetchHex { 874 - pkg = "spark"; 875 - version = "${version}"; 876 - sha256 = "f764611d0b15ac132e72b2326539acc11fc4e63baa3e429f541bca292b5f7064"; 1078 + beamDeps = [ ]; 877 1079 }; 878 1080 879 - beamDeps = [ jason sourceror ]; 880 - }; 1081 + spark = buildMix rec { 1082 + name = "spark"; 1083 + version = "2.1.22"; 881 1084 882 - splode = buildMix rec { 883 - name = "splode"; 884 - version = "0.2.4"; 1085 + src = fetchHex { 1086 + pkg = "spark"; 1087 + version = "${version}"; 1088 + sha256 = "f764611d0b15ac132e72b2326539acc11fc4e63baa3e429f541bca292b5f7064"; 1089 + }; 885 1090 886 - src = fetchHex { 887 - pkg = "splode"; 888 - version = "${version}"; 889 - sha256 = "ca3b95f0d8d4b482b5357954fec857abd0fa3ea509d623334c1328e7382044c2"; 1091 + beamDeps = [ 1092 + jason 1093 + sourceror 1094 + ]; 890 1095 }; 891 1096 892 - beamDeps = []; 893 - }; 1097 + splode = buildMix rec { 1098 + name = "splode"; 1099 + version = "0.2.4"; 894 1100 895 - ssl_verify_fun = buildRebar3 rec { 896 - name = "ssl_verify_fun"; 897 - version = "1.1.7"; 1101 + src = fetchHex { 1102 + pkg = "splode"; 1103 + version = "${version}"; 1104 + sha256 = "ca3b95f0d8d4b482b5357954fec857abd0fa3ea509d623334c1328e7382044c2"; 1105 + }; 898 1106 899 - src = fetchHex { 900 - pkg = "ssl_verify_fun"; 901 - version = "${version}"; 902 - sha256 = "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"; 1107 + beamDeps = [ ]; 903 1108 }; 904 1109 905 - beamDeps = []; 906 - }; 1110 + ssl_verify_fun = buildRebar3 rec { 1111 + name = "ssl_verify_fun"; 1112 + version = "1.1.7"; 907 1113 908 - stream_data = buildMix rec { 909 - name = "stream_data"; 910 - version = "1.1.0"; 1114 + src = fetchHex { 1115 + pkg = "ssl_verify_fun"; 1116 + version = "${version}"; 1117 + sha256 = "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"; 1118 + }; 911 1119 912 - src = fetchHex { 913 - pkg = "stream_data"; 914 - version = "${version}"; 915 - sha256 = "cccc411d5facf1bab86e7c671382d164f05f8992574c95349d3c8b317e14d953"; 1120 + beamDeps = [ ]; 916 1121 }; 917 1122 918 - beamDeps = []; 919 - }; 1123 + stream_data = buildMix rec { 1124 + name = "stream_data"; 1125 + version = "1.1.0"; 920 1126 921 - swoosh = buildMix rec { 922 - name = "swoosh"; 923 - version = "1.16.8"; 1127 + src = fetchHex { 1128 + pkg = "stream_data"; 1129 + version = "${version}"; 1130 + sha256 = "cccc411d5facf1bab86e7c671382d164f05f8992574c95349d3c8b317e14d953"; 1131 + }; 924 1132 925 - src = fetchHex { 926 - pkg = "swoosh"; 927 - version = "${version}"; 928 - sha256 = "33de50fa414c07ed55fcb28e60e72a44496e14f8753e46cbf80e7b15d1adaae2"; 1133 + beamDeps = [ ]; 929 1134 }; 930 1135 931 - beamDeps = [ bandit finch hackney jason mime plug telemetry ]; 932 - }; 1136 + swoosh = buildMix rec { 1137 + name = "swoosh"; 1138 + version = "1.16.8"; 933 1139 934 - systemd = buildRebar3 rec { 935 - name = "systemd"; 936 - version = "0.6.2"; 1140 + src = fetchHex { 1141 + pkg = "swoosh"; 1142 + version = "${version}"; 1143 + sha256 = "33de50fa414c07ed55fcb28e60e72a44496e14f8753e46cbf80e7b15d1adaae2"; 1144 + }; 937 1145 938 - src = fetchHex { 939 - pkg = "systemd"; 940 - version = "${version}"; 941 - sha256 = "5062b911800c1ab05157c7bf9a9fbe23dd24c58891c87fd12d2e3ed8fc1708b8"; 1146 + beamDeps = [ 1147 + bandit 1148 + finch 1149 + hackney 1150 + jason 1151 + mime 1152 + plug 1153 + telemetry 1154 + ]; 942 1155 }; 943 1156 944 - beamDeps = [ enough ]; 945 - }; 1157 + systemd = buildRebar3 rec { 1158 + name = "systemd"; 1159 + version = "0.6.2"; 946 1160 947 - tailwind = buildMix rec { 948 - name = "tailwind"; 949 - version = "0.2.2"; 1161 + src = fetchHex { 1162 + pkg = "systemd"; 1163 + version = "${version}"; 1164 + sha256 = "5062b911800c1ab05157c7bf9a9fbe23dd24c58891c87fd12d2e3ed8fc1708b8"; 1165 + }; 950 1166 951 - src = fetchHex { 952 - pkg = "tailwind"; 953 - version = "${version}"; 954 - sha256 = "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"; 1167 + beamDeps = [ enough ]; 955 1168 }; 956 1169 957 - beamDeps = [ castore ]; 958 - }; 1170 + tailwind = buildMix rec { 1171 + name = "tailwind"; 1172 + version = "0.2.2"; 959 1173 960 - telemetry = buildRebar3 rec { 961 - name = "telemetry"; 962 - version = "1.2.1"; 1174 + src = fetchHex { 1175 + pkg = "tailwind"; 1176 + version = "${version}"; 1177 + sha256 = "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"; 1178 + }; 963 1179 964 - src = fetchHex { 965 - pkg = "telemetry"; 966 - version = "${version}"; 967 - sha256 = "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"; 1180 + beamDeps = [ castore ]; 968 1181 }; 969 1182 970 - beamDeps = []; 971 - }; 1183 + telemetry = buildRebar3 rec { 1184 + name = "telemetry"; 1185 + version = "1.2.1"; 972 1186 973 - telemetry_metrics = buildMix rec { 974 - name = "telemetry_metrics"; 975 - version = "1.0.0"; 1187 + src = fetchHex { 1188 + pkg = "telemetry"; 1189 + version = "${version}"; 1190 + sha256 = "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"; 1191 + }; 976 1192 977 - src = fetchHex { 978 - pkg = "telemetry_metrics"; 979 - version = "${version}"; 980 - sha256 = "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"; 1193 + beamDeps = [ ]; 981 1194 }; 982 1195 983 - beamDeps = [ telemetry ]; 984 - }; 1196 + telemetry_metrics = buildMix rec { 1197 + name = "telemetry_metrics"; 1198 + version = "1.0.0"; 985 1199 986 - telemetry_poller = buildRebar3 rec { 987 - name = "telemetry_poller"; 988 - version = "1.1.0"; 1200 + src = fetchHex { 1201 + pkg = "telemetry_metrics"; 1202 + version = "${version}"; 1203 + sha256 = "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"; 1204 + }; 989 1205 990 - src = fetchHex { 991 - pkg = "telemetry_poller"; 992 - version = "${version}"; 993 - sha256 = "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"; 1206 + beamDeps = [ telemetry ]; 994 1207 }; 995 1208 996 - beamDeps = [ telemetry ]; 997 - }; 1209 + telemetry_poller = buildRebar3 rec { 1210 + name = "telemetry_poller"; 1211 + version = "1.1.0"; 998 1212 999 - thousand_island = buildMix rec { 1000 - name = "thousand_island"; 1001 - version = "1.3.5"; 1213 + src = fetchHex { 1214 + pkg = "telemetry_poller"; 1215 + version = "${version}"; 1216 + sha256 = "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"; 1217 + }; 1002 1218 1003 - src = fetchHex { 1004 - pkg = "thousand_island"; 1005 - version = "${version}"; 1006 - sha256 = "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"; 1219 + beamDeps = [ telemetry ]; 1007 1220 }; 1008 1221 1009 - beamDeps = [ telemetry ]; 1010 - }; 1222 + thousand_island = buildMix rec { 1223 + name = "thousand_island"; 1224 + version = "1.3.5"; 1011 1225 1012 - typable = buildMix rec { 1013 - name = "typable"; 1014 - version = "0.3.0"; 1226 + src = fetchHex { 1227 + pkg = "thousand_island"; 1228 + version = "${version}"; 1229 + sha256 = "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"; 1230 + }; 1015 1231 1016 - src = fetchHex { 1017 - pkg = "typable"; 1018 - version = "${version}"; 1019 - sha256 = "880a0797752da1a4c508ac48f94711e04c86156f498065a83d160eef945858f8"; 1232 + beamDeps = [ telemetry ]; 1020 1233 }; 1021 1234 1022 - beamDeps = []; 1023 - }; 1235 + typable = buildMix rec { 1236 + name = "typable"; 1237 + version = "0.3.0"; 1024 1238 1025 - unicode_util_compat = buildRebar3 rec { 1026 - name = "unicode_util_compat"; 1027 - version = "0.7.0"; 1239 + src = fetchHex { 1240 + pkg = "typable"; 1241 + version = "${version}"; 1242 + sha256 = "880a0797752da1a4c508ac48f94711e04c86156f498065a83d160eef945858f8"; 1243 + }; 1028 1244 1029 - src = fetchHex { 1030 - pkg = "unicode_util_compat"; 1031 - version = "${version}"; 1032 - sha256 = "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"; 1245 + beamDeps = [ ]; 1033 1246 }; 1034 1247 1035 - beamDeps = []; 1036 - }; 1248 + unicode_util_compat = buildRebar3 rec { 1249 + name = "unicode_util_compat"; 1250 + version = "0.7.0"; 1037 1251 1038 - websock = buildMix rec { 1039 - name = "websock"; 1040 - version = "0.5.3"; 1252 + src = fetchHex { 1253 + pkg = "unicode_util_compat"; 1254 + version = "${version}"; 1255 + sha256 = "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"; 1256 + }; 1041 1257 1042 - src = fetchHex { 1043 - pkg = "websock"; 1044 - version = "${version}"; 1045 - sha256 = "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"; 1258 + beamDeps = [ ]; 1046 1259 }; 1047 1260 1048 - beamDeps = []; 1049 - }; 1261 + websock = buildMix rec { 1262 + name = "websock"; 1263 + version = "0.5.3"; 1050 1264 1051 - websock_adapter = buildMix rec { 1052 - name = "websock_adapter"; 1053 - version = "0.5.6"; 1265 + src = fetchHex { 1266 + pkg = "websock"; 1267 + version = "${version}"; 1268 + sha256 = "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"; 1269 + }; 1054 1270 1055 - src = fetchHex { 1056 - pkg = "websock_adapter"; 1057 - version = "${version}"; 1058 - sha256 = "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"; 1271 + beamDeps = [ ]; 1059 1272 }; 1060 1273 1061 - beamDeps = [ bandit plug websock ]; 1062 - }; 1274 + websock_adapter = buildMix rec { 1275 + name = "websock_adapter"; 1276 + version = "0.5.6"; 1063 1277 1064 - xema = buildMix rec { 1065 - name = "xema"; 1066 - version = "0.17.2"; 1278 + src = fetchHex { 1279 + pkg = "websock_adapter"; 1280 + version = "${version}"; 1281 + sha256 = "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"; 1282 + }; 1067 1283 1068 - src = fetchHex { 1069 - pkg = "xema"; 1070 - version = "${version}"; 1071 - sha256 = "965a44cd0846dde36a981889d7a3788c3f932893b688ec941b0ce71c363fa1cf"; 1284 + beamDeps = [ 1285 + bandit 1286 + plug 1287 + websock 1288 + ]; 1072 1289 }; 1073 1290 1074 - beamDeps = [ conv_case decimal ]; 1075 - }; 1076 - }; 1077 - in self 1291 + xema = buildMix rec { 1292 + name = "xema"; 1293 + version = "0.17.2"; 1078 1294 1295 + src = fetchHex { 1296 + pkg = "xema"; 1297 + version = "${version}"; 1298 + sha256 = "965a44cd0846dde36a981889d7a3788c3f932893b688ec941b0ce71c363fa1cf"; 1299 + }; 1300 + 1301 + beamDeps = [ 1302 + conv_case 1303 + decimal 1304 + ]; 1305 + }; 1306 + }; 1307 + in 1308 + self
+39 -31
nix/nixos-server.nix
··· 6 6 }: 7 7 let 8 8 cfg = config.services.sower.server; 9 + jsonType = (pkgs.formats.json { }).type; 9 10 in 10 11 { 11 12 options = { ··· 17 18 default = pkgs.callPackage ./server-package.nix { }; 18 19 }; 19 20 20 - credentials = lib.mkOption { 21 - type = lib.types.listOf lib.types.str; 22 - description = "systemd credentials"; 23 - default = [ ]; 21 + secrets = lib.mkOption { 22 + type = lib.types.attrsOf lib.types.str; 23 + description = "systemd credentials wrapper"; 24 + example = { 25 + SOWER_DATABASE_PASS_FILE = "/path/to/pass/file"; 26 + }; 27 + default = { }; 28 + }; 29 + 30 + settings = lib.mkOption { 31 + type = lib.types.submodule { freeformType = jsonType; }; 32 + description = "sower server main configuration file"; 33 + default = { }; 24 34 }; 25 35 26 36 environment = lib.mkOption { 27 37 type = lib.types.attrsOf lib.types.str; 28 - description = "environment variables to pass to service. Do not set secrets here, but instead use systemd credentials"; 38 + description = "environment variables to pass to service. Do not set secrets here, but instead use `services.sower.server.secrets`"; 29 39 default = { }; 30 40 }; 31 41 ··· 33 43 type = lib.types.bool; 34 44 default = true; 35 45 description = '' 36 - Whether to initialise non‐existent secrets with random values. 46 + Whether to initialise non-existent secrets with random values. 37 47 ''; 38 48 }; 39 49 }; 40 50 }; 41 51 42 52 config = lib.mkIf cfg.enable { 53 + services.sower.server.secrets = lib.mkIf cfg.initSecrets { 54 + release_cookie_file = "/var/lib/sower/release-cookie"; 55 + secret_key_base_file = "/var/lib/sower/secret-key-base"; 56 + }; 57 + 43 58 systemd.services.sower = { 44 59 description = "Sower management platform"; 45 60 ··· 50 65 ]; 51 66 requires = [ "network-online.target" ]; 52 67 53 - serviceConfig = lib.mkMerge [ 54 - { 55 - Type = "notify"; 56 - WatchdogSec = "10s"; 57 - Restart = lib.mkDefault "on-failure"; 68 + serviceConfig = { 69 + Type = "notify"; 70 + WatchdogSec = "10s"; 71 + Restart = lib.mkDefault "on-failure"; 58 72 59 - DynamicUser = true; 60 - StateDirectory = "sower"; 61 - RuntimeDirectory = "sower"; 73 + DynamicUser = true; 74 + StateDirectory = "sower"; 75 + RuntimeDirectory = "sower"; 62 76 63 - ExecStart = pkgs.writeShellScript "sower-start" '' 64 - ${lib.optionalString cfg.initSecrets '' 65 - export RELEASE_COOKIE=$(cat $CREDENTIALS_DIRECTORY/RELEASE_COOKIE_FILE) 66 - ''} 77 + ExecStart = pkgs.writeShellScript "sower-start" '' 78 + ${lib.optionalString cfg.initSecrets '' 79 + export RELEASE_COOKIE=$(cat $CREDENTIALS_DIRECTORY/SOWER_RELEASE_COOKIE_FILE) 80 + ''} 67 81 68 - ${cfg.package}/bin/sower eval Sower.Release.migrate 69 - exec ${cfg.package}/bin/sower start 70 - ''; 71 - ExecStop = "${cfg.package}/bin/sower stop"; 82 + ${cfg.package}/bin/sower eval Sower.Release.migrate 83 + exec ${cfg.package}/bin/sower start 84 + ''; 85 + ExecStop = "${cfg.package}/bin/sower stop"; 72 86 73 - LoadCredential = cfg.credentials; 74 - } 75 - (lib.optionalAttrs cfg.initSecrets { 76 - LoadCredential = [ 77 - "RELEASE_COOKIE_FILE:%S/sower/release-cookie" 78 - "SECRET_KEY_BASE_FILE:%S/sower/secret-key-base" 79 - ]; 80 - }) 81 - ]; 87 + LoadCredential = lib.mapAttrsToList (k: v: "SOWER_${lib.toUpper k}:${v}") cfg.secrets; 88 + }; 82 89 83 90 environment = { 84 91 PHX_SERVER = "true"; 92 + SOWER_SERVER_CONFIG_FILE = pkgs.writeText "sower-server-config" (builtins.toJSON cfg.settings); 85 93 } // cfg.environment; 86 94 }; 87 95
+19 -11
nix/test-end-to-end.nix
··· 23 23 services.sower.client = { 24 24 enable = true; 25 25 package = client; 26 + 26 27 credentials = [ "SOWER_BOOTSTRAP_TOKEN_FILE:${pkgs.writeText "token" "aninsecuretoken"}" ]; 28 + 27 29 settings = { 28 30 url = "http://localhost:4000"; 29 31 mode = "dry-activate"; ··· 33 35 34 36 services.sower.server = { 35 37 enable = true; 36 - credentials = [ 37 - "SOWER_BOOTSTRAP_TOKEN_FILE:${pkgs.writeText "token" "aninsecuretoken"}" 38 - "SOWER_AUTH_OIDC_CLIENT_ID_FILE:${pkgs.writeText "oidc-id" "ok"}" 39 - "SOWER_AUTH_OIDC_CLIENT_SECRET_FILE:${pkgs.writeText "oidc-secret" "ok"}" 40 - ]; 41 - environment = { 42 - SOWER_DATABASE_SOCKET = "/run/postgresql/.s.PGSQL.5432"; 43 - SOWER_HOSTNAME = "localhost"; 44 - SOWER_PUBLIC_PORT = "4000"; 45 - SOWER_PUBLIC_SCHEME = "http"; 46 - SOWER_AUTH_OIDC_BASE_URL = "http://localhost:9000"; 38 + secrets = { 39 + bootstrap_token_file = "${pkgs.writeText "token" "aninsecuretken"}"; 40 + auth_oidc_client_id_file = "${pkgs.writeText "oidc-id" "ok"}"; 41 + auth_oidc_client_secret_file = "${pkgs.writeText "oidc-secret" "ok"}"; 42 + }; 43 + 44 + settings = { 45 + database = { 46 + socket = "/run/postgresql/.s.PGSQL.5432"; 47 + username = "sower"; 48 + database = "sower"; 49 + }; 50 + 51 + auth = { 52 + oidc_client_id = "sower"; 53 + oidc_base_url = "http://localhost:9000"; 54 + }; 47 55 }; 48 56 }; 49 57 systemd.services.sower.serviceConfig.Restart = "no";