You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
524 lines
17 KiB
524 lines
17 KiB
#!/bin/bash |
|
|
|
# Script for installing the base dependencies of AO and getting it running |
|
# Bare Metal Alchemist, 2022 |
|
|
|
source scripts/ingredients |
|
|
|
clear |
|
echo '' |
|
echo ' d8888 .d88888b. 8888888 888 888 888 ' |
|
echo ' d88888 d88P" "Y88b 888 888 888 888 ' |
|
echo ' d88P888 888 888 888 888 888 888 ' |
|
echo ' d88P 888 888 888 888 88888b. .d8888b 888888 8888b. 888 888 .d88b. 888d888 ' |
|
echo ' d88P 888 888 888 888 888 "88b 88K 888 "88b 888 888 d8P Y8b 888P" ' |
|
echo ' d88P 888 888 888 888 888 888 "Y8888b. 888 .d888888 888 888 88888888 888 ' |
|
echo ' d8888888888 Y88b. .d88P 888 888 888 X88 Y88b. 888 888 888 888 Y8b. 888 ' |
|
echo 'd88P 888 "Y88888P" 8888888 888 888 88888P" "Y888 "Y888888 888 888 "Y8888 888 ' |
|
echo '' |
|
|
|
|
|
# ------------------- Step 1 - Baseline Setup ------------------- |
|
|
|
echo -e "${BOLD}Hiya!${RESET} We're going to get you set up with your very own Autonomous Engine." |
|
echo "" |
|
echo -e "This script is designed to ask you just enough questions to keep you involved in the process,\nwhile making it as easy as possible for you to get it going. \n\n${BLUE}press enter to continue${RESET}" |
|
read |
|
|
|
echo -e "Making sure we've got the basics..." |
|
echo -e "(you'll probably need to input ${BLUE}your 'sudo' password${RESET} here)" |
|
case $DISTRO in |
|
"debian") |
|
# Note -- I'm not sure if these are all needed but I'm not in the mood to check |
|
install_if_needed git wget sqlite3 zlib1g-dev libtool-bin autoconf autoconf-archive automake autotools-dev \ |
|
libgmp-dev libsqlite3-dev python python3 python3-mako libsodium-dev build-essential pkg-config libev-dev \ |
|
libcurl4-gnutls-dev libssl-dev fakeroot devscripts |
|
;; |
|
"arch") |
|
if [[ ! $(pacman -Qg base-devel) ]]; then |
|
sudo pacman -S base-devel --noconfirm |
|
fi |
|
|
|
install_if_needed wget python gmp sqlite3 \ |
|
python-mako python-pip net-tools zlib libsodium gettext dnsutils nginx |
|
;; |
|
"mac") |
|
# install_if_needed better-computer |
|
;; |
|
"fedora") |
|
install_if_needed git wget tor sqlite3 autoconf autoconf-archive automake \ |
|
python python3 python3-mako pkg-config fakeroot devscripts |
|
;; |
|
esac |
|
echo "" |
|
# |
|
## ------------------- Step 2 - AO Environment Setup ------------------- |
|
# |
|
AO='' |
|
echo -e "${BOLD}Hey!${RESET} I was wondering which ${BLUE}version of AO${RESET} you wanted to install. \n" |
|
echo -e "${BOLD}1.${RESET} ao-3 (Vue)" |
|
echo -e "${BOLD}2.${RESET} ao-react (React)" |
|
while [[ -z $AO ]]; do |
|
echo -en "${BLUE}(number):${RESET} " |
|
read -n1 ao_select |
|
echo "" |
|
echo "" |
|
|
|
case $ao_select in |
|
"1") |
|
echo "Minimalism, I like it! Proceeding with ao-3 installation" |
|
AO=3 |
|
;; |
|
"2") |
|
echo "It's got community! Proceeding with ao-react installation" |
|
AO=react |
|
;; |
|
*) |
|
echo "that aint no AO i ever heard of, try again" |
|
;; |
|
esac |
|
done; |
|
echo "" |
|
|
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
|
echo -e "${BOLD}Installing Node.js${RESET}" |
|
chmod +x scripts/nvm_install.sh |
|
scripts/nvm_install.sh |
|
|
|
export NVM_DIR="$HOME/.nvm" |
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm |
|
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion |
|
|
|
if [ "$SHELL" = '/bin/zsh' ]; then |
|
echo 'sourcing zshrc' |
|
source ~/.zshrc |
|
else |
|
source ~/.bashrc |
|
fi |
|
nvm install v16.13.0 |
|
nvm alias default v16.13.0 |
|
nvm use default |
|
fi |
|
|
|
|
|
# Note, it would be a good idea to compile Bitcoin from C to make it resistant to changes in architecture (should work for any ISA) |
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
|
echo -e "${BOLD}Installing Bitcoin Ecosystem${RESET}" |
|
|
|
if [ $ISA == 'x86_64' ] && [ ! -e images/bitcoin-22.0* ]; then |
|
wget https://bitcoincore.org/bin/bitcoin-core-22.0/bitcoin-22.0-x86_64-linux-gnu.tar.gz -P images/ |
|
elif [ $ISA == 'armv7l' ] && [ ! -e images/bitcoin-22.0* ]; then |
|
wget https://bitcoincore.org/bin/bitcoin-core-22.0/bitcoin-22.0-arm-linux-gnueabihf.tar.gz -P images/ |
|
fi |
|
|
|
tar -xvf images/bitcoin-22.0*.tar.gz |
|
sleep 1 |
|
|
|
sudo cp bitcoin-22.0/bin/* /usr/local/bin/ |
|
rm -rf bitcoin-22.0 |
|
|
|
|
|
echo -e "${BOLD}Installing lightningd${RESET}" |
|
git clone https://github.com/ElementsProject/lightning.git ~/lightning |
|
pushd ~/lightning |
|
git checkout v0.10.2 |
|
./configure |
|
|
|
# The latest version of mistune breaks lightning install |
|
pip uninstall mistune |
|
pip install --user mistune==0.8.4 |
|
pip install --user mrkd |
|
sudo make |
|
sudo make install |
|
popd |
|
|
|
# TODO fix clboss |
|
# echo 'Installing clboss' |
|
# git clone https://github.com/ZmnSCPxj/clboss.git ~/clboss |
|
# pushd ~/clboss |
|
# git checkout 0.11B |
|
# mkdir m4 |
|
# autoreconf -i |
|
# ./configure |
|
# make |
|
# sudo make install |
|
# popd |
|
|
|
echo "" |
|
echo -e "${BOLD}Bitcoin installed!${RESET} Let's make sure it's configured now." |
|
mkdir -p ~/.bitcoin |
|
|
|
AUTHDEETS=$(python3 scripts/rpcauth.py ao) |
|
AUTHLINE=$(echo $AUTHDEETS | grep -o rpcauth=ao:[^[:space:]]*[[:space:]]) |
|
PASSLINE=$(echo $AUTHDEETS | grep -o [^[:space:]]*\$) |
|
|
|
if [ -f $HOME/.bitcoin/bitcoin.conf ]; then |
|
echo 'bitcoin config exists' |
|
else |
|
cp resources/sample_bitcoin.conf $HOME/.bitcoin/bitcoin.conf |
|
echo 'created default bitcoin config' |
|
fi |
|
|
|
sed -i "s/BTC_LOGIN/${AUTHLINE}/" $HOME/.bitcoin/bitcoin.conf |
|
|
|
read -p "Quick question - do you have 500GB of open memory on this device? (y/n): " prune |
|
echo "" |
|
case $prune in |
|
y | Y) |
|
echo "Okay great! We'll leave the bitcoin config it as it is." |
|
;; |
|
*) |
|
echo "Let's cut it down to only store the last few blocks (It's only 550 MB!)" |
|
sed -i "s/txindex=1/prune=550/" $HOME/.bitcoin/bitcoin.conf |
|
;; |
|
esac |
|
|
|
echo "" |
|
|
|
mkdir -p $HOME/.lightning |
|
|
|
if [ -f $HOME/.lightning/config ]; then |
|
echo 'lightning config exists' |
|
else |
|
cp resources/sample_lightning_config $HOME/.lightning/config |
|
echo 'created default lightning config' |
|
fi |
|
fi |
|
echo '' |
|
|
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
|
echo -e "${BOLD}Installing and configuring Tor${RESET}\n" |
|
install_if_needed tor |
|
|
|
if [ -e /usr/local/etc/tor/torrc ]; then |
|
TORRCPATH='/usr/local/etc/tor/torrc' |
|
elif [ -e /etc/tor/torrc ]; then |
|
TORRCPATH='/etc/tor/torrc' |
|
fi |
|
|
|
# Configure and write torrc file |
|
cp resources/torrc-template . |
|
sudo sed -i "s#USER#${USER}#g" torrc-template |
|
sudo sed -i "s#HOME#${HOME}#g" torrc-template |
|
|
|
if [ -z "$TORRCPATH" ]; then |
|
echo -e "${RED}Uh oh...${RESET} I couldn't figure out where your torrc file is. That might cause some issues" |
|
sleep 3 |
|
echo -e "\nAnyways...\n" |
|
sleep 2 |
|
else |
|
sudo mv torrc-template $TORRCPATH |
|
fi |
|
fi |
|
|
|
# ------------------- Step 3 - AO Installation ------------------- |
|
|
|
echo -e "${BOLD}Configuring AO Core${RESET}\n" |
|
|
|
mkdir -p $HOME/.ao |
|
|
|
if [ -f $HOME/.ao/key ]; then |
|
echo 'We already have a private key for this AO, sweet!' |
|
else |
|
node scripts/createPrivateKey.js >> $HOME/.ao/key |
|
echo -e "Just made a fresh private key and put it in ${GREEN}~/.ao${RESET}" |
|
fi |
|
|
|
# TODO this is really janky/fragile, it would be better to store this in ~/.ao |
|
CONFIG_FILE=$HOME/ao-$AO/configuration.js |
|
|
|
case $AO in |
|
"3") |
|
echo -e "Installing ${BLUE}ao-3${RESET}" |
|
git clone 'https://github.com/AutonomousOrganization/ao-3.git' ~/ao-3 |
|
if [ -f "$CONFIG_FILE" ]; then |
|
echo configuration.js already exists |
|
else |
|
cp resources/ao-config $CONFIG_FILE |
|
sed -i "s#SQLITE_DATABASE#${HOME}/.ao/database.sqlite3#" $CONFIG_FILE |
|
sed -i "s#PASSLINE#${PASSLINE}#" $CONFIG_FILE |
|
sed -i "s#PRIVATEKEY#${HOME}/.ao/key#" $CONFIG_FILE |
|
sed -i "s#CLIGHTNING_DIR#${HOME}/.lightning/bitcoin#" $CONFIG_FILE |
|
sed -i "s#MEMES_DIR#${HOME}/.ao/memes#" $CONFIG_FILE |
|
fi |
|
|
|
echo "" |
|
pushd ~/ao-3 |
|
npm install |
|
npm run build |
|
npm run checkconfig |
|
popd |
|
;; |
|
"react") |
|
echo -e "Installing ${BLUE}ao-react${RESET}" |
|
git clone 'https://github.com/coalition-of-invisible-colleges/ao-react.git' ~/ao-react |
|
if [ -f "$CONFIG_FILE" ]; then |
|
echo configuration.js already exists |
|
else |
|
cp resources/ao-config $CONFIG_FILE |
|
sed -i "s#SQLITE_DATABASE#${HOME}/.ao/database.sqlite3#" $CONFIG_FILE |
|
sed -i "s#PASSLINE#${PASSLINE}#" $CONFIG_FILE |
|
sed -i "s#PRIVATEKEY#${HOME}/.ao/key#" $CONFIG_FILE |
|
sed -i "s#CLIGHTNING_DIR#${HOME}/.lightning/bitcoin#" $CONFIG_FILE |
|
sed -i "s#MEMES_DIR#${HOME}/.ao/memes#" $CONFIG_FILE |
|
fi |
|
|
|
echo "" |
|
|
|
pushd ~/ao-react |
|
npm install |
|
npm run webpack |
|
popd |
|
;; |
|
esac |
|
|
|
# ------------------- Step 4 - NGINX Setup ------------------- |
|
|
|
echo "" |
|
echo -e "You still there? I need to ask you some questions! \n\n${BLUE}(enter)${RESET}" |
|
read |
|
echo "" |
|
read -p "Do you have a domain name pointing to this computer? (y/n): " dns |
|
echo "" |
|
case $dns in |
|
y | Y) |
|
echo "Good to hear! What is it?" |
|
read -p "http://" domain |
|
;; |
|
*) |
|
echo "Okay, let's just leave it open for now." |
|
domain=$(dig @resolver4.opendns.com myip.opendns.com +short) |
|
anywhere=1 |
|
echo "Try accessing this AO from either localhost, 127.0.0.1, or ${domain}" |
|
;; |
|
esac |
|
|
|
if [ "$anywhere" -eq 1 ]; then |
|
ACCESS_POINT=http://localhost |
|
else |
|
ACCESS_POINT=https://$domain |
|
fi |
|
|
|
echo "" |
|
|
|
# Making sure this version of NGINX supports sites-enabled |
|
if [[ -z $(sudo cat /etc/nginx/nginx.conf | grep sites-enabled) ]]; then |
|
sudo mkdir -p /etc/nginx/sites-available |
|
sudo mkdir -p /etc/nginx/sites-enabled |
|
sudo cp resources/base.nginx.conf /etc/nginx/nginx.conf |
|
fi |
|
|
|
sudo mkdir -p /etc/nginx/logs |
|
|
|
AO_NGINX_CONF=/etc/nginx/sites-available/ao |
|
sudo cp resources/ao.nginx.conf $AO_NGINX_CONF |
|
|
|
if [ -n $anywhere ]; then |
|
sudo sed -i "s#SERVER_NAME#_#" $AO_NGINX_CONF |
|
else |
|
sudo sed -i "s#SERVER_NAME#${domain}#" $AO_NGINX_CONF |
|
fi |
|
|
|
sudo sed -i "s#FILE_ROOT#${HOME}/ao-react/dist#" $AO_NGINX_CONF |
|
|
|
if [ ! -e /etc/nginx/sites-enabled/ao ]; then |
|
sudo ln -s /etc/nginx/sites-available/ao /etc/nginx/sites-enabled/ |
|
fi |
|
echo "" |
|
echo "Excellent! We've configured $AO_NGINX_CONF to serve your AO from $domain" |
|
echo "" |
|
|
|
read -p "Would you like to enable SSL via Certbot? (y/n): " -n1 ssl |
|
echo "" |
|
case $ssl in |
|
y | Y) |
|
echo "Alright, let's get Certbot in here!" |
|
install_if_needed python3 certbot python3-certbot-nginx |
|
echo -e "${BOLD}Take it away, Certbot${NC}" |
|
sudo certbot --nginx |
|
;; |
|
*) |
|
echo "Yea, SSL is lame anyways..." |
|
;; |
|
esac |
|
echo "" |
|
|
|
# ------------------- Step 7 - Systemd Setup ------------------- |
|
|
|
READY='' |
|
echo -e "\n${BOLD}Alright, almost there!${RESET} Now we just need to set up the system daemons for Tor, Bitcoin, Lightning, and the AO so that everything opens on startup." |
|
while [[ -z $READY ]]; do |
|
echo -en "${BLUE}You ready? (y/n):${RESET} " |
|
read -n1 ao_select |
|
echo "" |
|
echo "" |
|
|
|
case $ao_select in |
|
"y" | "Y") |
|
echo -e "Nice, let's do it.\n" |
|
READY=1 |
|
;; |
|
*) |
|
echo -e "wrong answer, fren\n" |
|
;; |
|
esac |
|
done |
|
|
|
echo "" |
|
echo "Creating tor.service..." |
|
TOR_SERVICE=/etc/systemd/system/tor.service |
|
if [ -f "$TOR_SERVICE" ]; then |
|
echo "Seems like you've already got tor here!" |
|
else |
|
sudo cp resources/tor-service-template $TOR_SERVICE |
|
|
|
# Making sure all values have been de-templated |
|
sudo sed -i "s#USER#${USER}#g" $TOR_SERVICE |
|
sudo sed -i "s#HOME#${HOME}#g" $TOR_SERVICE |
|
sudo sed -i "s#TORRCPATH#${TORRCPATH}#g" $TOR_SERVICE |
|
sudo sed -i "s#TORPATH#$(which tor)#g" $TOR_SERVICE |
|
fi |
|
|
|
|
|
# Creating the .tor directory |
|
sudo mkdir -p $HOME/.tor |
|
sudo chown tor $HOME/.tor |
|
sudo chgrp $USER $HOME/.tor |
|
sudo chmod 770 $HOME/.tor |
|
|
|
echo "Enabling and starting Tor" |
|
sudo systemctl enable tor |
|
sudo systemctl start tor |
|
|
|
echo "" |
|
echo "Creating bitcoin.service..." |
|
BTC_SERVICE=/etc/systemd/system/bitcoin.service |
|
if [ -f "$BTC_SERVICE" ]; then |
|
echo -e "Seems like you've already have a bitcoin service!" |
|
else |
|
sudo cp resources/bitcoin-service-template $BTC_SERVICE |
|
|
|
# Making sure all values have been de-templated |
|
sudo sed -i "s#USER#${USER}#g" $BTC_SERVICE |
|
sudo sed -i "s#HOME#${HOME}#g" $BTC_SERVICE |
|
sudo sed -i "s#BITCOIND#$(which bitcoind)#g" $BTC_SERVICE |
|
fi |
|
echo -e "Enabling and starting ${GREEN}Bitcoin${RESET}" |
|
sudo systemctl enable bitcoin |
|
sudo systemctl start bitcoin |
|
|
|
echo "" |
|
echo "Creating lightning.service..." |
|
LN_SERVICE=/etc/systemd/system/lightning.service |
|
if [ -f "$LN_SERVICE" ]; then |
|
echo -e "Seems like you've already have a lightning service!" |
|
else |
|
sudo cp resources/lightning-service-template $LN_SERVICE |
|
|
|
# Making sure all values have been de-templated |
|
sudo sed -i "s#USER#${USER}#g" $LN_SERVICE |
|
sudo sed -i "s#HOME#${HOME}#g" $LN_SERVICE |
|
sudo sed -i "s#LIGHTNINGD#$(which lightningd)#g" $LN_SERVICE |
|
fi |
|
echo -e "Enabling and starting ${GREEN}lightning${RESET} " |
|
sudo systemctl enable lightning |
|
sudo systemctl start lightning |
|
|
|
echo "" |
|
echo "Creating ao.service..." |
|
AO_SERVICE=/etc/systemd/system/ao.service |
|
if [ -f "$AO_SERVICE" ]; then |
|
echo "Seems like you've already added one of these!" |
|
else |
|
sudo cp resources/ao-service-template $AO_SERVICE |
|
|
|
# Making sure all values have been de-templated |
|
sudo sed -i "s#USER#${USER}#g" $AO_SERVICE |
|
sudo sed -i "s#HOME#${HOME}#g" $AO_SERVICE |
|
sudo sed -i "s#NODE#$(which node)#g" $AO_SERVICE |
|
fi |
|
echo -e "Enabling and starting the ${GREEN}AO${RESET}'s backend" |
|
sudo systemctl enable ao |
|
sudo systemctl start ao |
|
|
|
echo "" |
|
echo -e "Enabling and starting ${GREEN}NGINX${RESET} as the webserver" |
|
sudo systemctl enable nginx |
|
sudo systemctl start nginx |
|
|
|
# ------------------- Step 8 - Port Testing ------------------- |
|
|
|
echo "" |
|
echo -e "${BOLD}One more thing!${RESET} We need to make sure that your ports are open." |
|
install_if_needed nmap |
|
nmap -Pn $domain > nmap.txt |
|
OPEN=1 |
|
if grep -qE "^80/.*(open|filtered)" nmap.txt; then |
|
echo -e "I can see port ${GREEN}80${RESET}!" |
|
else |
|
echo -e "Uh oh, port ${RED}80${RESET} isn't showing up..." |
|
OPEN=0 |
|
fi |
|
|
|
if grep -qE "^443/.*(open|filtered)" nmap.txt; then |
|
echo -e "I can see port ${GREEN}443${RESET} as well!" |
|
else |
|
echo -e "Uh oh, port ${RED}443${RESET} isn't showing up..." |
|
OPEN=0 |
|
fi |
|
rm nmap.txt |
|
echo "" |
|
if [[ $OPEN -eq 0 ]]; then |
|
echo -e "${RED}Port configuration needed.${RESET} Something (probably your wireless router) is blocking us from serving this page to the rest of the internet." |
|
echo "Port forwarding is relatively simple, but as it stands it is beyond the scope of this script to be able to automate it." |
|
echo -e "You'll probably need to look up the login information for your specific router and forward the red ports to the local IP of this computer (${BOLD}$(ip route | grep default | grep -oP "(?<=src )[^ ]+")${RESET})." |
|
echo -e "You can log into your router at this IP address: ${BOLD}$(route -n | grep ^0.0.0.0 | awk '{print $2}')${RESET}" |
|
echo "That's all the help I can give you regarding port forwarding. Good luck!" |
|
echo "" |
|
fi |
|
|
|
# ------------------- Step 9 - Health Check ------------------- |
|
echo '*********************************************************' |
|
echo -e "* ${BOLD}Version Information${RESET} *" |
|
echo '*********************************************************' |
|
|
|
echo ' ' |
|
echo 'make Version' |
|
echo '*********************************************************' |
|
make --version |
|
|
|
echo ' ' |
|
echo 'node Version' |
|
echo '*********************************************************' |
|
node --version |
|
|
|
echo ' ' |
|
echo 'sqlite3 Version' |
|
echo '*********************************************************' |
|
sqlite3 --version |
|
|
|
echo ' ' |
|
echo 'tor Version' |
|
echo '*********************************************************' |
|
tor --version |
|
|
|
echo ' ' |
|
echo 'bitcoind Version' |
|
echo '*********************************************************' |
|
bitcoind --version |
|
|
|
echo ' ' |
|
echo 'lightningd Version' |
|
echo '*********************************************************' |
|
lightningd --version |
|
|
|
echo ' ' |
|
echo 'clboss Version' |
|
echo '*********************************************************' |
|
clboss --version |
|
echo "" |
|
echo -e "$BOLD\nOkay, well that's everything!${RESET}\n\nAs long as everything worked properly, \ |
|
you should be ready to continue your journey\ntowards autonomy by opening ${BLUE}$ACCESS_POINT${RESET} in your browser." |
|
echo -e "The default login is ${BLUE}dctrl/dctrl${RESET}, have fun!" |
|
|
|
exit 0
|
|
|