#!/bin/bash COLOR_BLUE="\033[38;2;51;100;255m" COLOR_RESET="\033[0m" DEPLOY=false # parse flags for arg in "$@"; do case $arg in --deploy) DEPLOY=true shift ;; esac done echo "${COLOR_BLUE}" echo "==========================================" echo " Setting up coryd.dev locally " echo "==========================================" echo "${COLOR_RESET}" # determine sed compatibility if [[ "$OSTYPE" == "darwin"* ]]; then SED_INPLACE="sed -i ''" else SED_INPLACE="sed -i" fi # get secrets from 1password echo "${COLOR_BLUE}Signing in to 1Password...${COLOR_RESET}" eval $(op signin) echo "${COLOR_BLUE}Fetching secrets from 1Password...${COLOR_RESET}" SECRETS_JSON='{ "POSTGREST_URL": "{{ op://Private/coryd.dev secrets/POSTGREST_URL }}", "POSTGREST_API_KEY": "{{ op://Private/coryd.dev secrets/POSTGREST_API_KEY }}", "MASTODON_ACCESS_TOKEN": "{{ op://Private/coryd.dev secrets/MASTODON_ACCESS_TOKEN }}", "MASTODON_SYNDICATION_TOKEN": "{{ op://Private/coryd.dev secrets/MASTODON_SYNDICATION_TOKEN }}", "FORWARDEMAIL_API_KEY": "{{ op://Private/coryd.dev secrets/FORWARDEMAIL_API_KEY }}", "BOOK_IMPORT_TOKEN": "{{ op://Private/coryd.dev secrets/BOOK_IMPORT_TOKEN }}", "WATCHING_IMPORT_TOKEN": "{{ op://Private/coryd.dev secrets/WATCHING_IMPORT_TOKEN }}", "ARTIST_IMPORT_TOKEN": "{{ op://Private/coryd.dev secrets/ARTIST_IMPORT_TOKEN }}", "TMDB_API_KEY": "{{ op://Private/coryd.dev secrets/TMDB_API_KEY }}", "SEASONS_IMPORT_TOKEN": "{{ op://Private/coryd.dev secrets/SEASONS_IMPORT_TOKEN }}", "NAVIDROME_SCROBBLE_TOKEN": "{{ op://Private/coryd.dev secrets/NAVIDROME_SCROBBLE_TOKEN }}", "NAVIDROME_API_URL": "{{ op://Private/coryd.dev secrets/NAVIDROME_API_URL }}", "NAVIDROME_API_TOKEN": "{{ op://Private/coryd.dev secrets/NAVIDROME_API_TOKEN }}", "COOLIFY_REBUILD_TOKEN": "{{ op://Private/coryd.dev secrets/COOLIFY_REBUILD_TOKEN }}", "COOLIFY_REBUILD_URL": "{{ op://Private/coryd.dev secrets/COOLIFY_REBUILD_URL }}", "GIT_REPO": "{{ op://Private/coryd.dev secrets/GIT_REPO }}", "SERVER_IP": "{{ op://Private/coryd.dev secrets/SERVER_IP }}" }' SECRETS=$(echo "$SECRETS_JSON" | op inject) if [ -z "$SECRETS" ]; then echo "error: failed to retrieve secrets from 1Password." exit 1 fi echo "${COLOR_BLUE}Writing .env file...${COLOR_RESET}" echo "$SECRETS" | jq -r 'to_entries | .[] | "\(.key)=\(.value)"' > .env export $(grep -v '^#' .env | xargs) echo "${COLOR_BLUE}📦 Installing root project dependencies...${COLOR_RESET}" npm install echo "${COLOR_BLUE}📦 Installing PHP dependencies (composer)...${COLOR_RESET}" composer install echo "${COLOR_BLUE}📦 Installing CLI dependencies...${COLOR_RESET}" ( cd cli npm install ) if ! command -v cd_cli >/dev/null 2>&1; then echo "${COLOR_BLUE}🔗 Linking CLI globally...${COLOR_RESET}" ( cd cli npm link ) fi echo "${COLOR_BLUE}⚙️ Initializing media storage config...${COLOR_RESET}" cd_cli init mkdir -p generated # escape sed replacements escape_special_chars() { printf '%s' "$1" | sed 's/[&/\|]/\\&/g' } # replace placeholders in template file render_template() { local input="$1" local output="$2" cp "$input" "$output" for key in $(jq -r 'keys_unsorted[]' <<< "$SECRETS"); do value=$(jq -r --arg k "$key" '.[$k]' <<< "$SECRETS") $SED_INPLACE "s|{{${key}}}|$(escape_special_chars "$value")|g" "$output" done } # render templates for file in scripts/templates/*.template; do [ -e "$file" ] || continue new_file="generated/$(basename "${file%.template}")" cp "$file" "$new_file" # replace placeholders sed -i '' -e "s|{{POSTGREST_URL}}|$(escape_special_chars "$POSTGREST_URL")|g" "$new_file" sed -i '' -e "s|{{POSTGREST_API_KEY}}|$(escape_special_chars "$POSTGREST_API_KEY")|g" "$new_file" sed -i '' -e "s|{{MASTODON_ACCESS_TOKEN}}|$(escape_special_chars "$MASTODON_ACCESS_TOKEN")|g" "$new_file" sed -i '' -e "s|{{MASTODON_SYNDICATION_TOKEN}}|$(escape_special_chars "$MASTODON_SYNDICATION_TOKEN")|g" "$new_file" sed -i '' -e "s|{{FORWARDEMAIL_API_KEY}}|$(escape_special_chars "$FORWARDEMAIL_API_KEY")|g" "$new_file" sed -i '' -e "s|{{BOOK_IMPORT_TOKEN}}|$(escape_special_chars "$BOOK_IMPORT_TOKEN")|g" "$new_file" sed -i '' -e "s|{{WATCHING_IMPORT_TOKEN}}|$(escape_special_chars "$WATCHING_IMPORT_TOKEN")|g" "$new_file" sed -i '' -e "s|{{ARTIST_IMPORT_TOKEN}}|$(escape_special_chars "$ARTIST_IMPORT_TOKEN")|g" "$new_file" sed -i '' -e "s|{{TMDB_API_KEY}}|$(escape_special_chars "$TMDB_API_KEY")|g" "$new_file" sed -i '' -e "s|{{SEASONS_IMPORT_TOKEN}}|$(escape_special_chars "$SEASONS_IMPORT_TOKEN")|g" "$new_file" sed -i '' -e "s|{{NAVIDROME_SCROBBLE_TOKEN}}|$(escape_special_chars "$NAVIDROME_SCROBBLE_TOKEN")|g" "$new_file" sed -i '' -e "s|{{NAVIDROME_API_URL}}|$(escape_special_chars "$NAVIDROME_API_URL")|g" "$new_file" sed -i '' -e "s|{{NAVIDROME_API_TOKEN}}|$(escape_special_chars "$NAVIDROME_API_TOKEN")|g" "$new_file" sed -i '' -e "s|{{COOLIFY_REBUILD_TOKEN}}|$(escape_special_chars "$COOLIFY_REBUILD_TOKEN")|g" "$new_file" sed -i '' -e "s|{{COOLIFY_REBUILD_URL}}|$(escape_special_chars "$COOLIFY_REBUILD_URL")|g" "$new_file" sed -i '' -e "s|{{GIT_REPO}}|$(escape_special_chars "$GIT_REPO")|g" "$new_file" sed -i '' -e "s|{{SERVER_IP}}|$(escape_special_chars "$SERVER_IP")|g" "$new_file" done echo "${COLOR_BLUE}all configurations generated in the 'generated' folder.${COLOR_RESET}" echo "${COLOR_BLUE}" echo "==========================================" echo " Setup complete! " echo " Your local environment is ready! 💻 " echo "==========================================" echo "${COLOR_RESET}" if [ "$DEPLOY" = true ]; then echo "${COLOR_BLUE}Reading module lists...${COLOR_RESET}" # read lists MODULES_LIST="scripts/lists/apache_modules.list" PHP_EXTENSIONS_LIST="scripts/lists/php_extensions.list" REQUIRED_MODULES=$(tr '\n' ' ' < "$MODULES_LIST" | sed 's/ *$//') REQUIRED_PHP_EXTENSIONS=$(tr '\n' ' ' < "$PHP_EXTENSIONS_LIST" | sed 's/ *$//') echo "${COLOR_BLUE}Writing server setup script...${COLOR_RESET}" # generate server setup script cat > generated/setup-server.sh <