#!/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|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 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 # sudo writes configuration as root; return it to the SSH user for Git/Docker app access. if [ "$(id -u)" = 0 ]; then chown "$hop_run_uid:$hop_run_gid" .env compose.nas.yaml fi printf '\n%s\n' '완료. Docker 앱에서 프로젝트 이름 hop으로 아래 YAML을 불러오세요.' printf '%s/compose.nas.yaml\n' "$PWD"