Skip to content

Instantly share code, notes, and snippets.

@maikelthedev
Created January 24, 2025 19:27
Show Gist options
  • Save maikelthedev/21e834074228e6433563ecaf6df2bcd0 to your computer and use it in GitHub Desktop.
Save maikelthedev/21e834074228e6433563ecaf6df2bcd0 to your computer and use it in GitHub Desktop.
Now with extra colours and emojis 😮
# On Nixos running this from the project folder with nix-shell will create a shell with all the necessary dependencies
# and run postgresql in an ephemeral mode for development.
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
elixir_1_18
elixir-ls
erlang
rebar3
nodejs
yarn
fish
gnumake
postgresql
];
# Environment variables
MIX_ENV = "dev";
NIX_ENFORCE_PURITY = "0"; # Without this bcrypt does not compile
IEX_FILE = "${builtins.getEnv "PWD"}/.iex.exs";
PROJECT_DIR = "/tmp/indie";
PGPORT = "5432"; # Use quotes to ensure consistency in shell environments
shellHook = ''
# Environment variables that need interpolation
export PGDATA=$PROJECT_DIR/data
export PGLOCKDIR=$PROJECT_DIR/lock
export PGLOG=$PROJECT_DIR/postgress.log
alias quit="killall -s KILL postgres && exit"
# Color-coded functions for output
red() { echo -e "\e[31m🚨 $1\e[0m"; }
green() { echo -e "\e[32m✅ $1\e[0m"; }
yellow() { echo -e "\e[33m⚙️ $1\e[0m"; }
blue() { echo -e "\e[34m🔷 $1\e[0m"; }
# Step headers
step_header() {
echo -e "\e[35m\n======> $1\e[0m\n";
}
# Create the .iex.exs file if it doesn't exist
iexfile() {
step_header "Setting up .iex.exs file"
if [ ! -f "$IEX_FILE" ]; then
red "Creating .iex.exs with common aliases..."
cat <<EOF > "$IEX_FILE"
IEx.configure(auto_reload: true)
alias Indie.Repo
alias Indie.Accounts.{User, Address}
alias Indie.Commerce.Order
alias Indie.Domains.Domain
EOF
green ".iex.exs created successfully!"
else
green ".iex.exs already exists!"
fi
}
# Fetch dependencies
get_dependencies() {
step_header "Fetching Dependencies"
green "Checking dependencies..."
[ ! -d "deps" ] && yellow "Running mix deps.get" && mix deps.get || green "Dependencies are already fetched."
[ ! -d "_build" ] && yellow "Running mix deps.compile" && mix deps.compile || green "Dependencies are already compiled."
}
# Cleanup and setup directories
cleanup() {
step_header "Cleaning up and setting directories"
yellow "Resetting PostgreSQL data directories..."
rm -rf $PGDATA
mkdir -p $PGDATA
mkdir -p $PGLOCKDIR
chmod 700 $PGDATA
chmod 700 $PGLOCKDIR
green "Directories are ready!"
}
# Run PostgreSQL server
run_postgres() {
step_header "Starting PostgreSQL server"
yellow "Initializing PostgreSQL..."
pg_ctl initdb -o "-U postgres"
green "PostgreSQL initialized."
yellow "Starting PostgreSQL server..."
pg_ctl -D $PGDATA -l $PGLOG -o "-p $PGPORT -h localhost -k $PGLOCKDIR" start
green "PostgreSQL is running on port $PGPORT!"
}
# Populate the database
populate_db() {
step_header "Populating the database"
yellow "Resetting the database..."
mix ecto.reset
green "Database populated successfully!"
}
# Start the Phoenix development server
dev() {
step_header "Starting the Phoenix development server"
iex -S mix phx.server
}
# Main execution flow
iexfile
get_dependencies
cleanup
run_postgres
populate_db
# Clean up PostgreSQL process on shell exit
trap 'killall -s KILL postgres && red "PostgreSQL has been stopped 🥳!"' EXIT
'';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment