Vesta CP: Installieren von Webanwendungen in Ruby und Python



Hallo Habr.
Ich liebe es, wenn alles an seinem Platz liegt, alles sauber und ordentlich ist.
Aus diesem Grund stürze ich mich vierteljährlich in ein kreatives Chaos.
Es ist wichtig für mich, ein stabiles Betriebssystem zu haben, mit der Gewissheit, dass nach dem nächsten täglichen Update nichts kaputt geht. Viele Entwickler wählen das Betriebssystem basierend auf der Verfügbarkeit der aktuellen Softwareversionen. Ich kann Centos kochen und bin mir zu 99,98% sicher, dass " yum-y install yum-cron " funktioniert .

Ich erkläre Ihnen, wie Sie die neuesten Versionen von Ruby und Python für die Webentwicklung verwenden können. Außerdem werden den Ergebnissen zufolge 4 Webanwendungen eines regulären Benutzers auf dem Server installiert: Djangocms (Python 3.4.3), Quokka (Python 2.7.9), Redmine (Ruby 2.2.1) und Refinerycms(Rubin 2.0.0). Die Parameter für den Thin Application-Start (Auswahl der Datenbank, Anzahl der Werker, Verbindungen, Protokolle usw.) werden nicht berücksichtigt. Ich wollte LocomotiveCMS beschreiben, aber es stellte sich heraus, dass es sich um eine Dampflokomotive mit einigen manuellen Änderungen für das Setup handelte.

Für Komfort und Bequemlichkeit verwenden wir das VestaCP-Bedienfeld. Weil sie einfach großartig und ideologisch lieb ist.

Systemvorbereitung


Wir haben also einen Test-VPS mit Centos 6, Root-Zugriff. Im Gegensatz zur offiziellen Führung werden wir das Panel mit der Option "-d" versehen.

curl -O http://vestacp.com/pub/vst-install.sh
bash vst-install.sh -d

Aus diesem Grund beschränken wir die Installation auf das Repository "epel" ohne "remi" (dh ohne die neuesten Versionen von mysql und php).
Hinzufügen von Domain-Vorlagen für Nginx:

cat> /usr/local/vesta/data/templates/web/nginx/socket.tpl ...
cat > /usr/local/vesta/data/templates/web/nginx/socket.tpl << EOF
upstream %domain%_app_server {
  server unix:/tmp/%domain%.sock fail_timeout=0;
}
server {
    listen      %ip%:%proxy_port%;
    server_name %domain_idn% %alias_idn%;
    error_log  /var/log/httpd/domains/%domain%.error.log error;
    access_log  /var/log/httpd/domains/%domain%.access.log;
    location /static/ {
        alias   %docroot%/static/;
    }
    location /media/ {
        alias   %docroot%/media/;
    }
    location / {
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header Host \$http_host;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_redirect off;
        if (!-f \$request_filename) {
            proxy_pass http://%domain%_app_server;
            break;
        }
    }
    include %home%/%user%/conf/web/nginx.%domain%.conf*;
}
EOF
cat > /usr/local/vesta/data/templates/web/nginx/socket.stpl << EOF
server {
    listen      %ip%:%proxy_ssl_port%;
    server_name %domain_idn% %alias_idn%;
    ssl         on;
    ssl_certificate      %ssl_pem%;
    ssl_certificate_key  %ssl_key%;
    error_log  /var/log/httpd/domains/%domain%.error.log error;
    access_log  /var/log/httpd/domains/%domain%.access.log;
    location /static/ {
        alias   %sdocroot%/static/;
    }
    location /media/ {
        alias   %sdocroot%/media/;
    }
    location / {
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header Host \$http_host;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_redirect off;
        if (!-f \$request_filename) {
            proxy_pass http://%domain%_app_server;
            break;
        }
    }
    include %home%/%user%/conf/web/snginx.%domain%.conf*;
}
EOF
chown admin.admin /usr/local/vesta/data/templates/web/nginx/socket*


Weitere Installation von Paketen: mongodb for quokka, Supervisor des dritten Zweigs, und dev-packages:

yum install ...
yum install mongodb-server -y
chkconfig mongod on
service mongod start
yum install http://mirror.symnds.com/distributions/gf/el/6/gf/i386/gf-release-6-6.gf.el6.noarch.rpm -y
yum --enablerepo=gf-plus install supervisor -y
chkconfig supervisord on
service supervisord start
yum groupinstall "Development tools" -y
yum install ImageMagick-devel mysql-devel zlib-devel bzip2-devel openssl-devel ncurses-devel \
    sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libjpeg-devel \
    libyaml-devel libffi-devel -y
yum install git mercurial nodejs -y


Und das Letzte, was root braucht, ist, einen Supervisor einzurichten:

cat /etc/supervisord.d/reguser.ini
[program:djangocms.test.site]
directory=/home/reguser/web/%(program_name)s/public_html
command=/home/reguser/.pyenv/shims/gunicorn -b unix:/tmp/%(program_name)s.sock project.wsgi:application
user=reguser
autostart=true
autorestart=true
redirect_stderr=true
[program:quokka.test.site]
directory=/home/reguser/web/%(program_name)s/public_html
command=/home/reguser/.pyenv/shims/gunicorn -b unix:/tmp/%(program_name)s.sock manage:app
user=reguser
autostart=true
autorestart=true
redirect_stderr=true
[program:redmine.test.site]
directory=/home/reguser/web/%(program_name)s/public_html/
#command=/home/reguser/.rbenv/shims/unicorn         -l /tmp/%(program_name)s.sock -E production
command=/home/reguser/.rbenv/shims/thin start --socket /tmp/%(program_name)s.sock -e production 
user=reguser
autostart=true
autorestart=true
redirect_stderr=true
[program:refinerycms.test.site]
directory=/home/reguser/web/%(program_name)s/public_html/
command=/home/reguser/.rbenv/shims/unicorn  -l /tmp/%(program_name)s.sock
user=reguser
autostart=true
autorestart=true
redirect_stderr=true


