From fe55eefe36dd3b041279ae06abf1beb09df2a7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro?= Date: Mon, 13 May 2024 02:22:04 +0200 Subject: [PATCH] configure release --- .dockerignore | 40 +++++++ Dockerfile | 101 ++++++++++++++++++ apps/lol_analytics_web/.dockerignore | 45 ++++++++ apps/lol_analytics_web/Dockerfile | 96 +++++++++++++++++ .../lib/lol_analytics_web/release.ex | 28 +++++ apps/lol_analytics_web/mix.exs | 1 - .../rel/overlays/bin/migrate | 5 + .../rel/overlays/bin/migrate.bat | 1 + .../lol_analytics_web/rel/overlays/bin/server | 5 + .../rel/overlays/bin/server.bat | 2 + .../scrapper/lib/scrapper/match_classifier.ex | 2 - config/runtime.exs | 1 + rel/overlays/bin/migrate | 5 + rel/overlays/bin/migrate.bat | 1 + rel/overlays/bin/server | 5 + rel/overlays/bin/server.bat | 2 + 16 files changed, 337 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 apps/lol_analytics_web/.dockerignore create mode 100644 apps/lol_analytics_web/Dockerfile create mode 100644 apps/lol_analytics_web/lib/lol_analytics_web/release.ex create mode 100755 apps/lol_analytics_web/rel/overlays/bin/migrate create mode 100755 apps/lol_analytics_web/rel/overlays/bin/migrate.bat create mode 100755 apps/lol_analytics_web/rel/overlays/bin/server create mode 100755 apps/lol_analytics_web/rel/overlays/bin/server.bat 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 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..66af9a9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,40 @@ +# # This file excludes paths from the Docker build context. +# # +# # By default, Docker's build context includes all files (and folders) in the +# # current directory. Even if a file isn't copied into the container it is still sent to +# # the Docker daemon. +# # +# # There are multiple reasons to exclude files from the build context: +# # +# # 1. Prevent nested folders from being copied into the container (ex: exclude +# # /assets/node_modules when copying /assets) +# # 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) +# # 3. Avoid sending files containing sensitive information +# # +# # More information on using .dockerignore is available here: +# # https://docs.docker.com/engine/reference/builder/#dockerignore-file + +# .dockerignore + +# # Ignore git, but keep git HEAD and refs to access current commit hash if needed: +# # +# # $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat +# # d0b8727759e1e0e7aa3d41707d12376e373d5ecc +# .git +# !.git/HEAD +# !.git/refs + +# # Common development/test artifacts +# /cover/ +# /doc/ +# /test/ +# /tmp/ +# .elixir_ls + +# # Mix artifacts +# *.ez + +# # Generated on crash by the VM +# erl_crash.dump + +# # Static artifacts - These should be fetched and built inside the Docker image diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6a62079 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,101 @@ +# 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-20231009-slim - for the release image +# - https://pkgs.org/ - resource for finding needed packages +# - Ex: hexpm/elixir:1.16.0-erlang-26.2.1-debian-bullseye-20231009-slim +# +ARG ELIXIR_VERSION=1.16.0 +ARG OTP_VERSION=26.2.1 +ARG DEBIAN_VERSION=bullseye-20231009-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 ./ +COPY apps/ ./apps/ +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 apps/lol_analytics_web/priv apps/lol_analytics_web/priv +COPY apps/lol_analytics_web/assets apps/lol_analytics_web/assets +COPY apps/lol_analytics/priv apps/lol_analytics/priv + + +COPY apps apps + +COPY assets assets + +# compile assets +RUN cd apps/lol_analytics_web && 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 ca-certificates \ + && 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/prod ./ + +USER nobody + +# If using an environment that doesn't automatically reap zombie processes, it is +# advised to add an init process such as tini via `apt-get install` +# above and adding an entrypoint. See https://github.com/krallin/tini for details +# ENTRYPOINT ["/tini", "--"] + +ENTRYPOINT [ "/app/bin/prod" ] \ No newline at end of file diff --git a/apps/lol_analytics_web/.dockerignore b/apps/lol_analytics_web/.dockerignore new file mode 100644 index 0000000..61a7393 --- /dev/null +++ b/apps/lol_analytics_web/.dockerignore @@ -0,0 +1,45 @@ +# This file excludes paths from the Docker build context. +# +# By default, Docker's build context includes all files (and folders) in the +# current directory. Even if a file isn't copied into the container it is still sent to +# the Docker daemon. +# +# There are multiple reasons to exclude files from the build context: +# +# 1. Prevent nested folders from being copied into the container (ex: exclude +# /assets/node_modules when copying /assets) +# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) +# 3. Avoid sending files containing sensitive information +# +# More information on using .dockerignore is available here: +# https://docs.docker.com/engine/reference/builder/#dockerignore-file + +.dockerignore + +# Ignore git, but keep git HEAD and refs to access current commit hash if needed: +# +# $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat +# d0b8727759e1e0e7aa3d41707d12376e373d5ecc +.git +!.git/HEAD +!.git/refs + +# Common development/test artifacts +/cover/ +/doc/ +/test/ +/tmp/ +.elixir_ls + +# Mix artifacts +/_build/ +/deps/ +*.ez + +# Generated on crash by the VM +erl_crash.dump + +# Static artifacts - These should be fetched and built inside the Docker image +/assets/node_modules/ +/priv/static/assets/ +/priv/static/cache_manifest.json diff --git a/apps/lol_analytics_web/Dockerfile b/apps/lol_analytics_web/Dockerfile new file mode 100644 index 0000000..fd27d27 --- /dev/null +++ b/apps/lol_analytics_web/Dockerfile @@ -0,0 +1,96 @@ +# 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-20231009-slim - for the release image +# - https://pkgs.org/ - resource for finding needed packages +# - Ex: hexpm/elixir:1.16.0-erlang-26.2.1-debian-bullseye-20231009-slim +# +ARG ELIXIR_VERSION=1.16.0 +ARG OTP_VERSION=26.2.1 +ARG DEBIAN_VERSION=bullseye-20231009-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 ./ +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/runtime.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 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 ca-certificates \ + && 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/prod ./ + +USER nobody + +# If using an environment that doesn't automatically reap zombie processes, it is +# advised to add an init process such as tini via `apt-get install` +# above and adding an entrypoint. See https://github.com/krallin/tini for details +# ENTRYPOINT ["/tini", "--"] + +CMD ["/app/bin/server"] diff --git a/apps/lol_analytics_web/lib/lol_analytics_web/release.ex b/apps/lol_analytics_web/lib/lol_analytics_web/release.ex new file mode 100644 index 0000000..0bca5cc --- /dev/null +++ b/apps/lol_analytics_web/lib/lol_analytics_web/release.ex @@ -0,0 +1,28 @@ +defmodule LoLAnalyticsWeb.Release do + @moduledoc """ + Used for executing DB release tasks when run in production without Mix + installed. + """ + @app :lol_analytics_web + + def migrate do + load_app() + + for repo <- repos() do + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true)) + end + end + + def rollback(repo, version) do + load_app() + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version)) + end + + defp repos do + Application.fetch_env!(@app, :ecto_repos) + end + + defp load_app do + Application.load(@app) + end +end diff --git a/apps/lol_analytics_web/mix.exs b/apps/lol_analytics_web/mix.exs index 924b492..5b129a3 100644 --- a/apps/lol_analytics_web/mix.exs +++ b/apps/lol_analytics_web/mix.exs @@ -41,7 +41,6 @@ defmodule LoLAnalyticsWeb.MixProject do {:phoenix_html, "~> 4.0"}, {:phoenix_live_reload, "~> 1.2", only: :dev}, {:phoenix_live_view, "~> 0.20.2"}, - {:floki, ">= 0.30.0", only: :test}, {:phoenix_live_dashboard, "~> 0.8.3"}, {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, {:tailwind, "~> 0.2", runtime: Mix.env() == :dev}, diff --git a/apps/lol_analytics_web/rel/overlays/bin/migrate b/apps/lol_analytics_web/rel/overlays/bin/migrate new file mode 100755 index 0000000..6343e31 --- /dev/null +++ b/apps/lol_analytics_web/rel/overlays/bin/migrate @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +exec ./lol_analytics_web eval LoLAnalyticsWeb.Release.migrate diff --git a/apps/lol_analytics_web/rel/overlays/bin/migrate.bat b/apps/lol_analytics_web/rel/overlays/bin/migrate.bat new file mode 100755 index 0000000..e3b044d --- /dev/null +++ b/apps/lol_analytics_web/rel/overlays/bin/migrate.bat @@ -0,0 +1 @@ +call "%~dp0\lol_analytics_web" eval LoLAnalyticsWeb.Release.migrate diff --git a/apps/lol_analytics_web/rel/overlays/bin/server b/apps/lol_analytics_web/rel/overlays/bin/server new file mode 100755 index 0000000..60f8825 --- /dev/null +++ b/apps/lol_analytics_web/rel/overlays/bin/server @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +PHX_SERVER=true exec ./lol_analytics_web start diff --git a/apps/lol_analytics_web/rel/overlays/bin/server.bat b/apps/lol_analytics_web/rel/overlays/bin/server.bat new file mode 100755 index 0000000..36020f7 --- /dev/null +++ b/apps/lol_analytics_web/rel/overlays/bin/server.bat @@ -0,0 +1,2 @@ +set PHX_SERVER=true +call "%~dp0\lol_analytics_web" start diff --git a/apps/scrapper/lib/scrapper/match_classifier.ex b/apps/scrapper/lib/scrapper/match_classifier.ex index 3deee45..cade2d7 100644 --- a/apps/scrapper/lib/scrapper/match_classifier.ex +++ b/apps/scrapper/lib/scrapper/match_classifier.ex @@ -34,8 +34,6 @@ defmodule Scrapper.MatchClassifier do end) end - # pass functions, not data - def classify_match_by_queue(_) do end end diff --git a/config/runtime.exs b/config/runtime.exs index 47ea721..833b490 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -37,6 +37,7 @@ if config_env() == :prod do """ config :lol_analytics_web, LoLAnalyticsWeb.Endpoint, + server: true, http: [ # Enable IPv6 and bind on all interfaces. # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. diff --git a/rel/overlays/bin/migrate b/rel/overlays/bin/migrate new file mode 100755 index 0000000..6343e31 --- /dev/null +++ b/rel/overlays/bin/migrate @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +exec ./lol_analytics_web eval LoLAnalyticsWeb.Release.migrate diff --git a/rel/overlays/bin/migrate.bat b/rel/overlays/bin/migrate.bat new file mode 100755 index 0000000..e3b044d --- /dev/null +++ b/rel/overlays/bin/migrate.bat @@ -0,0 +1 @@ +call "%~dp0\lol_analytics_web" eval LoLAnalyticsWeb.Release.migrate diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server new file mode 100755 index 0000000..60f8825 --- /dev/null +++ b/rel/overlays/bin/server @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +PHX_SERVER=true exec ./lol_analytics_web start diff --git a/rel/overlays/bin/server.bat b/rel/overlays/bin/server.bat new file mode 100755 index 0000000..36020f7 --- /dev/null +++ b/rel/overlays/bin/server.bat @@ -0,0 +1,2 @@ +set PHX_SERVER=true +call "%~dp0\lol_analytics_web" start