Zen
3 years ago
6 changed files with 470 additions and 0 deletions
@ -0,0 +1,392 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# Script for installing a simple Flask server and deploying it |
||||||
|
# Bare Metal Alchemist, 2022 |
||||||
|
|
||||||
|
source ingredients/lead |
||||||
|
source ingredients/iron |
||||||
|
source ingredients/copper |
||||||
|
|
||||||
|
clear |
||||||
|
say "${BLUE}" |
||||||
|
say " ${AAAAAAAAAAAA} &&&&&&&&&&& " |
||||||
|
say " ${AAAAAAAAAAAA} &@ && " |
||||||
|
say " ${AAAAAAAAAAAA} &@ && " |
||||||
|
say " ${AAAAAAAAAAAA} &@ && " |
||||||
|
say "${RESET} 8888888888 888 888 ${BLUE} /&& @& " |
||||||
|
say "${RESET} 8888888888 888 888 ${BLUE} @&# &&&&&, " |
||||||
|
say "${RESET} 888 888 888 ${BLUE} #&. /&/ " |
||||||
|
say "${RESET} 888 888 888 ${BLUE} && *&@ " |
||||||
|
say "${RESET} 8888888 888 8888b. .d8888b 888 888${BLUE} && &&&&&@ " |
||||||
|
say "${RESET} 888 888 '88b 88K 888 .88P${BLUE} && && " |
||||||
|
say "${RESET} 888 888 .d888888 'Y8888b. 888888K ${BLUE} &@ && " |
||||||
|
say "${RESET} 888 888 888 888 X88 888 '88b${BLUE} && .&@ " |
||||||
|
say "${RESET} 888 888 'Y888888 88888P' 888 888${BLUE} (&&&&&&&&&&&&&&&&&&&&&. " |
||||||
|
say "${RESET}" |
||||||
|
|
||||||
|
# ------------------- Step 1 - Baseline Setup ------------------- |
||||||
|
|
||||||
|
say "${BOLD}Hi again!${RESET} Looks like you want to get ${BLUE}Flask${RESET} up and running." |
||||||
|
say "Well, as an alchemy-themed toolkit, I must say: ${GREEN}good decision :)${RESET}" |
||||||
|
say "" |
||||||
|
|
||||||
|
# Make sure this script isn't being run with sudo in front |
||||||
|
if [ "$EUID" -eq 0 ]; then |
||||||
|
say "${RED}${BOLD}Woah there!${RESET} Seems you're running this script as a superuser." |
||||||
|
say "" |
||||||
|
say "That might cause some issues with permissions and whatnot. Run this script as your default user (without sudo) and I'll ask you when I need superuser permissions" |
||||||
|
say "" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
say "${ULINE}Making sure we've got the basics...${RESET}" |
||||||
|
echo -e "(you'll probably need to input ${BLUE}your 'sudo' password${RESET} here)" |
||||||
|
case $DISTRO in |
||||||
|
"debian") |
||||||
|
say "HEY I HAVEN'T TESTED THIS BY THE WAY" |
||||||
|
install_if_needed python python-pip |
||||||
|
pip install --upgrade pip |
||||||
|
;; |
||||||
|
"arch") |
||||||
|
install_if_needed python python-pip |
||||||
|
pip install --upgrade pip |
||||||
|
;; |
||||||
|
"mac") |
||||||
|
say "HEY I HAVEN'T TESTED THIS BY THE WAY" |
||||||
|
install_if_needed python python-pip |
||||||
|
pip install --upgrade pip |
||||||
|
;; |
||||||
|
"fedora") |
||||||
|
say "HEY I HAVEN'T TESTED THIS BY THE WAY" |
||||||
|
install_if_needed python python-pip |
||||||
|
pip install --upgrade pip |
||||||
|
;; |
||||||
|
esac |
||||||
|
echo "" |
||||||
|
|
||||||
|
while [ ! -d "$FLASK_DIR" ]; do |
||||||
|
ask_for FLASK_DIR "Please enter the path you would like to install \ |
||||||
|
Flask to (or enter nothing for ${BLUE}~/flask${RESET}): " |
||||||
|
if [ -z "$FLASK_DIR" ]; then |
||||||
|
remember "FLASK_DIR=$HOME/flask" |
||||||
|
fi |
||||||
|
say "" |
||||||
|
ask_for CONFIRM "Okay, should we install to \ |
||||||
|
${BLUE}${FLASK_DIR}${RESET}? ${BLUE}(y/n)${RESET} " |
||||||
|
|
||||||
|
case $CONFIRM in |
||||||
|
"Y" | "y") |
||||||
|
mkdir -p $FLASK_DIR |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
# ------------------- Step 2 - Create venv ------------------- |
||||||
|
|
||||||
|
if [ -d "$FLASK_VENV" ]; then |
||||||
|
say "We already have a virtualenv folder for Flask here: ${BLUE}$FLASK_VENV${RESET}" |
||||||
|
else |
||||||
|
say "Creating virtual environment for Flask" |
||||||
|
python -m venv $FLASK_DIR/venv |
||||||
|
remember FLASK_VENV=$FLASK_DIR/venv |
||||||
|
fi |
||||||
|
|
||||||
|
if [ "$VIRTUAL_ENV" != "$FLASK_VENV" ]; then |
||||||
|
say "Sourcing the virtual environment" |
||||||
|
source ${FLASK_VENV}/bin/activate |
||||||
|
fi |
||||||
|
|
||||||
|
say "Making sure we've got all the python packages we need!" |
||||||
|
pip install -r resources/flask/requirements.txt |
||||||
|
say "" |
||||||
|
|
||||||
|
# ------------------- Step 3 - Build Flask ------------------- |
||||||
|
|
||||||
|
say "${BOLD}We've got everything!${RESET} I'm going to set you up with \ |
||||||
|
a basic Flask page now" |
||||||
|
|
||||||
|
mkdir -p ${FLASK_DIR}/{templates,static} |
||||||
|
cp resources/flask/app.py ${FLASK_DIR} |
||||||
|
cp resources/flask/demo.css ${FLASK_DIR}/static |
||||||
|
cp resources/flask/demo.html ${FLASK_DIR}/templates |
||||||
|
|
||||||
|
cd ${FLASK_DIR} |
||||||
|
flask run |
||||||
|
|
||||||
|
exit 0 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! -z $AO ]; then |
||||||
|
echo "You're currently using ao-$AO" |
||||||
|
echo -en "Would you like to re-install? ${BLUE}(y/n): ${RESET}" |
||||||
|
read reinstall_ao |
||||||
|
echo "" |
||||||
|
case $reinstall_ao in |
||||||
|
"Y" | "y") |
||||||
|
forget AO |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Okay, we'll keep using this version of AO" |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -z $AO ]; then |
||||||
|
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)" |
||||||
|
fi |
||||||
|
|
||||||
|
while [[ -z $AO ]]; do |
||||||
|
echo -en "${BLUE}(number):${RESET} " |
||||||
|
read -n1 ao_select |
||||||
|
echo "" |
||||||
|
echo "" |
||||||
|
|
||||||
|
case $ao_select in |
||||||
|
"1") |
||||||
|
echo -e "Minimalism, I like it! Proceeding with ${BLUE}ao-3${RESET} installation" |
||||||
|
AO=3 |
||||||
|
;; |
||||||
|
"2") |
||||||
|
echo -e "It's got community! Proceeding with ${BLUE}ao-react${RESET} installation" |
||||||
|
AO=react |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "that aint no AO i ever heard of, try again" |
||||||
|
;; |
||||||
|
esac |
||||||
|
done; |
||||||
|
remember "AO=${AO}" |
||||||
|
|
||||||
|
echo "" |
||||||
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
||||||
|
if [ -z $NVM_DIR ]; then |
||||||
|
install_nvm |
||||||
|
source ingredients/iron |
||||||
|
else |
||||||
|
echo -e "${BLUE}Node${RESET} already installed!" |
||||||
|
fi |
||||||
|
|
||||||
|
echo -e "Setting Node to ${BLUE}v16.13.0${RESET} for compatibility" |
||||||
|
set_node_to v16.13.0 |
||||||
|
echo "" |
||||||
|
echo -e "${GREEN}Done!${RESET}" |
||||||
|
echo "" |
||||||
|
fi |
||||||
|
|
||||||
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
||||||
|
echo -e "${BOLD}Installing Bitcoin Ecosystem${RESET}" |
||||||
|
echo "" |
||||||
|
|
||||||
|
if ! check_for bitcoind; then |
||||||
|
echo -e "Building bitcoind from source... might take a while!" |
||||||
|
install_bitcoin |
||||||
|
fi |
||||||
|
|
||||||
|
if ! check_for lightningd; then |
||||||
|
echo -e "Building lightningd from source... here we go again" |
||||||
|
install_lightning |
||||||
|
fi |
||||||
|
|
||||||
|
configure_bitcoin |
||||||
|
configure_lightning |
||||||
|
fi |
||||||
|
echo '' |
||||||
|
|
||||||
|
if [ $AO = "3" ] || [ $AO = 'react' ]; then |
||||||
|
echo -e "${BOLD}Installing and configuring Tor${RESET}\n" |
||||||
|
install_if_needed tor |
||||||
|
configure_tor |
||||||
|
echo "" |
||||||
|
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 |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 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") |
||||||
|
if [ ! -d ~/ao-3 ]; then |
||||||
|
echo -e "Installing ${BLUE}ao-3${RESET}" |
||||||
|
git clone 'https://github.com/AutonomousOrganization/ao-3.git' ~/ao-3 |
||||||
|
fi |
||||||
|
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 |
||||||
|
|
||||||
|
NODE_PARAMS='' |
||||||
|
;; |
||||||
|
"react") |
||||||
|
echo -e "Installing ${BLUE}ao-react${RESET}" |
||||||
|
if [ ! -d ~/ao-react ]; then |
||||||
|
git clone 'https://github.com/coalition-of-invisible-colleges/ao-react.git' ~/ao-react |
||||||
|
fi |
||||||
|
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 |
||||||
|
|
||||||
|
NODE_PARAMS='--experimental-specifier-resolution=node -r dotenv/config' |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# ------------------- Step 4 - NGINX Setup ------------------- |
||||||
|
|
||||||
|
echo "" |
||||||
|
echo -en "You still there? I might need your input here! \n\n${BLUE}(enter)${RESET}" |
||||||
|
read |
||||||
|
|
||||||
|
initialize_nginx |
||||||
|
make_site ao "FILE_ROOT=${HOME}/ao-${AO}/dist" |
||||||
|
echo "" |
||||||
|
configure_domain_for_site ao |
||||||
|
enable_ssl |
||||||
|
|
||||||
|
echo -e "Excellent! We've configured this computer to serve your AO from ${BLUE}${ACCESS_POINT}${RESET}" |
||||||
|
|
||||||
|
# ------------------- 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 |
||||||
|
|
||||||
|
build_service_from_template tor "TORRCPATH=$TORRCPATH" "TORPATH=`which tor`" |
||||||
|
|
||||||
|
# Creating the .tor directory |
||||||
|
sudo mkdir -p $HOME/.tor |
||||||
|
sudo chown tor $HOME/.tor |
||||||
|
sudo chgrp $USER $HOME/.tor |
||||||
|
sudo chmod 770 $HOME/.tor |
||||||
|
|
||||||
|
activate_service tor |
||||||
|
|
||||||
|
echo "" |
||||||
|
build_service_from_template bitcoin "BITCOIND=`which bitcoind`" |
||||||
|
activate_service bitcoin |
||||||
|
|
||||||
|
echo "" |
||||||
|
build_service_from_template lightning "LIGHTNINGD=`which lightningd`" |
||||||
|
activate_service lightning |
||||||
|
|
||||||
|
echo "" |
||||||
|
build_service_from_template ao "NODE=`which node`" "AO=$AO" "NODE_PARAMS=$NODE_PARAMS" |
||||||
|
activate_service ao |
||||||
|
|
||||||
|
echo "this should be nginx" |
||||||
|
activate_service nginx |
||||||
|
|
||||||
|
# ------------------- Step 8 - Port Testing ------------------- |
||||||
|
|
||||||
|
echo "" |
||||||
|
echo -e "${BOLD}One more thing!${RESET} We need to make sure that your ports are open." |
||||||
|
echo "" |
||||||
|
check_ports |
||||||
|
|
||||||
|
# ------------------- 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 |
@ -0,0 +1,10 @@ |
|||||||
|
from flask import Flask, render_template |
||||||
|
import os |
||||||
|
|
||||||
|
app = Flask(__name__) |
||||||
|
|
||||||
|
@app.route("/") |
||||||
|
@app.route("/<name>") |
||||||
|
def demo(name=None): |
||||||
|
wd = os.popen('pwd').readline() |
||||||
|
return render_template('demo.html', name=name, wd=wd) |
@ -0,0 +1,12 @@ |
|||||||
|
html { |
||||||
|
font-family: sans-serif; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
margin: 40px auto; |
||||||
|
max-width: 650px; |
||||||
|
line-height: 1.6; |
||||||
|
font-size: 18px; |
||||||
|
color: #444; |
||||||
|
padding: 0 10px; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang=""> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<title>Flask Boilerplate</title> |
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='demo.css') }}"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<header>This server is running via the <tt>flask_demo.py</tt> |
||||||
|
file in <tt>{{ wd }}</tt></header> |
||||||
|
<main> |
||||||
|
{% if name %} |
||||||
|
<h1>Hello, {{ name }}!</h1> |
||||||
|
<p>You provided me a name through the URL of this webpage.</p> |
||||||
|
<p>Flask parsed it and passed it as a parameter to the |
||||||
|
<tt>render_template</tt> function in <tt>flask_demo.py</tt>, |
||||||
|
which is located in the directory where you installed Flask</p> |
||||||
|
<p>It also imports the css as a file in the <tt>static/</tt> |
||||||
|
directory. This is the standard used for images etc.</p> |
||||||
|
<hr/> |
||||||
|
<p>There's plenty to learn about Flask! Hopefully this gives you |
||||||
|
some of the information you need to dive deeper</p> |
||||||
|
{% else %} |
||||||
|
<h1>Hello!</h1> |
||||||
|
<p>This is a page served up by Flask. Try adding a / followed by |
||||||
|
your first name in the URL, or click <a href="/beautiful%20human">here</a> |
||||||
|
for a demonstration of URL parsing.</p> |
||||||
|
{% endif %} |
||||||
|
</main> |
||||||
|
<footer><small>courtesy of Bare Metal Alchemist, March 2022</small></footer> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,7 @@ |
|||||||
|
click==8.0.4 |
||||||
|
Flask==2.0.3 |
||||||
|
gunicorn==20.1.0 |
||||||
|
itsdangerous==2.1.0 |
||||||
|
Jinja2==3.0.3 |
||||||
|
MarkupSafe==2.1.0 |
||||||
|
Werkzeug==2.0.3 |
@ -0,0 +1,17 @@ |
|||||||
|
server { |
||||||
|
listen 5000 default_server; |
||||||
|
listen [::]:5000 default_server; |
||||||
|
|
||||||
|
server_name _; |
||||||
|
root FILE_ROOT; |
||||||
|
index index.html; |
||||||
|
|
||||||
|
location = /favicon.ico { |
||||||
|
log_not_found off; |
||||||
|
access_log off; |
||||||
|
} |
||||||
|
|
||||||
|
location / { |
||||||
|
proxy_pass http://localhost:5000; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue