Files
hop.noname.company/scripts/configure-nas.sh

105 lines
3.8 KiB
Bash

#!/bin/sh
# NAS에서 실행합니다. 기존 .env와 비밀값은 유지합니다.
set -eu
cd "$(dirname "$0")/.."
umask 077
hop_env_tmp=''
hop_yaml_tmp=''
hop_echo_hidden=false
cleanup() {
if [ "$hop_echo_hidden" = true ]; then stty echo; fi
if [ -n "$hop_env_tmp" ]; then rm -f "$hop_env_tmp"; fi
if [ -n "$hop_yaml_tmp" ]; then rm -f "$hop_yaml_tmp"; fi
}
trap cleanup 0
trap 'exit 130' INT
trap 'exit 129' HUP
trap 'exit 143' TERM
if ! docker compose config --help | grep -q -- '--no-env-resolution'; then
printf '%s\n' 'Docker 앱/Compose를 업데이트하세요. --no-env-resolution 옵션이 필요합니다.' >&2
exit 1
fi
if [ ! -f .env ]; then
command -v openssl >/dev/null || {
printf '%s\n' 'openssl 명령이 필요합니다.' >&2
exit 1
}
printf 'NAS의 실제 내부 IPv4 주소를 입력하고 Enter: '
read -r hop_nas_ip
if ! printf '%s\n' "$hop_nas_ip" | awk -F. '
NF != 4 { exit 1 }
{ for (i = 1; i <= 4; i++) if ($i !~ /^[0-9]+$/ || $i > 255) exit 1 }
'; then
printf '%s\n' 'NAS의 IPv4 주소를 입력하세요.' >&2
exit 1
fi
printf 'Resend API 키를 입력하고 Enter (건너뛰려면 Enter): '
if [ -t 0 ]; then
stty -echo
hop_echo_hidden=true
fi
read -r hop_resend_key
if [ "$hop_echo_hidden" = true ]; then
stty echo
hop_echo_hidden=false
fi
printf '\n'
case "$hop_resend_key" in
*[!A-Za-z0-9_-]*)
printf '%s\n' 'Resend API 키에는 공백이나 따옴표를 넣지 마세요.' >&2
exit 1 ;;
esac
hop_registration=closed
if [ -n "$hop_resend_key" ]; then
printf '회원가입을 활성화할까요? y 입력 후 Enter / 비활성화는 Enter: '
read -r hop_open_registration
case "$hop_open_registration" in y|Y) hop_registration=open ;; esac
fi
hop_session_secret=$(openssl rand -hex 32)
hop_discovery_secret=$(openssl rand -hex 32)
hop_env_tmp=$(mktemp .env.nas.XXXXXX)
awk '!/^(HOP_BIND_IP|HOP_HOST_PORT|HOP_CONTAINER_PORT|APP_URL|SESSION_SECRET|DISCOVERY_SECRET|RESEND_API_KEY|REGISTRATION_MODE)=/' .env.example > "$hop_env_tmp"
{
printf 'HOP_BIND_IP=%s\n' "$hop_nas_ip"
printf 'HOP_HOST_PORT=50189\nHOP_CONTAINER_PORT=50189\n'
printf 'APP_URL=https://hop.noname.company\n'
printf 'SESSION_SECRET=%s\n' "$hop_session_secret"
printf 'DISCOVERY_SECRET=%s\n' "$hop_discovery_secret"
printf 'RESEND_API_KEY=%s\n' "$hop_resend_key"
printf 'REGISTRATION_MODE=%s\n' "$hop_registration"
} >> "$hop_env_tmp"
mv "$hop_env_tmp" .env
hop_env_tmp=''
unset hop_session_secret hop_discovery_secret hop_resend_key
else
printf '%s\n' '기존 .env를 유지합니다. 비밀값을 다시 생성하지 않습니다.'
fi
chmod 600 .env
if grep -Eq '^USER_STORAGE_LIMIT_MB=10240$' .env; then
hop_env_tmp=$(mktemp .env.nas.XXXXXX)
awk '{ if ($0 == "USER_STORAGE_LIMIT_MB=10240") print "USER_STORAGE_LIMIT_MB=2048"; else print }' .env > "$hop_env_tmp"
mv "$hop_env_tmp" .env
hop_env_tmp=''
printf '%s\n' '개인 보관함 기본 한도를 10GiB에서 2GiB로 변경했습니다. 기존 자료는 유지합니다.'
fi
if ! grep -Eq '^PROXY_DIAGNOSTIC_TOKEN=.{32,}$' .env; then
hop_diagnostic_token=$(openssl rand -hex 32)
hop_env_tmp=$(mktemp .env.nas.XXXXXX)
awk '!/^PROXY_DIAGNOSTIC_TOKEN=/' .env > "$hop_env_tmp"
printf 'PROXY_DIAGNOSTIC_TOKEN=%s\n' "$hop_diagnostic_token" >> "$hop_env_tmp"
mv "$hop_env_tmp" .env
hop_env_tmp=''
unset hop_diagnostic_token
fi
hop_yaml_tmp=$(mktemp .compose.nas.XXXXXX)
docker compose --project-name hop --project-directory "$PWD" --env-file .env -f compose.yaml config --no-env-resolution > "$hop_yaml_tmp"
mv "$hop_yaml_tmp" compose.nas.yaml
hop_yaml_tmp=''
chmod 600 compose.nas.yaml
printf '\n%s\n' '완료. Docker 앱에서 프로젝트 이름 hop으로 아래 YAML을 불러오세요.'
printf '%s/compose.nas.yaml\n' "$PWD"