-
Notifications
You must be signed in to change notification settings - Fork 70
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add a install script #184
Draft
karlprieb
wants to merge
2
commits into
develop
Choose a base branch
from
install-script
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 1 commit
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,301 @@ | ||
#!/usr/bin/env sh | ||
|
||
print_message() { | ||
echo " ️ $1" | ||
} | ||
|
||
print_success() { | ||
echo "✅ $1" | ||
} | ||
|
||
print_error() { | ||
echo "❌ $1" | ||
} | ||
|
||
print_question() { | ||
echo "ℹ️ $1" | ||
} | ||
|
||
update_or_add_env_var() { | ||
KEY=$1 | ||
VALUE=$2 | ||
|
||
# Check if the key already exists in the .env file | ||
if grep -q "^$KEY=" .env; then | ||
# Key exists, update its value | ||
sed -i '' "s/^$KEY=.*/$KEY=$VALUE/" .env | ||
else | ||
# Key doesn't exist, add it | ||
echo "$KEY=$VALUE" >> .env | ||
fi | ||
} | ||
|
||
# Welcome Prompt | ||
print_message "👋 Welcome to the AR.IO Network Setup Script!" | ||
echo "" | ||
print_message "This script will guide you through the process of configuring your AR.IO node." | ||
print_message "You'll be prompted to choose which services you want to run and to set various configuration options." | ||
print_message "By the end of this setup, your AR.IO node will be configured and running, ready to participate in the AR.IO network." | ||
print_message "We’re excited to have you join the AR.IO community and help grow the decentralized web! 🚀" | ||
print_message "Let's get started! ⏳" | ||
echo "" | ||
|
||
# Step 1: Identify the Operating System | ||
OS="$(uname -s)" | ||
case "$OS" in | ||
Linux*) OS_TYPE=Linux;; | ||
Darwin*) OS_TYPE=Mac;; | ||
*) OS_TYPE="UNKNOWN" | ||
esac | ||
|
||
if [ "$OS_TYPE" = "UNKNOWN" ]; then | ||
print_error "Unsupported operating system detected. This script only supports Linux and MacOS. 🚫" | ||
exit 1 | ||
fi | ||
|
||
# Step 2: Check for Docker and Docker Compose v2 | ||
print_message "Checking if required tools are installed 🔍" | ||
DOCKER_CHECK=$(command -v docker) | ||
DOCKER_COMPOSE_VERSION=$(docker compose version 2>/dev/null | grep "Docker Compose version v2") | ||
|
||
if [ -z "$DOCKER_CHECK" ] || [ -z "$DOCKER_COMPOSE_VERSION" ]; then | ||
print_error "It seems Docker or Docker Compose v2 is not installed, or you may not have the required permissions to run Docker. 😢" | ||
echo "👉 Please check if Docker is installed and you have the correct permissions. If not, you can find installation instructions on the Docker website:" | ||
if [ "$OS_TYPE" = "Mac" ]; then | ||
echo "🍏 https://docs.docker.com/desktop/install/mac-install/" | ||
elif [ "$OS_TYPE" = "Linux" ]; then | ||
echo "🐧 https://docs.docker.com/desktop/install/linux-install/" | ||
fi | ||
exit 1 | ||
else | ||
print_success "Docker and Docker Compose v2 are installed 🎉" | ||
fi | ||
|
||
# Step 3: Download the Docker Compose file and .env from the latest tag | ||
LATEST_TAG=$(curl -s https://api.github.com/repos/ar-io/ar-io-node/tags | grep 'name' | head -n 1 | cut -d\" -f4) | ||
|
||
if [ -z "$LATEST_TAG" ]; then | ||
print_error "Failed to retrieve the latest release tag. Please check your internet connection or the repository status." | ||
exit 1 | ||
fi | ||
|
||
# Define the URLs for the files to download | ||
DOCKER_COMPOSE_URL="https://raw.githubusercontent.com/ar-io/ar-io-node/$LATEST_TAG/docker-compose.yaml" | ||
ENV_EXAMPLE_URL="https://raw.githubusercontent.com/ar-io/ar-io-node/$LATEST_TAG/.env.example" | ||
|
||
curl -s -O "$DOCKER_COMPOSE_URL" | ||
if [ $? -ne 0 ]; then | ||
print_error "Failed to download docker-compose.yaml. Please try again. 💻" | ||
exit 1 | ||
fi | ||
|
||
curl -s -O "$ENV_EXAMPLE_URL" | ||
if [ $? -ne 0 ]; then | ||
print_error "Failed to download .env.example. Please try again. 💻" | ||
exit 1 | ||
else | ||
mv .env.example .env | ||
fi | ||
|
||
# Delete existing docker-compose.override.yml if it exists | ||
if [ -f docker-compose.override.yml ]; then | ||
rm docker-compose.override.yml | ||
fi | ||
|
||
# Step 4: Prompt the user to select services to run | ||
echo ""; | ||
echo ""; | ||
print_message "The AR.IO node setup includes several services. You can choose which services you'd like to run:" | ||
|
||
echo "1) Envoy - A reverse proxy that handles incoming requests" | ||
echo "2) Node - The AR.IO gateway (called core in docker compose) + Redis" | ||
echo "3) Observer - Creates observation reports based on ArNS name requests to other AR.IO gateways" | ||
echo "4) Resolver - Resolves ArNS names that your node will respond to" | ||
echo "5) Litestream - Provides continuous backup for SQLite databases" | ||
|
||
echo "" | ||
print_message "Please enter the numbers corresponding to the services you'd like to run (e.g., 1 2 3):" | ||
read -r SERVICES_SELECTED | ||
echo "" | ||
|
||
# Build a list of services to disable using profiles | ||
SERVICES_TO_DISABLE="" | ||
for SERVICE in 1 2 3 4 5; do | ||
if ! echo "$SERVICES_SELECTED" | grep -q "$SERVICE"; then | ||
case $SERVICE in | ||
1) SERVICES_TO_DISABLE="$SERVICES_TO_DISABLE envoy";; | ||
2) SERVICES_TO_DISABLE="$SERVICES_TO_DISABLE core redis";; | ||
3) SERVICES_TO_DISABLE="$SERVICES_TO_DISABLE observer";; | ||
4) SERVICES_TO_DISABLE="$SERVICES_TO_DISABLE resolver";; | ||
5) SERVICES_TO_DISABLE="$SERVICES_TO_DISABLE litestream";; | ||
esac | ||
fi | ||
done | ||
|
||
# Create docker-compose.override.yml to add 'donotstart' profile for the services the user did not select | ||
if [ -n "$SERVICES_TO_DISABLE" ]; then | ||
echo "services:" >> docker-compose.override.yml | ||
|
||
for SERVICE in $SERVICES_TO_DISABLE; do | ||
echo " $SERVICE:" >> docker-compose.override.yml | ||
echo " profiles:" >> docker-compose.override.yml | ||
echo " - donotstart" >> docker-compose.override.yml | ||
done | ||
|
||
print_success "Great! Your node will start with only the services you selected enabled 🛠️" | ||
else | ||
print_message "Uhu! Your node will start with all services enabled 🛠️" | ||
fi | ||
|
||
# Step 5: Configure START_HEIGHT and STOP_HEIGHT | ||
echo ""; | ||
print_message "Now let's take a look at the settings for your node node" | ||
echo ""; | ||
|
||
# Prompt for START_HEIGHT | ||
print_question "By default, your node will sync from block 0. If you want to start from a specific block, enter the block number. Otherwise, leave it empty." | ||
read -r START_HEIGHT | ||
if [ -n "$START_HEIGHT" ]; then | ||
update_or_add_env_var "START_HEIGHT" "$START_HEIGHT" | ||
print_success "Your node will start syncing from block $START_HEIGHT" | ||
else | ||
print_message "Your node will start syncing from block 0" | ||
fi | ||
echo "" | ||
|
||
# Prompt for STOP_HEIGHT | ||
print_question "Your node will sync indefinitely by default. If you want to stop at a specific block, enter the block number. Otherwise, leave it empty." | ||
read -r STOP_HEIGHT | ||
if [ -n "$STOP_HEIGHT" ]; then | ||
update_or_add_env_var "STOP_HEIGHT" "$STOP_HEIGHT" | ||
print_success "Your node will stop syncing at block $STOP_HEIGHT" | ||
else | ||
print_message "Your node will sync indefinitely" | ||
fi | ||
echo "" | ||
|
||
# Step 6: Ask if the user wants the node to resolve ArNS names | ||
print_question "Do you want your node to resolve ArNS names? (y/n)" | ||
read -r RESOLVE_ARNS | ||
|
||
if [ "$RESOLVE_ARNS" = "y" ] || [ "$RESOLVE_ARNS" = "Y" ]; then | ||
print_question "Please enter the domain that your node will use for resolving ArNS names (e.g., example.com)." | ||
read -r ARNS_ROOT_HOST | ||
if [ -n "$ARNS_ROOT_HOST" ]; then | ||
update_or_add_env_var "ARNS_ROOT_HOST" "$ARNS_ROOT_HOST" | ||
|
||
# Check if the resolver service was selected | ||
if ! echo "$SERVICES_SELECTED" | grep -q "4"; then | ||
print_message "You chose to resolve ArNS names, but the resolver service is not enabled. The resolver service is necessary for this feature." | ||
print_question "Do you want to enable the resolver service? (y/n)" | ||
read -r ENABLE_RESOLVER | ||
|
||
if [ "$ENABLE_RESOLVER" = "y" ] || [ "$ENABLE_RESOLVER" = "Y" ]; then | ||
# Remove override for resolver in docker-compose.override.yml | ||
sed -i '/resolver:/,+2d' docker-compose.override.yml 2>/dev/null | ||
print_success "Resolver service enabled" | ||
|
||
update_or_add_env_var "TRUSTED_ARNS_RESOLVER_TYPE" "resolver" | ||
update_or_add_env_var "TRUSTED_ARNS_RESOLVER_URL" "http://resolver:6000" | ||
else | ||
print_error "ArNS name resolution requires the resolver service. The resolver service will not be enabled, so ArNS resolution cannot be completed." | ||
exit 1 | ||
fi | ||
else | ||
# Add TRUSTED_ARNS_RESOLVER_TYPE and TRUSTED_ARNS_RESOLVER_URL to .env if resolver was already selected | ||
update_or_add_env_var "TRUSTED_ARNS_RESOLVER_TYPE" "resolver" | ||
update_or_add_env_var "TRUSTED_ARNS_RESOLVER_URL" "http://resolver:6000" | ||
fi | ||
else | ||
print_error "Domain cannot be empty if ArNS resolution is enabled." | ||
exit 1 | ||
fi | ||
else | ||
print_message "ArNS name resolution will be disabled for your node." | ||
fi | ||
|
||
# Step 7: Ask about unbundling bundles to index data items | ||
echo "" | ||
print_question "Do you want to unbundle bundles to index data items? (always/never/custom)" | ||
echo "ℹ️ The default behavior is 'never'. If you choose 'custom', please refer to the documentation at https://github.com/ar-io/ar-io-node/blob/main/README.md#unbundling" | ||
read -r UNBUNDLE_CHOICE | ||
|
||
case "$UNBUNDLE_CHOICE" in | ||
always) | ||
UNBUNDLE_SETTING='{ "always": true }' | ||
;; | ||
never|"") | ||
UNBUNDLE_SETTING='{ "never": true }' | ||
;; | ||
custom) | ||
print_question "Please enter your custom configuration for unbundling:" | ||
read -r CUSTOM_UNBUNDLE_SETTING | ||
UNBUNDLE_SETTING="$CUSTOM_UNBUNDLE_SETTING" | ||
;; | ||
*) | ||
print_error "Invalid option selected. Defaulting to 'never'." | ||
UNBUNDLE_SETTING='{ "never": true }' | ||
;; | ||
esac | ||
|
||
# Set the ANS104_UNBUNDLE_FILTER in .env | ||
update_or_add_env_var "ANS104_UNBUNDLE_FILTER" "$UNBUNDLE_SETTING" | ||
|
||
# If unbundling is allowed, ask about indexing data items from bundles | ||
if [ "$UNBUNDLE_CHOICE" != "never" ]; then | ||
print_question "Do you want to index data items from the bundles you allowed to be processed? (always/never/custom)" | ||
read -r INDEX_CHOICE | ||
|
||
case "$INDEX_CHOICE" in | ||
always) | ||
INDEX_SETTING='{ "always": true }' | ||
;; | ||
never|"") | ||
INDEX_SETTING='{ "never": true }' | ||
;; | ||
custom) | ||
print_question "Please enter your custom configuration for indexing data items:" | ||
read -r CUSTOM_INDEX_SETTING | ||
INDEX_SETTING="$CUSTOM_INDEX_SETTING" | ||
;; | ||
*) | ||
print_error "Invalid option selected. Defaulting to 'never'." | ||
INDEX_SETTING='{ "never": true }' | ||
;; | ||
esac | ||
|
||
# Set the ANS104_INDEX_FILTER in .env | ||
update_or_add_env_var "ANS104_INDEX_FILTER" "$INDEX_SETTING" | ||
else | ||
print_message "Indexing of data items from bundles will be disabled by default." | ||
fi | ||
|
||
# Final Step: Start the Node | ||
echo "" | ||
print_message "Starting your AR.IO node services with Docker Compose... ⏳" | ||
echo "" | ||
docker compose up -d | ||
echo "" | ||
|
||
if [ $? -eq 0 ]; then | ||
print_success "Your AR.IO node services are now running in the background! 🎉" | ||
else | ||
print_error "There was an issue starting your AR.IO node services. Please check the output above for details." | ||
exit 1 | ||
fi | ||
|
||
echo "" | ||
echo "" | ||
print_message "You're now ready to rock! 🚀 Your AR.IO node is set up and running." | ||
|
||
print_message "To manage your services, you can use the following Docker Compose commands:" | ||
echo "➡️ Use 'docker compose up' to start the services in the foreground." | ||
echo "➡️ Use 'docker compose down' to stop the services." | ||
|
||
echo "" | ||
print_message "We highly recommend that you read the documentation for more detailed configurations and to make the most out of your node:" | ||
print_message "AR.IO Node Repository: https://github.com/ar-io/ar-io-node" | ||
print_message "AR.IO Node Overview Docs: https://docs.ar.io/gateways/ar-io-node/overview/" | ||
|
||
echo "" | ||
print_success "Congratulations for setting up your AR.IO node! Happy syncing! 🎉" |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix the use of
$?
to ensure it refers to the intended command.The current use of
$?
may not refer to the intended command due to intervening commands. Assign the result ofdocker compose up -d
to a variable to avoid this issue.Committable suggestion
Tools
Shellcheck