122 lines
4.6 KiB
Bash
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"
|