From 5b37407dcecdbb208f370fd067c149ec64f34dc5 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 26 Jan 2023 13:45:15 -0600 Subject: [PATCH] add node name --- .dockerignore | 39 +++++++++++++++ Dockerfile | 95 ++++++++++++++++++++++++++++++++++++ fly.toml | 42 ++++++++++++++++ rel/env.bat.eex | 8 +++ rel/env.sh.eex | 24 +++++++++ rel/overlays/bin/migrate | 3 ++ rel/overlays/bin/migrate.bat | 1 + rel/overlays/bin/server | 3 ++ rel/overlays/bin/server.bat | 2 + rel/remote.vm.args.eex | 8 +++ rel/vm.args.eex | 8 +++ 11 files changed, 233 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 fly.toml create mode 100644 rel/env.bat.eex create mode 100644 rel/env.sh.eex create mode 100755 rel/overlays/bin/migrate create mode 100755 rel/overlays/bin/migrate.bat create mode 100755 rel/overlays/bin/server create mode 100755 rel/overlays/bin/server.bat create mode 100644 rel/remote.vm.args.eex create mode 100644 rel/vm.args.eex diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c126478 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# flyctl launch added from .elixir_ls/.gitignore +.elixir_ls/**/* + +# flyctl launch added from .gitignore +# The directory Mix will write compiled artifacts to. +_build + +# If you run "mix test --cover", coverage assets end up here. +cover + +# The directory Mix downloads your dependencies sources to. +deps + +# Where 3rd-party dependencies like ExDoc output generated docs. +doc + +# Ignore .fetch files in case you like to edit your project deps locally. +.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +**/erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +**/*.ez + +# Ignore package tarball (built via "mix hex.build"). +**/aprs-*.tar + +# Ignore assets that are produced by build tools. +priv/static/assets + +# Ignore digested assets cache. +priv/static/cache_manifest.json + +# In case you use Node.js/npm, you want to ignore these. +**/npm-debug.log +assets/node_modules + +fly.toml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ba8a76b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,95 @@ +# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian +# instead of Alpine to avoid DNS resolution issues in production. +# +# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu +# https://hub.docker.com/_/ubuntu?tab=tags +# +# This file is based on these images: +# +# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image +# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20221004-slim - for the release image +# - https://pkgs.org/ - resource for finding needed packages +# - Ex: hexpm/elixir:1.14.2-erlang-25.2-debian-bullseye-20221004-slim +# +ARG ELIXIR_VERSION=1.14.2 +ARG OTP_VERSION=25.2 +ARG DEBIAN_VERSION=bullseye-20221004-slim + +ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" +ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" + +FROM ${BUILDER_IMAGE} as builder + +# install build dependencies +RUN apt-get update -y && apt-get install -y build-essential git \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# prepare build dir +WORKDIR /app + +# install hex + rebar +RUN mix local.hex --force && \ + mix local.rebar --force + +# set build ENV +ENV MIX_ENV="prod" + +# install mix dependencies +COPY mix.exs mix.lock ./ +RUN mix deps.get --only $MIX_ENV +RUN mkdir config + +# copy compile-time config files before we compile dependencies +# to ensure any relevant config change will trigger the dependencies +# to be re-compiled. +COPY config/config.exs config/${MIX_ENV}.exs config/ +RUN mix deps.compile + +COPY priv priv + +COPY lib lib + +COPY assets assets + +# compile assets +RUN mix assets.deploy + +# Compile the release +RUN mix compile + +# Changes to config/runtime.exs don't require recompiling the code +COPY config/runtime.exs config/ + +COPY rel rel +RUN mix release + +# start a new build stage so that the final image will only contain +# the compiled release and other runtime necessities +FROM ${RUNNER_IMAGE} + +RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# Set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen + +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +WORKDIR "/app" +RUN chown nobody /app + +# set runner ENV +ENV MIX_ENV="prod" + +# Only copy the final release from the build stage +COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/aprs ./ + +USER nobody + +CMD ["/app/bin/server"] + +# Appended by flyctl +ENV ECTO_IPV6 true +ENV ERL_AFLAGS "-proto_dist inet6_tcp" diff --git a/fly.toml b/fly.toml new file mode 100644 index 0000000..5512afe --- /dev/null +++ b/fly.toml @@ -0,0 +1,42 @@ +# fly.toml file generated for aprsme on 2023-01-26T13:39:35-06:00 + +app = "aprsme" +kill_signal = "SIGTERM" +kill_timeout = 5 +processes = [] + +[deploy] + release_command = "/app/bin/migrate" + +[env] + PHX_HOST = "aprsme.fly.dev" + PORT = "8080" + +[experimental] + auto_rollback = true + +[[services]] + http_checks = [] + internal_port = 8080 + processes = ["app"] + protocol = "tcp" + script_checks = [] + [services.concurrency] + hard_limit = 25 + soft_limit = 20 + type = "connections" + + [[services.ports]] + force_https = true + handlers = ["http"] + port = 80 + + [[services.ports]] + handlers = ["tls", "http"] + port = 443 + + [[services.tcp_checks]] + grace_period = "1s" + interval = "15s" + restart_limit = 0 + timeout = "2s" diff --git a/rel/env.bat.eex b/rel/env.bat.eex new file mode 100644 index 0000000..0d82afd --- /dev/null +++ b/rel/env.bat.eex @@ -0,0 +1,8 @@ +@echo off +rem Set the release to load code on demand (interactive) instead of preloading (embedded). +rem set RELEASE_MODE=interactive + +rem Set the release to work across nodes. +rem RELEASE_DISTRIBUTION must be "sname" (local), "name" (distributed) or "none". +rem set RELEASE_DISTRIBUTION=name +rem set RELEASE_NODE=<%= @release.name %> diff --git a/rel/env.sh.eex b/rel/env.sh.eex new file mode 100644 index 0000000..39bcbcc --- /dev/null +++ b/rel/env.sh.eex @@ -0,0 +1,24 @@ +#!/bin/sh + +# # Sets and enables heart (recommended only in daemon mode) +# case $RELEASE_COMMAND in +# daemon*) +# HEART_COMMAND="$RELEASE_ROOT/bin/$RELEASE_NAME $RELEASE_COMMAND" +# export HEART_COMMAND +# export ELIXIR_ERL_OPTIONS="-heart" +# ;; +# *) +# ;; +# esac + +# # Set the release to load code on demand (interactive) instead of preloading (embedded). +# export RELEASE_MODE=interactive + +# # Set the release to work across nodes. +# # RELEASE_DISTRIBUTION must be "sname" (local), "name" (distributed) or "none". +# export RELEASE_DISTRIBUTION=name +# export RELEASE_NODE=<%= @release.name %> + +ip=$(grep fly-local-6pn /etc/hosts | cut -f 1) +export RELEASE_DISTRIBUTION=name +export RELEASE_NODE=$FLY_APP_NAME@$ip diff --git a/rel/overlays/bin/migrate b/rel/overlays/bin/migrate new file mode 100755 index 0000000..edc8d01 --- /dev/null +++ b/rel/overlays/bin/migrate @@ -0,0 +1,3 @@ +#!/bin/sh +cd -P -- "$(dirname -- "$0")" +exec ./aprs eval Aprs.Release.migrate diff --git a/rel/overlays/bin/migrate.bat b/rel/overlays/bin/migrate.bat new file mode 100755 index 0000000..d891745 --- /dev/null +++ b/rel/overlays/bin/migrate.bat @@ -0,0 +1 @@ +call "%~dp0\aprs" eval Aprs.Release.migrate diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server new file mode 100755 index 0000000..55293ab --- /dev/null +++ b/rel/overlays/bin/server @@ -0,0 +1,3 @@ +#!/bin/sh +cd -P -- "$(dirname -- "$0")" +PHX_SERVER=true exec ./aprs start diff --git a/rel/overlays/bin/server.bat b/rel/overlays/bin/server.bat new file mode 100755 index 0000000..d5da4f2 --- /dev/null +++ b/rel/overlays/bin/server.bat @@ -0,0 +1,2 @@ +set PHX_SERVER=true +call "%~dp0\aprs" start diff --git a/rel/remote.vm.args.eex b/rel/remote.vm.args.eex new file mode 100644 index 0000000..983397a --- /dev/null +++ b/rel/remote.vm.args.eex @@ -0,0 +1,8 @@ +## Customize flags given to the VM: https://www.erlang.org/doc/man/erl.html +## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here + +## Increase number of concurrent ports/sockets +##+Q 65536 + +## Tweak GC to run more often +##-env ERL_FULLSWEEP_AFTER 10 diff --git a/rel/vm.args.eex b/rel/vm.args.eex new file mode 100644 index 0000000..983397a --- /dev/null +++ b/rel/vm.args.eex @@ -0,0 +1,8 @@ +## Customize flags given to the VM: https://www.erlang.org/doc/man/erl.html +## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here + +## Increase number of concurrent ports/sockets +##+Q 65536 + +## Tweak GC to run more often +##-env ERL_FULLSWEEP_AFTER 10