Skip to content

Commit

Permalink
deploy: First (somewhat) working deploy (#19)
Browse files Browse the repository at this point in the history
  • Loading branch information
mtrsk committed Sep 5, 2024
1 parent 8dbe32f commit 8fc2da9
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 50 deletions.
48 changes: 24 additions & 24 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

70 changes: 62 additions & 8 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,60 @@
packages = forAllSystems (system:
let
pkgs = nixpkgs.legacyPackages."${system}";
env = zig2nix.outputs.zig-env.${system} {};
system-triple = env.lib.zigTripleFromString system;
in {
erlangLatest = pkgs.erlang_27;
in rec {
devenv-up = self.devShells.${system}.default.config.procfileScript;

# Leverages nix to build the erlang backend release
# nix build .#server
server =
let
deps = import ./rebar-deps.nix { inherit (pkgs) fetchHex fetchFromGitHub fetchgit; };
in
pkgs.stdenv.mkDerivation {
name = "server";
version = "0.0.1";
src = pkgs.lib.cleanSource ./.;
buildInputs = with pkgs; [
erlangLatest
pkgs.stdenv.cc.cc.lib
rebar3
just
openssl
gnutar
];
nativeBuildInputs = with pkgs; [
autoPatchelfHook libz ncurses systemdLibs
];
buildPhase = ''
mkdir -p _checkouts
# https://github.com/NixOS/nix/issues/670#issuecomment-1211700127
export HOME=$(pwd)
${toString (pkgs.lib.mapAttrsToList (k: v: ''
cp -R --no-preserve=mode ${v} _checkouts/${k}
'') deps)}
just release-nix
'';
installPhase = ''
mkdir -p $out
tar -xzf _build/prod/rel/*/*.tar.gz -C $out/
'';
};

# TODO: Move the container build to nix, instead of docker
# nix build .#dockerImage
dockerImage = pkgs.dockerTools.buildLayeredImage {
name = "lyceum";
tag = "latest";
created = "now";
# This will copy the compiled erlang release to the image
contents = [ server pkgs.coreutils pkgs.gawk pkgs.gnugrep ];
config = {
Cmd = [ "${server}/bin/server" "foreground" ];
ExposedPorts = {"8080/tcp" = {};};
};
};

# docs = pkgs.stdenv.mkDerivation {
# name = "docs";
# src = ./.;
Expand All @@ -69,7 +119,7 @@
pkgs = nixpkgs.legacyPackages.${system};

# Erlang shit
erlangLatest = pkgs.erlang_26;
erlangLatest = pkgs.erlang_27;
erlangLibs = getErlangLibs erlangLatest;

# Zig shit
Expand All @@ -89,19 +139,17 @@

# nix run .#test
apps.test = env.app [] "zig build --search-prefix ${erlangLatest} --search-prefix ${raylib} test -- \"$@\"";
});
});

devShells = forAllSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};

# Erlang shit
erlangLatest = pkgs.erlang_26;
erlangLatest = pkgs.erlang_27;
erlangLibs = getErlangLibs erlangLatest;

# Zig shit
env = zig2nix.outputs.zig-env.${system} {};
system-triple = env.lib.zigTripleFromString system;
raylib = pkgs.raylib;
zigLatest = pkgs.zig;

Expand All @@ -128,6 +176,12 @@
buildInputs = with pkgs; [ erlangLatest just rebar3 zigLatest ];
};

# Deploy the erlang server
# `nix develop .#deploy`
deploy = pkgs.mkShell {
buildInputs = with pkgs; [ erlangLatest just rebar3 ];
};

# `nix develop`
default = devenv.lib.mkShell {
inherit inputs pkgs;
Expand Down
36 changes: 36 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ client-test:
build:
rebar3 compile
# Fetches rebar3 dependencies, updates both the rebar and nix lockfiles
deps:
rebar3 get-deps
rebar3 nix lock
server:
rebar3 shell
Expand All @@ -21,3 +26,34 @@ postgres:
format:
zig fmt $(find ./ -type f \( -iname \*.zig \))
# --------
# Releases
# --------
# Create a prod release of the server
release: deps
rebar3 as prod release
# Create a prod release (for nix) of the server
release-nix:
rebar3 as prod tar
# ----------
# Deployment
# ----------
# Builds the deployment docker image with Nix
build-docker:
nix build .#dockerImage
# Updates Heroku's registry with the new image
update-registry: build-docker
docker load < ./result
docker tag lyceum:latest registry.heroku.com/lyceum/web
docker push registry.heroku.com/lyceum/web
# Release app with the new docker image on Heroku
heroku-release: update-registry
heroku container:release -a=lyceum web
18 changes: 18 additions & 0 deletions rebar-deps.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by rebar3_nix
let fetchOnly = { src, ... }: src;
in { builder ? fetchOnly, fetchHex, fetchgit, fetchFromGitHub, overrides ? (x: y: { }) }:
let
self = packages // (overrides self packages);
packages = with self; {
epgsql = builder {
name = "epgsql";
version = "4.7.1";
src = fetchHex {
pkg = "epgsql";
version = "4.7.1";
sha256 = "sha256-tthrfcQshVWx1OIIgOUJnW1tBTFIAA4YjlSPmOTgGDY=";
};
beamDeps = [ ];
};
};
in self
18 changes: 18 additions & 0 deletions rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,21 @@
{setcookie, 'lyceum'},
{sname, 'lyceum_server'}
]}.

{relx, [{release, {server, "0.0.1"},
[server]},

{dev_mode, true},
{include_erts, false},

{extended_start_script, true}]}.

{profiles, [
{prod, [{relx, [{dev_mode, false},
{include_erts, true}]}
]}
]}.

{plugins, [
{ rebar3_nix, ".*", {git, "https://github.com/erlang-nix/rebar3_nix.git", {tag, "v0.1.1"}}}
]}.
20 changes: 20 additions & 0 deletions src/registry.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-module(registry).

-export([insert_user/2, check_user/2]).

check_user(#{username := Username, password := Password}, Connection) ->
Query =
"SELECT * FROM lyceum.user WHERE username = $1::VARCHAR(32) "
"AND password = $2::TEXT",
{ok, FullColumns, Values} = epgsql:equery(Connection, Query, [Username, Password]),
[UserData | _] = util:columns_and_rows(FullColumns, Values),
maps:get(e_mail, UserData).

insert_user(#{username := Username,
email := Email,
password := Password},
Connection) ->
Query =
"INSERT INTO lyceum.user (username, e-mail, password) VALUES "
"($1::VARCHAR(32), $2::TEXT, $3::TEXT)",
{ok, _, _} = epgsql:equery(Connection, Query, [Username, Email, Password]).
4 changes: 2 additions & 2 deletions src/server.app.src
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{application, server,
[{description, "An OTP application"},
[{description, "An OTP Lyceum Server"},
{vsn, "0.1.0"},
{registered, []},
{mod, {server, []}},
{applications,
[epgsql]},
[epgsql, kernel, stdlib, sasl]},
{env,[]},
{modules, []},

Expand Down
4 changes: 2 additions & 2 deletions src/server.erl
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,15 @@ handle_master(Connection) ->
receive
{Pid, {register, #{username := Username, email := Email, password := Password}}} ->
io:format("This user now exists: ~p", [Username]),
user:insert_user(#{username => Username,
registry:insert_user(#{username => Username,
password => Password,
email => Email},
Connection),
Response = "I registered " ++ Username,
Pid ! {self(), Response};
{Pid, {login, #{username := Username, password := Password}}} ->
io:format("This user logged: ~p\n", [Username]),
Email = user:check_user(#{username => Username,
Email = registry:check_user(#{username => Username,
password => Password},
Connection),
NewPid = spawn(?MODULE, handle_user, [#{ user_pid => Pid, connection => database_connect()}]),
Expand Down
13 changes: 0 additions & 13 deletions src/user.erl

This file was deleted.

2 changes: 1 addition & 1 deletion src/util.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ columns_and_rows(FullColumns, Rows) ->
Value = case Type of
varchar -> erlang:binary_to_list(RowValue);
text -> erlang:binary_to_list(RowValue);
Unknown -> RowValue
_ -> RowValue
end,
{ColumnName, Value}
end, Columns, erlang:tuple_to_list(Row))
Expand Down

0 comments on commit 8fc2da9

Please sign in to comment.