Fixes on create and deploy container script

This commit is contained in:
Marc Aymerich 2015-04-29 13:17:21 +00:00
parent 5d6367f794
commit 242d0825c8
5 changed files with 49 additions and 232 deletions

View file

@ -40,10 +40,14 @@ If you are planing to do some development or perhaps just checking out this proj
https://raw.github.com/glic3rinu/django-orchestra/master/scripts/container/create.sh https://raw.github.com/glic3rinu/django-orchestra/master/scripts/container/create.sh
sudo bash /tmp/create.sh sudo bash /tmp/create.sh
sudo lxc-start -n orchestra sudo lxc-start -n orchestra
# root/root
``` ```
2. Deploy Django-orchestra development environment inside the container 2. Deploy Django-orchestra development environment **inside the container**
```bash ```bash
# Make sure your container is connected to the Internet
# Probably you will have to configure the NAT first:
# sudo iptables -t nat -A POSTROUTING -s `container_ip` -j MASQUERADE
wget -O /tmp/deploy.sh \ wget -O /tmp/deploy.sh \
https://raw.github.com/glic3rinu/django-orchestra/master/scripts/container/deploy.sh https://raw.github.com/glic3rinu/django-orchestra/master/scripts/container/deploy.sh
cd /tmp/ # Moving away from /root before running deploy.sh cd /tmp/ # Moving away from /root before running deploy.sh

View file