Das ist alles, was ein Superuser benötigt.

Fügen Sie in Vesta einen Benutzer (reguser) hinzu, aktivieren Sie SSH Access in bash und erstellen Sie vier Domänen:
djangocms.test.site , quokka.test.site , redmine.test.site , refinerycms.test.site .
Geben Sie in den Einstellungen jeder Domäne das Nginx-Profil an, das zuvor unter dem Namen "Socket" hinzugefügt wurde.
Auf diese Weise hört nginx Unix-Sockets ab, die vom Supervisor mit regulären Benutzerrechten erstellt werden.

Auf den Seiten jeder Domain wird ein unangenehmer „502 Bad Gateway“ angezeigt - das heißt, wir gehen den richtigen Weg.

Anpassung der Benutzerumgebung


Wenn im "System" alles in Ordnung ist, werden wir im "Hamster" viel selbst zusammengebauten Müll haben.
Wir werden jedoch nichts sehen. Für uns wird die ganze Drecksarbeit von PyEnv und RbEnv erledigt.

su - reguser

Der erste, der das Problem löst, ist RbEnv. Eine bedeutende Seite von rbenv.org wird uns zum Github schicken, wo wir die Shims-Philosophie unabhängig voneinander anerkennen werden.

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
. ~/.bash_profile
type rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Wir schauen uns die verfügbaren Versionen an und sammeln die neuesten Versionen der Zweige 2.0 und 2.2:

rbenv install -l
rbenv install 2.0.0-p643
rbenv install 2.2.1

Seltsamerweise, aber PyEnv ist eine Gabelung von RbEnv, mehr Details hier . Wir machen fast dasselbe:

curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
echo 'export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
. ~/.bash_profile
pyenv install -l
pyenv install 2.7.9
pyenv install 3.4.3

Installieren Sie Redmine


Zuerst müssen Sie eine MySQL-Datenbank in Vesta erstellen:

cd ~/web/redmine.test.site/public_html
rm -rf *
hg clone --updaterev 3.0-stable https://bitbucket.org/redmine/redmine-all .
echo 'production:
  adapter: mysql2
  database: reguser_redmine
  host: localhost
  username: reguser_redmine
  password: "password"
  encoding: utf8
' > config/database.yml

Darüber hinaus wird in einer sehr wichtigen Zeile eine .ruby-Versionsdatei im aktuellen Verzeichnis erstellt, die die gewünschte Version der Shims angibt. Dasselbe passiert mit Python-Versionen, wenn pyenv local xxx .

rbenv local 2.2.1
gem install bundler
bundle install --without development test
rake generate_secret_token
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data
Wählen Sie dünn oder Einhorn (wie im Betreuer angegeben):
gem install thin
echo 'gem "thin"' >> Gemfile
gem install unicorn
echo 'gem "unicorn"' >> Gemfile

Der erste ging. Es bleibt, um den Supervisor von der Konsole ' supervisorctl restart redmine.test.site ' oder über das Webface zu verzerren ... und die Redmine ist bereit, redmine.test.site zu arbeiten :



RefineryCMS Installation


Alles ist ähnlich, unter Berücksichtigung der offiziellen Führung:

cd ~/web/refinerycms.test.site/public_html/
rbenv local 2.0.0-p643
gem install rails --version 4.1.8
gem install execjs
rails new . -m http://refinerycms.com/t/edge
gem install unicorn

Eine Einladungsseite zum Erstellen eines Administrators wartet, refinerycms.test.site/refinery :



Installieren Sie DjangoCMS


cd ~/web/djangocms.test.site/public_html
pyenv local 3.4.3
pip install djangocms-installer

Ein Dialog wird folgen. Wählen Sie "Languages" = "en, ru", "Twitter Theme" = "yes", "with examples" = "yes". Der Rest ist standardmäßig.

djangocms -p . project

Am Ende werden sie gebeten, das Login-Passwort und die Postanschrift anzugeben.

python manage.py cms  check  # check cms
pip install gunicorn

Und hier ist sie djangocms.test.site :


QUOKKA Installation


cd ~/web/quokka.test.site/public_html
git clone https://github.com/quokkaproject/quokka .
pyenv local 2.7.9
pip install -r requirements.txt
sed -i "s|^GRAVATAR.*$|&\n    'use_ssl': True,|" quokka/settings.py
python manage.py populate
python manage.py createsuperuser
ln -s quokka/static static
pip install gunicorn

Und hier ist das letzte Biest quokka.test.site :



Es ist erwähnenswert, dass Sie in PyEnv im Gegensatz zu RbEnv / RVM virtualenv erstellen können. Diese Dinge schließen sich nicht gegenseitig aus.
Ich hoffe, meine Installationsanleitung für verschiedene Webanwendungen war interessant.

Vielen Dank.

Abschließend die Katze


Jetzt auch beliebt: