From 0f603181ff80303a580cbba5b9df4ab906acfc83 Mon Sep 17 00:00:00 2001 From: Marc Aymerich Date: Wed, 30 Sep 2015 20:33:25 +0000 Subject: [PATCH] TODO --- INSTALL.md | 15 +-- TODO.md | 30 +++--- scripts/containers/deploy-dev.sh | 152 +++++++++++++++++++++++++++++++ scripts/containers/deploy.sh | 72 +++++++++------ 4 files changed, 214 insertions(+), 55 deletions(-) create mode 100755 scripts/containers/deploy-dev.sh diff --git a/INSTALL.md b/INSTALL.md index 7ef1fe56..5ad2de65 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -19,7 +19,9 @@ Django-orchestra can be installed on any Linux system, however it is **strongly 2. Install django-orchestra's source code ```bash sudo apt-get install python3-pip - sudo pip3 install django-orchestra==dev + sudo pip3 install django-orchestra==dev \ + --allow-external django-orchestra \ + --allow-unverified django-orchestra ``` 3. Install requirements @@ -42,17 +44,12 @@ Django-orchestra can be installed on any Linux system, however it is **strongly ``` -6. See the Django deployment checklist - ```bash - python3 panel/manage.py check --deploy - ``` - 6. Configure periodic execution of tasks (choose one) 1. Use cron ```bash python3 manage.py setupcronbeat - python3 panel/manage.py syncperiodictasks + python3 manage.py syncperiodictasks ``` 2. Use celeryd @@ -73,6 +70,10 @@ Django-orchestra can be installed on any Linux system, however it is **strongly sudo python3 manage.py setupnginx --user orchestra ``` +6. See the Django deployment checklist + ```bash + python3 manage.py check --deploy + ``` 9. Start all services: ```bash diff --git a/TODO.md b/TODO.md index 3d8e37e0..5e27b7cc 100644 --- a/TODO.md +++ b/TODO.md @@ -393,25 +393,19 @@ Case +deploy --dev +deploy.sh and deploy-dev.sh autoupgrade +chown orchestra:orchestra /home/orchestra/panel/orchestra.log +orchestra home autocomplete -CommandError: -run() encountered an error (return code 2) while executing 'su postgres -c "psql -c \"CREATE USER orchestra PASSWORD 'pane';\""' - b'could not change directory to "/home/orchestra/panel": Permission denied\npsql: could not connect to server: No such file or directory\n\tIs the server running locally and accepting\n\tconnections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?' +short URLS: https://github.com/rsvp/gitio +link backend help text variables to settings/#var_name +saas changelist domain: add
custom domain - warning: no previously-included files matching '__pycache__' found under directory '*' - warning: no previously-included files matching '*~' found under directory '*' - warning: no previously-included files matching '*.save' found under directory '*' - changing mode of build/scripts-3.4/orchestra-beat from 644 to 755 - changing mode of /usr/local/bin/orchestra-admin to 755 - changing mode of /usr/local/bin/orchestra-beat to 755 - File "/usr/local/lib/python3.4/dist-packages/orchestra/getips.py", line 15 - print sliver['mgmt_net']['address'] - ^ - SyntaxError: Missing parentheses in call to 'print' - - File "/usr/local/lib/python3.4/dist-packages/orchestra/management/commands/setupnginx.py", line 234 - "it? (yes/no): " % context) - ^ - SyntaxError: invalid syntax + $ sudo python manage.py startservices +Traceback (most recent call last): + File "manage.py", line 8, in + from django.core.management import execute_from_command_line +ImportError: No module named django.core.management diff --git a/scripts/containers/deploy-dev.sh b/scripts/containers/deploy-dev.sh new file mode 100755 index 00000000..7891e69b --- /dev/null +++ b/scripts/containers/deploy-dev.sh @@ -0,0 +1,152 @@ +#!/bin/bash + +# Automated development deployment of django-orchestra + +# This script is safe to run several times, for example in order to upgrade your deployment + +set -ue + +function main () { + + +bold=$(tput -T ${TERM:-xterm} bold) +normal=$(tput -T ${TERM:-xterm} sgr0) + +surun () { + echo " ${bold}\$ su $USER -c \"${@}\"${normal}" + su $USER -c "${@}" +} + + +run () { + echo " ${bold}\$ ${@}${normal}" + ${@} +} + + +[ $(whoami) != 'root' ] && { + echo -e "\nErr. This script should run as root\n" >&2 + exit 1 +} + +USER='orchestra' +PASSWORD='orchestra' +HOME="/home/$USER" +PROJECT_NAME='panel' +BASE_DIR="$HOME/$PROJECT_NAME" +MANAGE="$BASE_DIR/manage.py" +PYTHON_BIN="python3" +CELERY=false + + +# Create a system user for running Orchestra +useradd $USER -s "/bin/bash" || true +echo "$USER:$PASSWORD" | chpasswd +mkdir -p $HOME +chown $USER.$USER $HOME +groups $USER | grep -E "(^|\s)$USER($|\s)" > /dev/null || run adduser $USER sudo + + +CURRENT_VERSION=$($PYTHON_BIN -c "from orchestra import get_version; print(get_version());" 2> /dev/null || false) || true +if [[ ! $CURRENT_VERSION ]]; then + # First Orchestra installation + run "apt-get -y install git python3-pip" + surun "git clone https://github.com/glic3rinu/django-orchestra.git ~/django-orchestra" || { + # Finishing partial installation + surun "export GIT_DIR=~/django-orchestra/.git; git pull" + } + 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" +fi + +run "cp $HOME/django-orchestra/orchestra/bin/orchestra-admin /usr/local/bin/" +run "cp $HOME/django-orchestra/orchestra/bin/orchestra-beat /usr/local/bin/" + +sudo orchestra-admin install_requirements --testing + +if [[ ! -e $BASE_DIR ]]; then + cd $HOME + surun "orchestra-admin startproject $PROJECT_NAME" + cd - +else + echo "$BASE_DIR already existis, doing nothing." +fi + + +run "apt-get -y install postgresql" +if [[ ! $(sudo su postgres -c "psql -lqt" | awk {'print $1'} | grep '^orchestra$') ]]; then + # orchestra database does not exists + # Speeding up tests, don't do this in production! + . /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/" \ + /etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf + sed -i "s/^#full_page_writes =\s*.*/full_page_writes = off/" \ + /etc/postgresql/${POSTGRES_VERSION}/main/postgresql.conf + + run "service postgresql restart" + run "$PYTHON_BIN $MANAGE setuppostgres --db_name orchestra --db_user orchestra --db_password orchestra" + # Create database permissions are needed for running tests + sudo su postgres -c 'psql -c "ALTER USER orchestra CREATEDB;"' +fi + +# create logfile +surun "$PYTHON_BIN $MANAGE setuplog --noinput" + + +# admin_tools needs accounts and does not have migrations +if [[ ! $(sudo su postgres -c "psql orchestra -q -c 'SELECT * FROM accounts_account LIMIT 1;' 2> /dev/null") ]]; then + surun "$PYTHON_BIN $MANAGE migrate --noinput" +else + surun "$PYTHON_BIN $MANAGE postupgradeorchestra --from $CURRENT_VERSION" +fi + + +if [[ $CELERY == true ]]; then + run apt-get install -y rabbitmq + sudo $PYTHON_BIN $MANAGE setupcelery --username $USER --processes 2 +else + surun "$PYTHON_BIN $MANAGE setupcronbeat" + surun "$PYTHON_BIN $MANAGE syncperiodictasks" +fi + + +# Install and configure Nginx+uwsgi web services +surun "mkdir -p $BASE_DIR/static" +surun "$PYTHON_BIN $MANAGE collectstatic --noinput" +run "apt-get install -y nginx uwsgi uwsgi-plugin-python3" +run "$PYTHON_BIN $MANAGE setupnginx --user $USER --noinput" +run "service nginx start" + +# Apply changes on related services +run "$PYTHON_BIN $MANAGE restartservices" || true + +# Create orchestra superuser +cat <<- EOF | $PYTHON_BIN $MANAGE shell +from orchestra.contrib.accounts.models import Account +if not Account.objects.filter(username="$USER").exists(): + print('Creating orchestra superuser') + Account.objects.create_superuser("$USER", "$USER@localhost", "$PASSWORD") + +EOF + +# Change to development settings +PRODUCTION="from orchestra.conf.production_settings import \*" +DEVEL="from orchestra.conf.devel_settings import \*" +sed -i "s/^$PRODUCTION/# $PRODUCTION/" $BASE_DIR/$PROJECT_NAME/settings.py +sed -i "s/^#\s*$DEVEL/$DEVEL/" $BASE_DIR/$PROJECT_NAME/settings.py + + +cat << EOF + +${bold} + * Admin interface login * + - username: $USER + - password: $PASSWORD +${normal} +EOF + +} + +# Wrap it all on a function to avoid partial executions when running through wget/curl +main diff --git a/scripts/containers/deploy.sh b/scripts/containers/deploy.sh index 70992d50..6c73bbcb 100644 --- a/scripts/containers/deploy.sh +++ b/scripts/containers/deploy.sh @@ -2,6 +2,7 @@ set -ue + function main () { bold=$(tput -T ${TERM:-xterm} bold) normal=$(tput -T ${TERM:-xterm} sgr0) @@ -16,55 +17,66 @@ function main () { ${@} } + while true; do + read -p "Enter a project name [panel]: " project_name + if [[ "$project_name" == "" ]]; then + project_name="panel" + break + elif [[ ! $(echo "$project_name" | grep '^[_a-zA-Z]\w*$') ]]; then + if [[ ! $(echo "$project_name" | grep '^[_a-zA-Z]') ]]; then + message='make sure the name begins with a letter or underscore' + else + message='use only numbers, letters and underscores' + fi + echo "'$project_name' is not a valid %s name. Please $message." + else + break + fi + done + + # TODO Password: Password (again): + + read -p "Enter a new database password: " db_password + + while true; do + read -p "Do you want to use celery or cronbeat for task execution [cronbeat]?" task + case $task in + 'celery' ) task=celery; break;; + 'cronbeat' ) task=cronbeat; break;; + '' ) task=cronbeat; break;; + * ) echo "Please answer celery or cronbeat.";; + esac + done + run sudo pip3 install django-orchestra==dev \ --allow-external django-orchestra \ --allow-unverified django-orchestra run sudo orchestra-admin install_requirements run cd $(eval echo ~$USER) - while true; do - read -p "Enter a project name: " project_name - if [[ "$project_name" =~ ' ' ]]; then - echo "Spaces not allowed" - else - run orchestra-admin startproject $project_name - run cd $project_name - break - fi - done - - read -p "Enter a new database password: " db_password + run orchestra-admin startproject $project_name + run cd $project_name + + sudo service postgresql start run sudo python3 manage.py setuppostgres --db_password "$db_password" run python3 manage.py migrate - run python3 panel/manage.py check --deploy - function cronbeat () { + if [[ "$task" == "cronbeat" ]]; then run python3 manage.py setupcronbeat - run python3 panel/manage.py syncperiodictasks - } - - function celery () { + run python3 manage.py syncperiodictasks + else run sudo apt-get install rabbitmq run sudo python3 manage.py setupcelery --username $USER - } + fi - while true; do - read -p "Do you want to use celery or cronbeat for task execution [cronbeat]?" task - case $task in - 'celery' ) celery; break;; - 'cronbeat' ) cronbeat; break;; - '' ) cronbeat; break;; - * ) echo "Please answer celery or cronbeat.";; - esac - done - - run sudo python3 manage.py setuplog + run sudo python3 manage.py setuplog --noinput run python3 manage.py collectstatic --noinput run sudo apt-get install nginx-full uwsgi uwsgi-plugin-python3 run sudo python3 manage.py setupnginx --user $USER run sudo python manage.py startservices + run python3 manage.py check --deploy } # Wrap it all on a function to avoid partial executions when running through wget/curl