Compare commits

..

15 commits

Author SHA1 Message Date
780efc3e91
feat: add custom email type for validation
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-28 23:37:50 +02:00
2c708d47e6
chore(Justfile): allow regenerating migrations by commit hash 2025-05-28 23:37:47 +02:00
8f14224eb1
choose input filed type by value_type 2025-05-28 23:36:15 +02:00
6cce36b26e
property value as Union type 2025-05-28 23:36:13 +02:00
feb747bd21
chore: add regen_migrations script and seed-database to Justfile 2025-05-28 23:35:19 +02:00
Renovate Bot
0d33f1baf7 chore(deps): update renovate/renovate docker tag to v40
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-22 13:10:48 +02:00
aeb9cb8e29
fix(renovate): Exclude elixir dependencies from postgres update
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-22 13:09:00 +02:00
60f20ceacf
fix: Elixir version matching in renovate config
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-05-22 12:58:45 +02:00
9e7d8b2277
chore: Remove variables from dockerfile base images to enable renovate updates
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-05-22 12:56:11 +02:00
a334ab6bc4
chore(renovate): Use glob patterns to match postgres packages
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-22 12:43:15 +02:00
32fafad196
chore: Also run renovate on push to main branch
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-05-22 12:34:53 +02:00
ddee222f86
chore: Group renovate postgres updates
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-05-22 12:31:31 +02:00
41634711fe
chore: Remove renovate comment about postgresql in asdf
Since postgres is now handled via docker-compose instead of asdf, the
restriction mentioned in the comment does not apply anymore.
2025-05-22 12:31:31 +02:00
cf18d304ee
chore: Ignore elixir dependency in renovate
Some checks reported errors
continuous-integration/drone/push Build was killed
It's a bit complicated to support the `-otp` postfix right now, so to
fix this right now, we'll just disable automatic updates for elixir.
2025-05-22 12:10:18 +02:00
dce8fbc232 Add Release scripts & Dockerfile
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-22 02:12:20 +02:00
9 changed files with 199 additions and 3 deletions

45
.dockerignore Normal file
View file

@ -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

View file

@ -72,13 +72,16 @@ trigger:
event:
- cron
- custom
- push
branch:
- main
environment:
LOG_LEVEL: debug
steps:
- name: renovate
image: renovate/renovate:39.264
image: renovate/renovate:40.22
environment:
RENOVATE_CONFIG_FILE: "renovate_backend_config.js"
RENOVATE_TOKEN:

93
Dockerfile Normal file
View file

@ -0,0 +1,93 @@
# 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-20250317-slim - for the release image
# - https://pkgs.org/ - resource for finding needed packages
# - Ex: hexpm/elixir:1.18.3-erlang-27.3-debian-bullseye-20250317-slim
#
ARG BUILDER_IMAGE="hexpm/elixir:1.18.3-erlang-27.3-debian-bullseye-20250317-slim"
ARG RUNNER_IMAGE="debian:bullseye-20250317-slim"
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 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/mv ./
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"]

View file

@ -34,6 +34,13 @@ test:
format:
mix format
build-docker-container:
docker build --tag mitgliederverwaltung .
# This is meant for debugging the container build process only.
run-docker-container: build-docker-container
podman run -e "SECRET_KEY_BASE=ahK8BeiDaibaige1ahkooS0chie9lo7the7uuzar0eeBeeCh2iereteshee2Oosu" -e='DATABASE_URL=postgres://postgres@localhost:5432/mv_dev' -e='PORT=4040' -e='PHX_HOST=localhost' --network=host mitgliederverwaltung
# Usage:
# just regen-migrations migration_name [commit_hash]
# If commit_hash is given, rollback & delete the migrations from that commit.

View file

@ -48,7 +48,7 @@ if config_env() == :prod do
You can generate one by calling: mix phx.gen.secret
"""
host = System.get_env("PHX_HOST") || "example.com"
host = System.get_env("PHX_HOST") || raise "Please define the PHX_HOST environment variable."
port = String.to_integer(System.get_env("PORT") || "4000")
config :mv, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")

28
lib/mv/release.ex Normal file
View file

@ -0,0 +1,28 @@
defmodule Mv.Release do
@moduledoc """
Used for executing DB release tasks when run in production without Mix
installed.
"""
@app :mv
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

5
rel/overlays/bin/migrate Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
set -eu
cd -P -- "$(dirname -- "$0")"
exec ./mv eval Mv.Release.migrate

5
rel/overlays/bin/server Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
set -eu
cd -P -- "$(dirname -- "$0")"
PHX_SERVER=true exec ./mv start

View file

@ -8,8 +8,18 @@
},
{
"groupName": "asdf tool versions",
"description": "Keep in mind that Renovate currently does not support updating PostgreSQL via asdf.",
"matchFileNames": [".tool-versions"]
},
{
"groupName": "postgres",
"description": "Group updates to postgres across drone ci, docker-compose.yml and other files",
"matchPackageNames": ["postgres", "docker.io/library/postgres"],
"matchDatasources": ["docker"]
},
{
"matchFileNames": [".tool-versions", "Dockerfile"],
"matchCurrentValue": "**-otp-**",
"enabled": false
}
]
}