Compare commits
No commits in common. "main" and "grist" have entirely different histories.
10 changed files with 5 additions and 157 deletions
|
|
@ -1,46 +0,0 @@
|
||||||
# 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
|
|
||||||
# https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Gen.Release.html#module-docker
|
|
||||||
/assets/node_modules/
|
|
||||||
/priv/static/assets/
|
|
||||||
/priv/static/cache_manifest.json
|
|
||||||
94
Dockerfile
94
Dockerfile
|
|
@ -1,94 +0,0 @@
|
||||||
# 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?name=ubuntu
|
|
||||||
# https://hub.docker.com/_/ubuntu/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/tags?name=trixie-20260112-slim - for the release image
|
|
||||||
# - https://pkgs.org/ - resource for finding needed packages
|
|
||||||
# - Ex: docker.io/hexpm/elixir:1.16.2-erlang-26.1.1-debian-trixie-20260112-slim
|
|
||||||
#
|
|
||||||
ARG ELIXIR_VERSION=1.16.2
|
|
||||||
ARG OTP_VERSION=26.1.1
|
|
||||||
ARG DEBIAN_VERSION=trixie-20260112-slim
|
|
||||||
|
|
||||||
ARG BUILDER_IMAGE="docker.io/hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}"
|
|
||||||
ARG RUNNER_IMAGE="docker.io/debian:${DEBIAN_VERSION}"
|
|
||||||
|
|
||||||
FROM ${BUILDER_IMAGE} AS builder
|
|
||||||
|
|
||||||
# install build dependencies
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -y --no-install-recommends build-essential git \
|
|
||||||
&& rm -rf /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
|
|
||||||
|
|
||||||
# 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} AS final
|
|
||||||
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -y --no-install-recommends libstdc++6 openssl libncurses6 locales ca-certificates \
|
|
||||||
&& rm -rf /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/camp_api ./
|
|
||||||
|
|
||||||
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"]
|
|
||||||
|
|
@ -29,6 +29,8 @@ config :logger, :default_formatter,
|
||||||
# Use Jason for JSON parsing in Phoenix
|
# Use Jason for JSON parsing in Phoenix
|
||||||
config :phoenix, :json_library, Jason
|
config :phoenix, :json_library, Jason
|
||||||
|
|
||||||
|
config :camp_api, :grist, api_key: System.get_env("GRIST_API_KEY")
|
||||||
|
|
||||||
# Import environment specific config. This must remain at the bottom
|
# Import environment specific config. This must remain at the bottom
|
||||||
# of this file so it overrides the configuration defined above.
|
# of this file so it overrides the configuration defined above.
|
||||||
import_config "#{config_env()}.exs"
|
import_config "#{config_env()}.exs"
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,6 @@ config :camp_api, CampApiWeb.Endpoint,
|
||||||
# Enable dev routes for dashboard and mailbox
|
# Enable dev routes for dashboard and mailbox
|
||||||
config :camp_api, dev_routes: true
|
config :camp_api, dev_routes: true
|
||||||
|
|
||||||
config :camp_api, :grist, api_key: System.get_env("GRIST_API_KEY")
|
|
||||||
|
|
||||||
# Do not include metadata nor timestamps in development logs
|
# Do not include metadata nor timestamps in development logs
|
||||||
config :logger, :default_formatter, format: "[$level] $message\n"
|
config :logger, :default_formatter, format: "[$level] $message\n"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,6 @@ end
|
||||||
config :camp_api, CampApiWeb.Endpoint,
|
config :camp_api, CampApiWeb.Endpoint,
|
||||||
http: [port: String.to_integer(System.get_env("PORT", "4000"))]
|
http: [port: String.to_integer(System.get_env("PORT", "4000"))]
|
||||||
|
|
||||||
config :camp_api, :grist, api_key: System.get_env("GRIST_API_KEY")
|
|
||||||
|
|
||||||
if config_env() == :prod do
|
if config_env() == :prod do
|
||||||
# The secret key base is used to sign/encrypt cookies and other secrets.
|
# The secret key base is used to sign/encrypt cookies and other secrets.
|
||||||
# A default value is used in config/dev.exs and config/test.exs but you
|
# A default value is used in config/dev.exs and config/test.exs but you
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
defmodule CampApiWeb.Router do
|
defmodule CampApiWeb.Router do
|
||||||
use CampApiWeb, :router
|
use CampApiWeb, :router
|
||||||
|
|
||||||
pipeline :public_api do
|
pipeline :api do
|
||||||
plug :accepts, ["json"]
|
plug :accepts, ["json"]
|
||||||
plug CORSPlug, origin: ["*"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api", CampApiWeb do
|
scope "/api", CampApiWeb do
|
||||||
pipe_through :public_api
|
pipe_through :api
|
||||||
|
|
||||||
get "/gauge", GristController, :gauge
|
get "/gauge", GristController, :gauge
|
||||||
|
|
||||||
|
|
|
||||||
3
mix.exs
3
mix.exs
|
|
@ -46,8 +46,7 @@ defmodule CampApi.MixProject do
|
||||||
{:jason, "~> 1.2"},
|
{:jason, "~> 1.2"},
|
||||||
{:dns_cluster, "~> 0.2.0"},
|
{:dns_cluster, "~> 0.2.0"},
|
||||||
{:bandit, "~> 1.5"},
|
{:bandit, "~> 1.5"},
|
||||||
{:req, "~> 0.5.0"},
|
{:req, "~> 0.5.0"}
|
||||||
{:cors_plug, "~> 3.0"}
|
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
1
mix.lock
1
mix.lock
|
|
@ -1,6 +1,5 @@
|
||||||
%{
|
%{
|
||||||
"bandit": {:hex, :bandit, "1.9.0", "6dc1ff2c30948dfecf32db574cc3447c7b9d70e0b61140098df3818870b01b76", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "2538aaa1663b40ca9cbd8ca1f8a540cb49e5baf34c6ffef068369cc45f9146f2"},
|
"bandit": {:hex, :bandit, "1.9.0", "6dc1ff2c30948dfecf32db574cc3447c7b9d70e0b61140098df3818870b01b76", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "2538aaa1663b40ca9cbd8ca1f8a540cb49e5baf34c6ffef068369cc45f9146f2"},
|
||||||
"cors_plug": {:hex, :cors_plug, "3.0.3", "7c3ac52b39624bc616db2e937c282f3f623f25f8d550068b6710e58d04a0e330", [:mix], [{:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3f2d759e8c272ed3835fab2ef11b46bddab8c1ab9528167bd463b6452edf830d"},
|
|
||||||
"dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"},
|
"dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"},
|
||||||
"finch": {:hex, :finch, "0.21.0", "b1c3b2d48af02d0c66d2a9ebfb5622be5c5ecd62937cf79a88a7f98d48a8290c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87dc6e169794cb2570f75841a19da99cfde834249568f2a5b121b809588a4377"},
|
"finch": {:hex, :finch, "0.21.0", "b1c3b2d48af02d0c66d2a9ebfb5622be5c5ecd62937cf79a88a7f98d48a8290c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87dc6e169794cb2570f75841a19da99cfde834249568f2a5b121b809588a4377"},
|
||||||
"hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"},
|
"hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"},
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
cd -P -- "$(dirname -- "$0")"
|
|
||||||
PHX_SERVER=true exec ./camp_api start
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
set PHX_SERVER=true
|
|
||||||
call "%~dp0\camp_api" start
|
|
||||||
Loading…
Add table
Reference in a new issue