Create install.sh
Description: This update introduces install.sh, a robust installation script designed to streamline the setup of the Seedbox. The script automates the installation of essential dependencies and guides the user through a series of interactive prompts to collect necessary configuration details. Key Features: Automated Dependency Installation: install.sh takes care of installing all the required dependencies such as Docker, Docker Compose, and yq, ensuring a smooth setup process. Interactive User Prompts: The script interactively gathers essential configuration details from the user, including domain, email, timezone, and credentials, making the setup tailored and user-friendly. Environment Configuration: Based on the user’s input, the script dynamically generates the .env file, automating the environment configuration process. User and Directory Management: The script adds the current user to the Docker group, advises re-login for changes to take effect, and manages the creation of necessary directories. Script Execution: As part of the setup, install.sh seamlessly executes additional scripts (init.sh and run-seedbox.sh) from the project. Validation and Error Handling: Incorporates validation for user inputs, provides options for viewing valid timezones, and includes error handling with descriptive messages for troubleshooting.
This commit is contained in:
		
							parent
							
								
									3bb3662b14
								
							
						
					
					
						commit
						ee4db2273f
					
				|  | @ -0,0 +1,194 @@ | |||
| #!/bin/bash | ||||
| # Prompt the user for custom fields | ||||
| 
 | ||||
| read -p "Enter your domain for Traefik: " TRAEFIK_DOMAIN | ||||
| read -p "Enter your email for ACME: " ACME_MAIL | ||||
| 
 | ||||
| # Get the list of valid timezones | ||||
| valid_timezones=$(timedatectl list-timezones) | ||||
| 
 | ||||
| # Prompt the user to enter the timezone | ||||
| read -p "Enter your timezone (e.g. America/Denver): " TZ | ||||
| 
 | ||||
| # Check if the entered timezone is valid | ||||
| while ! echo "$valid_timezones" | grep -q "^$TZ$"; do | ||||
|     echo "Invalid timezone entered." | ||||
|     read -p "Would you like to view the list of valid timezones? (yes/no): " view_list | ||||
|     if [ "$view_list" == "yes" ]; then | ||||
|         echo -e "\n$valid_timezones\n" | ||||
|     fi | ||||
|     read -p "Please enter a valid timezone: " TZ | ||||
| done | ||||
| 
 | ||||
| read -p "Enter HTTP username: " HTTP_USER | ||||
| echo "Note: Password input will be hidden for security reasons." | ||||
| read -s -p "Enter HTTP password: " HTTP_PASSWORD | ||||
| echo | ||||
| 
 | ||||
| # Ask user if they want to set unique passwords for each service | ||||
| read -p "Would you like to set unique passwords for each service? (yes/no): " unique_passwords | ||||
| echo | ||||
| 
 | ||||
| if [ "$unique_passwords" == "yes" ]; then | ||||
|     read -s -p "Enter MySQL root password: " MYSQL_ROOT_PASSWORD | ||||
|     echo | ||||
|     read -p "Enter MySQL database name (e.g. nextcloud): " MYSQL_DATABASE | ||||
|     read -p "Enter MySQL user: " MYSQL_USER | ||||
|     read -s -p "Enter MySQL password: " MYSQL_PASSWORD | ||||
|     echo | ||||
|     read -p "Enter Nextcloud admin user: " NEXTCLOUD_ADMIN_USER | ||||
|     read -s -p "Enter Nextcloud admin password: " NEXTCLOUD_ADMIN_PASSWORD | ||||
|     echo | ||||
|     read -s -p "Enter Portainer admin password: " PORTAINER_ADMIN_PASSWORD | ||||
|     echo | ||||
|     read -s -p "Enter Flood password for Deluge RPC daemon: " FLOOD_PASSWORD | ||||
|     echo | ||||
|     read -s -p "Enter Calibre password: " CALIBRE_PASSWORD | ||||
|     echo | ||||
| 
 | ||||
| else | ||||
|     read -s -p "Enter a common password for all services: " common_password | ||||
|     echo | ||||
|     MYSQL_ROOT_PASSWORD=$common_password | ||||
|     MYSQL_DATABASE="nextcloud" | ||||
|     MYSQL_USER="nextcloud" | ||||
|     MYSQL_PASSWORD=$common_password | ||||
|     NEXTCLOUD_ADMIN_USER="admin" | ||||
|     NEXTCLOUD_ADMIN_PASSWORD=$common_password | ||||
|     PORTAINER_ADMIN_PASSWORD=$common_password | ||||
|     FLOOD_PASSWORD=$common_password | ||||
|     CALIBRE_PASSWORD=$common_password | ||||
| fi | ||||
| 
 | ||||
| # Warning for WireGuard setup | ||||
| echo "Warning: If you would like to set up WireGuard, please ensure you have your private and public keys available." | ||||
| 
 | ||||
| read -p "Enter WireGuard endpoint: " WIREGUARD_ENDPOINT | ||||
| read -p "Enter WireGuard port: " WIREGUARD_PORT | ||||
| read -p "Enter WireGuard public key: " WIREGUARD_PUBLIC_KEY | ||||
| read -s -p "Enter WireGuard private key: " WIREGUARD_PRIVATE_KEY | ||||
| echo | ||||
| 
 | ||||
