2014-07-03 17:10:53 -07:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2014-07-07 08:09:22 -07:00
|
|
|
set -v
|
|
|
|
|
|
|
|
|
|
USER_HOME=/home/yellowtent
|
2014-09-06 13:41:05 -07:00
|
|
|
APPDATA=$USER_HOME/.yellowtent/appdata
|
2014-08-07 10:56:21 -07:00
|
|
|
SRCDIR=$USER_HOME/box
|
2014-07-03 17:10:53 -07:00
|
|
|
USER=yellowtent
|
2014-09-03 08:03:38 -07:00
|
|
|
APPSTORE_URL=$1
|
|
|
|
|
BOX_REVISION=$2
|
2014-07-03 17:10:53 -07:00
|
|
|
|
|
|
|
|
echo "==== Create User $USER ===="
|
|
|
|
|
id $USER
|
|
|
|
|
if [[ $? -ne 0 ]]; then
|
|
|
|
|
rm -rf /home/$USER
|
|
|
|
|
useradd $USER -m
|
|
|
|
|
fi
|
2014-07-03 13:49:17 -07:00
|
|
|
|
2014-07-03 17:10:53 -07:00
|
|
|
# now exit on failure
|
2014-07-03 13:49:17 -07:00
|
|
|
set -e
|
|
|
|
|
|
2014-09-03 08:03:38 -07:00
|
|
|
echo "== Yellowtent base image preparation ($APPSTORE_URL, $BOX_REVISION) =="
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
|
|
2014-10-09 10:59:10 -07:00
|
|
|
echo "=== Setup swap file ==="
|
|
|
|
|
fallocate -l 2048m /2048MiB.swap
|
|
|
|
|
chmod 600 /2048MiB.swap
|
|
|
|
|
mkswap /2048MiB.swap
|
|
|
|
|
swapon /2048MiB.swap
|
|
|
|
|
echo "/2048MiB.swap none swap sw 0 0" >> /etc/fstab
|
|
|
|
|
|
2014-07-03 13:49:17 -07:00
|
|
|
echo "==== Install project dependencies ===="
|
|
|
|
|
apt-get update
|
|
|
|
|
|
2014-09-06 17:37:09 -07:00
|
|
|
echo "=== Upgrade ==="
|
|
|
|
|
apt-get upgrade -y
|
2014-07-03 13:49:17 -07:00
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install nodejs ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
apt-get -y install nodejs npm
|
2014-07-03 17:10:53 -07:00
|
|
|
ln -sf /usr/bin/nodejs /usr/bin/node
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install git ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
apt-get -y install git
|
|
|
|
|
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install docker ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
# see http://idolstarastronomer.com/painless-docker.html
|
|
|
|
|
echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
|
|
|
|
|
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
|
|
|
|
|
apt-get update
|
|
|
|
|
apt-get -y install lxc-docker
|
|
|
|
|
ln -sf /usr/bin/docker.io /usr/local/bin/docker
|
2014-09-06 13:41:05 -07:00
|
|
|
|
|
|
|
|
service docker stop
|
2014-09-17 10:19:50 -07:00
|
|
|
AUFS_MOUNTS=$(grep 'aufs' /proc/mounts | awk '{print$2}' | sort -r)
|
|
|
|
|
if [ ! -z $AUFS_MOUNTS ]; then
|
|
|
|
|
umount -l $AUFS_MOUNTS
|
|
|
|
|
fi
|
2014-09-06 13:41:05 -07:00
|
|
|
rm -rf /var/lib/docker
|
|
|
|
|
mkdir /var/lib/docker
|
|
|
|
|
|
|
|
|
|
# create a separate 12GB fs for docker images
|
|
|
|
|
# dd if=/dev/zero of=/root/docker_data.img bs=1M count=12000
|
|
|
|
|
truncate -s 12G /root/docker_data.img
|
|
|
|
|
mkfs.ext4 -F /root/docker_data.img
|
|
|
|
|
tune2fs -c0 -i0 /root/docker_data.img # disable automatic fs check
|
|
|
|
|
echo "/root/docker_data.img /var/lib/docker ext4 loop,nosuid 0 0" >> /etc/fstab
|
|
|
|
|
mount -a
|
|
|
|
|
|
|
|
|
|
service docker start
|
|
|
|
|
# give docker a couple of seconds to start up
|
|
|
|
|
sleep 2
|
|
|
|
|
|
2014-07-30 17:26:52 -07:00
|
|
|
# now add the user to the docker group
|
|
|
|
|
usermod $USER -a -G docker
|
2014-08-08 13:19:54 -07:00
|
|
|
echo "=== Pulling base docker images ==="
|
2014-09-15 20:12:28 -07:00
|
|
|
docker pull girish/base:0.6
|
2014-09-23 17:09:21 -07:00
|
|
|
docker pull girish/base:0.7
|
2014-07-03 13:49:17 -07:00
|
|
|
|
2014-09-15 20:12:28 -07:00
|
|
|
echo "=== Pulling graphite docker images ==="
|
2014-09-16 16:23:38 -07:00
|
|
|
docker pull girish/graphite:0.2
|
2014-09-15 20:12:28 -07:00
|
|
|
|
2014-09-27 13:09:01 -07:00
|
|
|
echo "=== Pulling haraka mail relay ==="
|
|
|
|
|
docker pull girish/haraka:0.1
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install nginx ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
apt-get -y install nginx-full
|
|
|
|
|
service nginx stop
|
2014-07-10 22:51:34 -07:00
|
|
|
update-rc.d -f nginx remove
|
2014-07-03 13:49:17 -07:00
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install build-essential ===="
|
2014-08-07 15:13:58 -07:00
|
|
|
apt-get -y install build-essential rcconf
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install sqlite3 ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
apt-get -y install sqlite3
|
|
|
|
|
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install supervisor ===="
|
2014-07-03 13:49:17 -07:00
|
|
|
apt-get -y install supervisor
|
2014-08-07 11:51:34 -07:00
|
|
|
service supervisor stop
|
|
|
|
|
update-rc.d -f supervisor remove
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
|
2014-09-17 09:37:43 -07:00
|
|
|
echo "==== Install collectd ==="
|
2014-09-15 20:12:28 -07:00
|
|
|
apt-get install -y collectd collectd-utils
|
2014-09-17 10:05:13 -07:00
|
|
|
update-rc.d -f collectd remove
|
2014-09-15 00:14:10 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
echo "== Box bootstrapping =="
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
echo "==== Cloning box repo ===="
|
2014-09-06 13:53:47 -07:00
|
|
|
echo "Cloning the box repo"
|
|
|
|
|
mkdir -p $USER_HOME
|
|
|
|
|
cd $USER_HOME
|
|
|
|
|
git clone http://bootstrap:not4long@yellowtent.girish.in/yellowtent/box.git
|
|
|
|
|
cd $SRCDIR
|
2014-08-29 11:21:14 -07:00
|
|
|
git reset --hard $BOX_REVISION
|
|
|
|
|
echo "git HEAD is `git rev-parse HEAD`"
|
2014-07-31 17:48:30 -07:00
|
|
|
|
2014-09-29 17:21:17 -07:00
|
|
|
NPM_INSTALL="npm install --production --loglevel verbose"
|
2014-07-31 17:48:30 -07:00
|
|
|
rm -rf ./node_modules
|
|
|
|
|
eval $NPM_INSTALL
|
|
|
|
|
RET=$?
|
|
|
|
|
while [[ $RET -ne 0 ]]; do
|
|
|
|
|
echo "[EE] npm install failed, try again"
|
|
|
|
|
rm -rf ./node_modules
|
|
|
|
|
eval $NPM_INSTALL
|
|
|
|
|
RET=$?
|
|
|
|
|
done
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
|
2014-09-06 13:41:05 -07:00
|
|
|
echo "==== Seting up appdata ==="
|
|
|
|
|
# create a separate 12GB fs for appdata
|
|
|
|
|
# dd if=/dev/zero of=/root/appdata.img bs=1M count=12000
|
|
|
|
|
truncate -s 12G /root/appdata.img
|
|
|
|
|
mkfs.ext4 -F /root/appdata.img
|
|
|
|
|
tune2fs -c0 -i0 /root/appdata.img # disable automatic fs check
|
|
|
|
|
mkdir -p $APPDATA
|
|
|
|
|
echo "/root/appdata.img $APPDATA ext4 loop,nosuid 0 0" >> /etc/fstab
|
|
|
|
|
mount -a
|
|
|
|
|
|
2014-07-03 13:49:17 -07:00
|
|
|
echo "==== Make the user own his home ===="
|
2014-07-03 17:10:53 -07:00
|
|
|
chown $USER:$USER -R /home/$USER
|
2014-07-03 13:49:17 -07:00
|
|
|
|
|
|
|
|
|
2014-10-07 20:48:44 -07:00
|
|
|
echo "=== Setting up firewall ==="
|
|
|
|
|
# clear tables and set default policy
|
|
|
|
|
apt-get install -y iptables-persistent
|
|
|
|
|
iptables -F
|
|
|
|
|
# default policy for filter table
|
|
|
|
|
iptables -P INPUT DROP
|
|
|
|
|
iptables -P FORWARD ACCEPT # TODO: disable icc and make this as reject
|
|
|
|
|
iptables -P OUTPUT ACCEPT
|
|
|
|
|
|
|
|
|
|
# NOTE: keep these in sync with src/apps.js validatePortBindings
|
|
|
|
|
# allow ssh, http, https, ping, dns
|
|
|
|
|
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
|
|
|
|
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
|
|
|
|
|
iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT
|
|
|
|
|
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
|
|
|
|
|
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
|
|
|
|
|
iptables -A INPUT -p udp --sport 53 -j ACCEPT
|
|
|
|
|
|
|
|
|
|
# loopback
|
|
|
|
|
iptables -A INPUT -i lo -j ACCEPT
|
|
|
|
|
iptables -A OUTPUT -o lo -j ACCEPT
|
|
|
|
|
|
|
|
|
|
# prevent DoS
|
|
|
|
|
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
|
|
|
|
|
|
2014-10-08 22:03:20 -07:00
|
|
|
# log dropped incoming. keep this at the end of all the rules
|
|
|
|
|
iptables -N LOGGING # new chain
|
|
|
|
|
iptables -A INPUT -j LOGGING # last rule in INPUT chain
|
|
|
|
|
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
|
|
|
|
|
iptables -A LOGGING -j DROP
|
|
|
|
|
|
2014-10-07 20:48:44 -07:00
|
|
|
# ubuntu will restore iptables from this file automatically
|
|
|
|
|
iptables-save > /etc/iptables/rules.v4
|
|
|
|
|
|
|
|
|
|
|
2014-07-03 13:49:17 -07:00
|
|
|
echo "==== Install init script ===="
|
|
|
|
|
cat > /etc/init.d/bootstrap <<EOF
|
2014-08-07 15:00:54 -07:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2014-09-18 12:49:14 -07:00
|
|
|
do_start() {
|
|
|
|
|
mkdir -p /var/log/cloudron
|
|
|
|
|
|
|
|
|
|
exec 2>&1 1> "/var/log/cloudron/bootstrap_init-\$\$-\$BASHPID.log"
|
|
|
|
|
|
2014-10-16 12:26:01 -07:00
|
|
|
echo "Updating to git revision $BOX_REVISION"
|
2014-10-16 12:40:38 -07:00
|
|
|
|
|
|
|
|
sudo -u $USER -H bash <<EOF2
|
2014-09-18 12:49:14 -07:00
|
|
|
cd $SRCDIR
|
2014-10-16 12:40:38 -07:00
|
|
|
while true; do
|
|
|
|
|
timeout 3m bash -c "git fetch && git reset --hard $BOX_REVISION" && break
|
|
|
|
|
echo "git fetch timedout, trying again"
|
|
|
|
|
done
|
2014-10-16 13:06:45 -07:00
|
|
|
EOF2
|
2014-09-18 12:49:14 -07:00
|
|
|
|
2014-10-16 12:26:01 -07:00
|
|
|
echo "Running bootstrap script with args $APPSTORE_URL $BOX_REVISION"
|
2014-09-18 12:49:14 -07:00
|
|
|
/bin/bash $SRCDIR/scripts/bootstrap.sh $APPSTORE_URL $BOX_REVISION
|
|
|
|
|
|
2014-10-16 12:26:01 -07:00
|
|
|
echo "Disabling bootstrap init script"
|
2014-09-18 12:49:14 -07:00
|
|
|
update-rc.d bootstrap remove
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "\$1" in
|
|
|
|
|
start)
|
|
|
|
|
do_start
|
|
|
|
|
;;
|
|
|
|
|
restart|reload|force-reload)
|
|
|
|
|
echo "Error: argument '\$1' not supported" >&2
|
|
|
|
|
exit 3
|
|
|
|
|
;;
|
|
|
|
|
stop)
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "Usage: \$0 start|stop" >&2
|
|
|
|
|
exit 3
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2014-07-31 08:14:53 -07:00
|
|
|
|
2014-10-16 12:26:01 -07:00
|
|
|
echo "End of bootstrap init script"
|
2014-07-03 17:10:53 -07:00
|
|
|
EOF
|
2014-10-16 12:26:01 -07:00
|
|
|
|
2014-07-03 17:10:53 -07:00
|
|
|
chmod +x /etc/init.d/bootstrap
|
2014-09-17 14:42:22 -07:00
|
|
|
update-rc.d bootstrap defaults 99
|
2014-09-17 13:56:07 -07:00
|
|
|
|
|
|
|
|
sync
|
|
|
|
|
|