Развертывание на 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.