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

122 lines
4.6 KiB
Bash

#!/bin/sh
# NAS에서 실행합니다. 기존 .env와 비밀값은 유지합니다.
set -eu
cd "$(dirname "$0")/.."
umask 077
hop_env_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
}
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|HOP_RUN_UID|HOP_RUN_GID|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
# Match the NAS user so owner-only uploaded files remain readable in the NAS file manager.
hop_run_uid=${SUDO_UID:-$(id -u)}
hop_run_gid=${SUDO_GID:-$(id -g)}
if [ "$hop_run_uid" = 0 ]; then
printf '%s\n' 'NAS의 일반 사용자로 로그인한 뒤 sudo sh scripts/configure-nas.sh로 실행하세요.' >&2
exit 1
fi
for hop_identity_key in HOP_RUN_UID HOP_RUN_GID; do
if ! grep -Eq "^${hop_identity_key}=[0-9]+$" .env; then
hop_env_tmp=$(mktemp .env.nas.XXXXXX)
awk -v key="$hop_identity_key" 'index($0,key "=") != 1' .env > "$hop_env_tmp"
case "$hop_identity_key" in HOP_RUN_UID) hop_identity_value=$hop_run_uid ;; HOP_RUN_GID) hop_identity_value=$hop_run_gid ;; esac
printf '%s=%s\n' "$hop_identity_key" "$hop_identity_value" >> "$hop_env_tmp"
mv "$hop_env_tmp" .env
hop_env_tmp=''
fi
done
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
sh scripts/prepare-nas-storage.sh
docker compose -f docker-compose.yaml config --no-env-resolution --quiet
# sudo writes .env as root; return it to the SSH user. Never rewrite the tracked Compose file.
if [ "$(id -u)" = 0 ]; then
chown "$hop_run_uid:$hop_run_gid" .env
fi
printf '\n%s\n' '완료. Git에서 관리하는 아래 파일을 Docker 앱과 터미널에서 함께 사용하세요.'
printf '%s/docker-compose.yaml\n' "$PWD"