Развертывание на VPS веб-сайта с помощью Git

Речь пойдет о том, как используя Git, перенести файлы готового сайта с локального компьютера на удаленный веб-сервер и обновлять онлайн-версию сайта при внесении изменений в него на своем локальном компьютере.

Это перевод с небольшими дополнениями и изменениями основной части (с 1:40) данного видео на Youtube на случай, если оно будет удалено. Это единственный найденный рабочий вариант простого переноса/обновления.

Предполагается, что сам git (как системная утилита) уже установлен на обоих компьютерах и выполнена его настройка (заданы имя и почта пользователя).

Первое, что надо сделать, это на удаленном веб-сервере создать так называем "голый" (bare) git-репозиторий. Каталог такого репо не содержит файлы вашего проекта. Но он сохраняет сведения о версиях каждый раз, когда вы выполняете пуш. Для голого репозитория команда git status не работает, git log работает.

Зайдите на свой VPS:

$ ssh root@flask.website

(Вместо flask.website, то есть домена, привязанного к IP, может находиться сам IP-адрес. Также пользователь может быть другим.)

Допустим, программный веб-сервер (в нашем случае Apache) настроен так, чтобы направлять запросы к сайту https://flask.website в каталог /var/www/flask.website/ (предполагается, что каталог уже был создан ранее).

Создадим другой каталог. В нем будут храниться файлы git, обслуживающие сайт, и перейдем в него:

# mkdir -p /var/repo/flask.website.git
# cd /var/repo/flask.website.git

(место размещения произвольное)

Создаем репозиторий:

# git init --bare

Переходим в его подкаталог hooks:

# cd hooks

Здесь создаем хук post-receive. Открываем файл в редакторе, например, vim:

# vim post-receive

В файле укажем (i), что данный репозиторий связан с каталогом нашего сайта:

#!/bin/sh
git --work-tree=/var/www/flask.website --git-dir=/var/repo/flask.website.git checkout -f

Сохраняем и выходим (Esc → :wq → Enter).

Файл надо сделать исполняемым:

# chmod +x post-receive

Завершаем сеанс работы на удаленном веб-сервере:

# exit

(или открываем другую вкладку терминала локального компьютера)

Пусть готовый к выгрузке на сервер сайт находится в папке static, и мы в нее перешли.

Если вы создавали скрипт локального сервера (файл local_server.py), он не нужен на удаленном. Чтобы исключить его из репозитория, создадим файл .gitignore, вписав в него имя файла локального сервера:

local_server.py

Также, если на VPS в качестве сервера используется Apache, создадим файл .htaccess и запишем в него команды перенаправления с адресов без расширения на наши файлы с .html, а также редирект, если в адресной строке будет указано расширение (это имеет значение для поисковой оптимизации).

# При изменении настроек в этом файле перезагрузки веб-сервера не требуется.</p>

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.html[?\ ]
RewriteRule (.*)\.html$ /$1 [R=301,L]

Вместо создания .htaccess данные команды можно было бы вписать в файл системных настроек Apache для конкретного сайта. Пример содержимого этих файлов для работы со статичным сайтом, а не flask-приложением приведен в конце этой статьи.

Итак, мы находимся в каталоге static. Если git-репозитория здесь еще нет, его надо создать (не "голый", а обычный):

$ git init

Свяжем его с удаленным:

$ git remote add live ssh://root@flask.website/var/repo/flask.website.git

Назвать удаленный репо можно произвольно, не обязательно live.

Если коммитов нет, создаем:

$ git add .
$ git commit -m "Первый коммит"

Пушим его на удаленный сервер:

$ git push live master

Если будет только один удаленный репозиторий, то можно выполнить команду

$ git push -u live master

Тогда все последующие коммиты отправляются командой

$ git push

Обратите внимание, что сайт может не работать, так как на удаленном сервере права на каталог сайта и его содержимое будут у пользователя root. Для смены пользователя на удаленном веб-сервере надо выполнить команду:

# chown -R www-data:www-data /var/www/flask.website

Примеры настроек сайта в каталоге /etc/apache2/sites-available при условии уже выпущенного сертификата безопасности HTTPS. Для порта 80:

<VirtualHost *:80>
    ServerName flask.website
    ServerAlias www.flask.website

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/flask.website
    
    <Directory /var/www/flask.website/>
        Options All -Indexes
            AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.flask.website [OR]
RewriteCond %{SERVER_NAME} =flask.website
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Для порта 443:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName flask.website
    ServerAlias www.flask.website

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/flask.website

    <Directory /var/www/flask.website/>
        Options All -Indexes
            AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.flask.website
RewriteRule ^ https://flask.website%{REQUEST_URI} [R=301,L]

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/flask.website/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/flask.website/privkey.pem
</VirtualHost>
</IfModule>

После внесения изменений потребуется перезапустить Apache.

Flask для начинающих




Все разделы сайта