| # Define the content of the .env file using the user's input | ||||
| env_content=" | ||||
| CHECK_FOR_OUTDATED_CONFIG=true | ||||
| DOCKER_COMPOSE_BINARY=\"docker compose\" | ||||
| TRAEFIK_DOMAIN=${TRAEFIK_DOMAIN} | ||||
| ACME_MAIL=${ACME_MAIL} | ||||
| TZ=\"${TZ}\" | ||||
| HTTP_USER=${HTTP_USER} | ||||
| HTTP_PASSWORD='${HTTP_PASSWORD}' | ||||
| HOST_CONFIG_PATH=\"/data/config\" | ||||
| HOST_MEDIA_PATH=\"/data/torrents\" | ||||
| DOWNLOAD_SUBFOLDER=\"deluge\" | ||||
| PGID=1000 | ||||
| PUID=1000 | ||||
| MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} | ||||
| MYSQL_DATABASE=${MYSQL_DATABASE} | ||||
| MYSQL_USER=${MYSQL_USER} | ||||
| MYSQL_PASSWORD=${MYSQL_PASSWORD} | ||||
| NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER} | ||||
| NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD} | ||||
| PORTAINER_ADMIN_PASSWORD=${PORTAINER_ADMIN_PASSWORD} | ||||
| FLOOD_PASSWORD=${FLOOD_PASSWORD} | ||||
| FLOOD_AUTOCREATE_USER_IN_DELUGE_DAEMON=false | ||||
| CALIBRE_PASSWORD=${CALIBRE_PASSWORD} | ||||
| WIREGUARD_ENDPOINT=${WIREGUARD_ENDPOINT} | ||||
| WIREGUARD_PORT=${WIREGUARD_PORT} | ||||
| WIREGUARD_PUBLIC_KEY=${WIREGUARD_PUBLIC_KEY} | ||||
| WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY} | ||||
| WIREGUARD_ADDRESS=10.0.0.1/24 | ||||
| " | ||||
| 
 | ||||
| # Write the content to the .env file in the current directory | ||||
| echo "$env_content" > .env | ||||
| 
 | ||||
| # Output a message indicating that the .env file has been created | ||||
| echo "The .env file has been created with the specified content." | ||||
| 
 | ||||
| # Update the package list and install dependencies | ||||
| sudo apt update | ||||
| sudo apt install -y curl jq apt-transport-https ca-certificates curl software-properties-common | ||||
| 
 | ||||
| # Install Docker | ||||
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - | ||||
| sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | ||||
| sudo apt update | ||||
| sudo apt install -y docker-ce docker-ce-cli containerd.io | ||||
| 
 | ||||
| # Add current user to docker group | ||||
| sudo usermod -aG docker $USER | ||||
| echo "User added to docker group. Please log out and log back in for the changes to take effect." | ||||
| 
 | ||||
| # Install Docker Compose | ||||
| COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r '.tag_name') | ||||
| if [ -z "$COMPOSE_VERSION" ]; then | ||||
|     echo "Failed to get the latest Docker Compose version. Exiting." | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| COMPOSE_URL="https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" | ||||
| echo "Downloading Docker Compose from $COMPOSE_URL" | ||||
| 
 | ||||
| # Download Docker Compose binary and make it executable | ||||
| sudo curl -L "$COMPOSE_URL" -o /usr/local/bin/docker-compose | ||||
| if [ $? -ne 0 ]; then | ||||
|     echo "Failed to download Docker Compose. Exiting." | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # Print debug information about the downloaded file | ||||
| echo "Debug Information:" | ||||
| ls -l /usr/local/bin/docker-compose | ||||
| file /usr/local/bin/docker-compose | ||||
| 
 | ||||
| # Check if the downloaded file has a non-zero size | ||||
| if [ ! -s /usr/local/bin/docker-compose ]; then | ||||
|     echo "The downloaded file is empty. Exiting." | ||||
|     sudo rm /usr/local/bin/docker-compose | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # Check if the downloaded file is a binary | ||||
| if ! file /usr/local/bin/docker-compose | grep -q "executable"; then | ||||
|     echo "The downloaded file is not a valid binary. Exiting." | ||||
|     sudo rm /usr/local/bin/docker-compose | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| sudo chmod +x /usr/local/bin/docker-compose | ||||
| if [ $? -ne 0 ]; then | ||||
|     echo "Failed to make Docker Compose executable. Exiting." | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # Verify the installation | ||||
| docker-compose --version | ||||
| if [ $? -ne 0 ]; then | ||||
|     echo "Docker Compose is not correctly installed. Exiting." | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # Install yq using the latest version URL | ||||
| sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq | ||||
| 
 | ||||
| # Download and run the local-persist installation script | ||||
| LOCAL_PERSIST_INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/MatchbookLab/local-persist/v1.3.0/scripts/install.sh" | ||||
| curl -fsSL "$LOCAL_PERSIST_INSTALL_SCRIPT_URL" -o local-persist-install.sh | ||||
| chmod +x local-persist-install.sh | ||||
| sudo ./local-persist-install.sh | ||||
| 
 | ||||
| # Remove the installation script after running it | ||||
| rm local-persist-install.sh | ||||
| 
 | ||||
| # Create necessary directories | ||||
| sudo mkdir -p /data/config /data/torrents | ||||
| 
 | ||||
| # Get the absolute path to the seedbox directory | ||||
| SEEDBOX_DIR=$(pwd) | ||||
| 
 | ||||
| # Run init.sh from the current directory with sudo | ||||
| sudo bash init.sh | ||||
| 
 | ||||
| # Make run-seedbox.sh executable and run it | ||||
| sudo bash run-seedbox.sh | ||||
		Loading…
	
		Reference in New Issue