mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 10:18:54 +00:00
This PR adds support for ECS metadata API (https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html) in order to discover hostname. It also adds jq in the runtime image Unlike EC2 or GCP VM, ECS tasks do not have a DNS record, we can only use their IP as RELEASE_HOSTNAME. So I use their IPv4, IPv6 only networks are therefore not supported.
48 lines
2.3 KiB
Elixir
48 lines
2.3 KiB
Elixir
#!/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 -kernel inet_dist_listen_min ${ERLANG_DISTRIBUTION_PORT} inet_dist_listen_max ${ERLANG_DISTRIBUTION_PORT}"
|
|
;;
|
|
|
|
start*)
|
|
export ELIXIR_ERL_OPTIONS="-kernel inet_dist_listen_min ${ERLANG_DISTRIBUTION_PORT} inet_dist_listen_max ${ERLANG_DISTRIBUTION_PORT}"
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# Set the release to work across nodes. If using the long name format like
|
|
# the one below (my_app@127.0.0.1), you need to also uncomment the
|
|
# RELEASE_DISTRIBUTION variable below. Must be "sname", "name" or "none".
|
|
export RELEASE_DISTRIBUTION=name
|
|
|
|
# Read current hostname from metadata server if available,
|
|
# this is to ensure that the hostname is correct in Google Cloud Compute.
|
|
#
|
|
# Having a valid DNS record is important to remotely connect to a running Erlang node.
|
|
if [[ "${RELEASE_HOST_DISCOVERY_METHOD}" == "gce_metadata" ]]; then
|
|
export GCP_PROJECT_ID=$(curl "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google" -s)
|
|
export GCP_INSTANCE_NAME=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/name" -H "Metadata-Flavor: Google" -s)
|
|
export GCP_INSTANCE_ZONE=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google" -s | sed 's:.*/::')
|
|
RELEASE_HOSTNAME="$GCP_INSTANCE_NAME.$GCP_INSTANCE_ZONE.c.${GCP_PROJECT_ID}.internal"
|
|
elif [[ "${RELEASE_HOST_DISCOVERY_METHOD}" == "aws_ecs_metadata" ]]; then
|
|
RELEASE_HOSTNAME=$(curl "${ECS_CONTAINER_METADATA_URI_V4}" | jq -r '.Networks[0].IPv4Addresses[0]')
|
|
else
|
|
RELEASE_HOSTNAME=${RELEASE_HOSTNAME:-127.0.0.1}
|
|
fi
|
|
|
|
# RELEASE_NAME is guaranteed to be set by the start script and defaults to 'firezone'
|
|
# set RELEASE_NAME in the environment to a unique value when running multiple instances
|
|
# in the same network namespace (i.e. with host networking in Podman)
|
|
export RELEASE_NODE=${RELEASE_NAME}@${RELEASE_HOSTNAME}
|
|
|
|
# Choices here are 'interactive' and 'embedded'. 'interactive' boots faster which
|
|
# prevents some runit process management edge cases at the expense of the application
|
|
# not technically being ready to serve requests "right away". This is a useful tradeoff.
|
|
export RELEASE_MODE=interactive
|