Files
cloudron-box/scripts/initializeBaseUbuntuImage.sh
T

225 lines
5.6 KiB
Bash
Raw Normal View History

2014-07-03 17:10:53 -07:00
#!/bin/bash
set -v
2014-07-03 17:10:53 -07:00
USER=yellowtent
2014-10-20 16:52:33 -07:00
USER_HOME="/home/$USER"
DATA_DIR="$USER_HOME/data"
APPDATA=$DATA_DIR/appdata
SRCDIR=$USER_HOME/box
2014-10-30 14:02:12 -07:00
BOX_REVISION=$1
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-10-30 14:02:12 -07:00
echo "== Yellowtent base image preparation ($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
service docker stop
AUFS_MOUNTS=$(grep 'aufs' /proc/mounts | awk '{print$2}' | sort -r)
if [ ! -z $AUFS_MOUNTS ]; then
umount -l $AUFS_MOUNTS
fi
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
2014-10-17 00:12:20 -07:00
apt-get -y install btrfs-tools
truncate -s 12G /root/docker_data.img
2014-10-17 00:12:20 -07:00
mkfs.btrfs -L DockerData /root/docker_data.img
echo "/root/docker_data.img /var/lib/docker btrfs loop,nosuid 0 0" >> /etc/fstab
echo 'DOCKER_OPTS="-s btrfs"' >> /etc/default/docker
mount -a
service docker start
# give docker a couple of seconds to start up
sleep 2
# 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
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
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
echo "== Box bootstrapping =="
2014-07-03 13:49:17 -07:00
2014-10-17 00:12:20 -07:00
echo "==== Seting up data ==="
# create a separate 12GB fs for data
truncate -s 12G /root/user_home.img
mkfs.btrfs -L UserHome /root/user_home.img
echo "/root/user_home.img $USER_HOME btrfs loop,nosuid 0 0" >> /etc/fstab
mount -a
2014-10-24 23:01:21 -07:00
btrfs subvolume create $USER_HOME/data
2014-10-17 00:12:20 -07:00
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
git reset --hard $BOX_REVISION
echo "git HEAD is `git rev-parse HEAD`"
2014-07-31 17:48:30 -07:00
2014-10-24 23:17:24 -07:00
NPM_INSTALL="npm install --production"
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
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
# disable metadata access to non-root
# modprobe ipt_owner
iptables -A OUTPUT -m owner ! --uid-owner root -d 169.254.169.254 -j DROP
2014-10-07 20:48:44 -07:00
# 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/cloudron-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
2014-10-28 15:57:57 -07:00
exec 2>&1 1> "/var/log/cloudron/bootstrap-\$\$-\$BASHPID.log"
2014-09-18 12:49:14 -07:00
2014-11-12 12:42:17 -08:00
DEBUG="box*,connect-lastmile" $SRCDIR/installer/server.js 2>&1 1> /var/log/cloudron/installserver.log &
2014-09-18 12:49:14 -07:00
echo "Disabling cloudron-bootstrap init script"
update-rc.d cloudron-bootstrap remove
2014-09-18 12:49:14 -07:00
}
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
echo "End of cloudron-bootstrap init script"
2014-07-03 17:10:53 -07:00
EOF
chmod +x /etc/init.d/cloudron-bootstrap
update-rc.d cloudron-bootstrap defaults 99
2014-09-17 13:56:07 -07:00
sync