@ -1,11 +1,14 @@
#!/bin/bash #!/bin/bash
set -u set -u
set -e
bold=$(tput bold) bold=$(tput bold)
normal=$(tput sgr0) normal=$(tput sgr0)
PYTHON_BIN='python3'
function help () { function help () {
if [[ $# -gt 1 ]]; then if [[ $# -gt 1 ]]; then
CMD="print_${2}_help" CMD="print_${2}_help"
@ -71,11 +74,11 @@ export -f check_root
get_orchestra_dir () { get_orchestra_dir () {
if ! $(echo "import orchestra"|python 2> /dev/null); then if ! $(echo "import orchestra" | $PYTHON_BIN 2> /dev/null); then
echo -e "\nErr. orchestra not installed.\n" >&2 echo -e "\norchestra not installed.\n" >&2
exit 1 exit 1
fi fi
PATH=$(echo "import orchestra, os; print os.path.dirname(os.path.realpath(orchestra.__file__))" | python) PATH=$(echo "import orchestra, os; print(os.path.dirname(os.path.realpath(orchestra.__file__)))" | $PYTHON_BIN)
echo $PATH echo $PATH
} }
export -f get_orchestra_dir export -f get_orchestra_dir
@ -116,20 +119,19 @@ function install_requirements () {
unset OPTIND unset OPTIND
unset opt unset opt
check_root check_root || true
ORCHESTRA_PATH=$(get_orchestra_dir) ORCHESTRA_PATH=$(get_orchestra_dir) || true
APT="python3 \ APT="python3 \
python3-pip \ python3-pip \
python3-psycopg2 \ python3-psycopg2 \
python3-lxml \
postgresql \ postgresql \
rabbitmq-server \ rabbitmq-server \
python3-dev \ python3-dev \
bind9utils \ bind9utils \
python3-cracklib \ python3-cracklib \
libz-dev \ libz-dev \
libxml2-dev \
libxslt1-dev \
wkhtmltopdf \ wkhtmltopdf \
xvfb \ xvfb \
ca-certificates \ ca-certificates \
@ -154,8 +156,7 @@ function install_requirements () {
django-filter==0.9.2 \ django-filter==0.9.2 \
passlib==1.6.2 \ passlib==1.6.2 \
jsonfield==0.9.22 \ jsonfield==0.9.22 \
lxml==3.3.5 \ python-dateutil==2.4.2 \
python-dateutil==2.2 \
django-iban==0.3.0 \ django-iban==0.3.0 \
requests \ requests \
phonenumbers \ phonenumbers \
@ -166,20 +167,18 @@ function install_requirements () {
if $testing; then if $testing; then
APT="${APT} \ APT="${APT} \
iceweasel \ iceweasel \
dnsutils \ dnsutils"
python3-mysqldb"
PIP="${PIP} \ PIP="${PIP} \
selenium \ selenium \
xvfbwrapper \ xvfbwrapper \
freezegun \ freezegun \
coverage \ coverage \
flake8 \ flake8 \
orchestra-orm==dev \
django-debug-toolbar==1.3.0 \ django-debug-toolbar==1.3.0 \
https://github.com/django-nose/django-nose/archive/master.zip \ https://github.com/django-nose/django-nose/archive/master.zip \
sqlparse \ sqlparse \
pyinotify \ pyinotify \
--allow-external orchestra-orm --allow-unverified orchestra-orm" PyMySQL"
fi fi
# Make sure locales are in place before installing postgres # Make sure locales are in place before installing postgres
@ -215,12 +214,6 @@ function install_requirements () {
| xargs sed -i "s/${IMPORT}, SortedDict/${IMPORT}\n ${COLLECTIONS}/" | xargs sed -i "s/${IMPORT}, SortedDict/${IMPORT}\n ${COLLECTIONS}/"
ls /usr/local/lib/python*/dist-packages/passlib/ext/django/utils.py \ ls /usr/local/lib/python*/dist-packages/passlib/ext/django/utils.py \
| xargs sed -i "s/SortedDict/OrderedDict/g" | xargs sed -i "s/SortedDict/OrderedDict/g"
# Patch dateutil
sed -i "s/elif not isinstance(dt2, datetime.datetime):/else:/" \
/usr/local/lib/python2.7/dist-packages/dateutil/relativedelta.py
sed -i "s/if not type(dt1) == type(dt2): #isinstance(dt1, type(dt2)):/if not isinstance(dt2, type(dt1)):/" \
/usr/local/lib/python2.7/dist-packages/dateutil/relativedelta.py
} }
export -f install_requirements export -f install_requirements
@ -286,189 +279,5 @@ function startproject () {
export -f startproject export -f startproject
function print_install_certificate_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin install_certificate${normal} - Installs a valid all-purpose self signed certificate that is valid for the next ten years
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function install_certificate () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
run openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/mailserver.pem -keyout /etc/ssl/private/mailserver.pem
run chmod go= /etc/ssl/private/mailserver.pem
}
export -f install_certificate
function print_uninstall_certificate_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin uninstall_certificate${normal} - Remove self signed certificate
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function uninstall_certificate () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
run rm -f /etc/ssl/private/mailserver.pem
}
export -f uninstall_certificate
function print_install_postfix_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin install_postfix${normal} - Installs postfix server and its dependencies (dovecot, amavis, spamassassin and clamav) using apt-get. Also it generates a valid all-purpose certificate self signed that is valid for the next ten years.
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function install_postfix () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
ORCHESTRA_PATH=$(get_orchestra_dir)
APT="postfix postfix-pgsql \
swaks \
dovecot-core dovecot-pop3d dovecot-imapd dovecot-antispam \
dovecot-pgsql dovecot-sieve dovecot-managesieved dovecot-solr \
amavisd-new spamassassin \
clamav-freshclam clamav-base clamav clamav-daemon clamav-testfiles \
"
run apt-get update
export DEBIAN_FRONTEND=noninteractive
run apt-get install -y $APT
unset $DEBIAN_FRONTEND;
run /usr/bin/freshclam
run apt-get --purge remove 'exim4*' -y
if [ ! -f /etc/ssl/private/mailserver.pem ]; then
install_certificate
fi;
}
export -f install_postfix
function print_uninstall_postfix_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin uninstall_postfix${normal} - Uninstalls postfix server and its dependencies (dovecot, amavis, spamassassin and clamav) using dpkg and remove self signed certificate
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function uninstall_postfix () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
ORCHESTRA_PATH=$(get_orchestra_dir)
APT="postfix postfix-pgsql \
swaks \
dovecot-core dovecot-pop3d dovecot-imapd dovecot-antispam \
dovecot-pgsql dovecot-sieve dovecot-managesieved dovecot-solr \
amavisd-new spamassassin \
clamav-freshclam clamav-base clamav clamav-daemon libclamav6 clamav-testfiles \
"
run dpkg -P --force-depends $APT
run apt-get update
run apt-get -f install -y
if [ -d /var/run/amavis ]; then
run rm -rf /var/run/amavis
fi;
if [ -d /var/lib/clamav ]; then
run rm -rf /var/lib/clamav
fi;
if [ -f /etc/ssl/private/mailserver.pem ]; then
uninstall_certificate
fi;
}
export -f uninstall_postfix
[ $# -lt 1 ] && print_help [ $# -lt 1 ] && print_help
$1 "${@}" $1 "${@}"

View file

@ -8,9 +8,9 @@ from django.conf import settings
class Migration(migrations.Migration): class Migration(migrations.Migration):
# dependencies = [ dependencies = [
# migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('orders', '0001_initial'),
# ] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(

View file

@ -22,19 +22,26 @@ lxc-create -h &> /dev/null || {
exit 1 exit 1
} }
lxc-ls | grep -E "(^|\s)$NAME($|\s)" && {
echo -e "\nErr. Container with name $NAME already exists."
echo -e " You can destroy it by: sudo lxc-destroy -n $NAME\n" >&2
exit 1
}
lxc-create -n $NAME -t debian lxc-create -n $NAME -t debian
trap "umount $CONTAINER/{dev,sys}; exit 1;" INT TERM EXIT
mount --bind /dev $CONTAINER/dev mount --bind /dev $CONTAINER/dev
mount -t sysfs none $CONTAINER/sys mount -t sysfs none $CONTAINER/sys
trap "umount $CONTAINER/{dev,sys}; exit 1;"INT TERM EXIT
sed -i "s/\tlocalhost$/\tlocalhost $NAME/" $CONTAINER/etc/hosts sed -i "s/\tlocalhost$/\tlocalhost $NAME/" $CONTAINER/etc/hosts
sed -i "s/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" $CONTAINER/etc/locale.gen sed -i "s/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" $CONTAINER/etc/locale.gen
chroot $CONTAINER locale-gen chroot $CONTAINER locale-gen
chroot $CONTAINER apt-get update
chroot $CONTAINER apt-get install -y --force-yes \ chroot $CONTAINER apt-get install -y --force-yes \
nano git screen sudo iputils-ping python3 python3-pip wget curl dnsutils rsyslog nano git screen sudo iputils-ping python3 python3-pip wget curl dnsutils rsyslog

View file

@ -4,8 +4,9 @@
# This script is safe to run several times, for example in order to upgrade your deployment # This script is safe to run several times, for example in order to upgrade your deployment
set -u set -u
set -e
bold=$(tput bold) bold=$(tput bold)
normal=$(tput sgr0) normal=$(tput sgr0)
@ -20,7 +21,7 @@ PASSWORD='orchestra'
HOME="/home/$USER" HOME="/home/$USER"
PROJECT_NAME='panel' PROJECT_NAME='panel'
BASE_DIR="$HOME/$PROJECT_NAME" BASE_DIR="$HOME/$PROJECT_NAME"
PYTHON_BIN="python3"
surun () { surun () {
echo " ${bold}\$ su $USER -c \"${@}\"${normal}" echo " ${bold}\$ su $USER -c \"${@}\"${normal}"
@ -34,20 +35,20 @@ run () {
# Create a system user for running Orchestra # Create a system user for running Orchestra
useradd orchestra -s "/bin/bash" useradd $USER -s "/bin/bash" || true
echo "$USER:$PASSWORD" | chpasswd echo "$USER:$PASSWORD" | chpasswd
mkdir $HOME mkdir -p $HOME
chown $USER.$USER $HOME chown $USER.$USER $HOME
run adduser $USER sudo groups $USER | grep -E "(^|\s)$USER($|\s)" > /dev/null || run adduser $USER sudo
CURRENT_VERSION=$(python3 -c "from orchestra import get_version; print get_version();" 2> /dev/null || false) CURRENT_VERSION=$($PYTHON_BIN -c "from orchestra import get_version; print(get_version());" 2> /dev/null || false) || true
if [[ ! $CURRENT_VERSION ]]; then if [[ ! $CURRENT_VERSION ]]; then
# First Orchestra installation # First Orchestra installation
run "apt-get -y install git python3-pip" run "apt-get -y install git python3-pip"
surun "git clone https://github.com/glic3rinu/django-orchestra.git ~/django-orchestra" surun "git clone https://github.com/glic3rinu/django-orchestra.git ~/django-orchestra" || surun "export GIT_DIR=~/django-orchestra/.git; git pull"
echo $HOME/django-orchestra/ | sudo tee /usr/local/lib/python3*/dist-packages/orchestra.pth PYTHON_PATH=$($PYTHON_BIN -c "import sys; print([path for path in sys.path if path.startswith('/usr/local/lib/python')][0]);")
echo $HOME/django-orchestra/ | sudo tee "$PYTHON_PATH/orchestra.pth"
run "cp $HOME/django-orchestra/orchestra/bin/orchestra-admin /usr/local/bin/" run "cp $HOME/django-orchestra/orchestra/bin/orchestra-admin /usr/local/bin/"
fi fi
@ -64,40 +65,36 @@ MANAGE="$BASE_DIR/manage.py"
if [[ ! $(sudo su postgres -c "psql -lqt" | awk {'print $1'} | grep '^orchestra$') ]]; then if [[ ! $(sudo su postgres -c "psql -lqt" | awk {'print $1'} | grep '^orchestra$') ]]; then
# orchestra database does not esists # orchestra database does not esists
# Speeding up tests, don't do this in production! # Speeding up tests, don't do this in production!
POSTGRES_VERSION=$(psql --version | head -n1 | awk {'print $3'} | sed -r "s/(^[0-9\.]*).*/\1/") . /usr/share/postgresql-common/init.d-functions
POSTGRES_VERSION=$(psql --version | head -n1 | sed -r "s/^.*\s([0-9]+\.[0-9]+).*/\1/")
sed -i "s/^#fsync =\s*.*/fsync = off/" \ sed -i "s/^#fsync =\s*.*/fsync = off/" \
/etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf /etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf
sed -i "s/^#full_page_writes =\s*.*/full_page_writes = off/" \ sed -i "s/^#full_page_writes =\s*.*/full_page_writes = off/" \
/etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf /etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf
run "service postgresql restart" run "service postgresql restart"
run "python3 $MANAGE setuppostgres --db_name orchestra --db_user orchestra --db_password orchestra" run "$PYTHON_BIN $MANAGE setuppostgres --db_name orchestra --db_user orchestra --db_password orchestra"
# Create database permissions are needed for running tests # Create database permissions are needed for running tests
sudo su postgres -c 'psql -c "ALTER USER orchestra CREATEDB;"' sudo su postgres -c 'psql -c "ALTER USER orchestra CREATEDB;"'
fi fi
if [[ $CURRENT_VERSION ]]; then run "$PYTHON_BIN $MANAGE syncdb --noinput"
# Per version upgrade specific operations run "$PYTHON_BIN $MANAGE migrate --noinput"
run "python3 $MANAGE postupgradeorchestra --no-restart --from $CURRENT_VERSION"
else
run "python3 $MANAGE syncdb --noinput"
run "python3 $MANAGE migrate --noinput"
fi
sudo python $MANAGE setupcelery --username $USER --processes 2 sudo python $MANAGE setupcelery --username $USER --processes 2
# Install and configure Nginx web server # Install and configure Nginx web server
surun "mkdir $BASE_DIR/static" surun "mkdir -p $BASE_DIR/static"
surun "python3 $MANAGE collectstatic --noinput" surun "$PYTHON_BIN $MANAGE collectstatic --noinput"
run "apt-get install -y nginx uwsgi uwsgi-plugin-python3" run "apt-get install -y nginx uwsgi uwsgi-plugin-python3"
run "python3 $MANAGE setupnginx" run "$PYTHON_BIN $MANAGE setupnginx"
run "service nginx start" run "service nginx start"
# Apply changes # Apply changes
run "python3 $MANAGE restartservices" run "$PYTHON_BIN $MANAGE restartservices"
# Create a orchestra user # Create a orchestra user
cat <<- EOF | python3 $MANAGE shell cat <<- EOF | $PYTHON_BIN $MANAGE shell
from orchestra.apps.accounts.models import Account from orchestra.apps.accounts.models import Account
if not Account.objects.filter(username="$USER").exists(): if not Account.objects.filter(username="$USER").exists():
print 'Creating orchestra superuser' print 'Creating orchestra superuser'