Laravel 5.4 на хостинге Timeweb

Редакция автор: stain

Последние новости первыми
требования для Laravel 5.6: PHP >= 7.1.3 + модули
простой путь для ubuntu 16.04lts на vps/vds/локальном сервере

sudo add-apt-repository ppa:ondrej/php
sudo add-apt-repository ppa:ondrej/apache2
sudo apt update
apt-get install php7.2 #установить php7.2
sudo apt upgrade #обновиться
sudo a2dismod php7.0 #выключить php7.0
sudo a2enmod php7.2 #включить php7.2
sudo service apache2 reload #перезапустить apache2

#Установка лары 5.6
composer create-project - -prefer-dist laravel/laravel .
Удалить папку public_html и создать символическую ссылку на public
ln -s public public_html
#Далее надо выполнить две вещи в корне проекта
cp .env/example .env
php artisan key:generate
#выставить права, как указано ниже.
#После этого Лара заработает.

Чтобы не заливать вендоров туда сюда и иметь возможность работать с git(без его захламления)
положить на сайте hook

touch .git/hooks/post-receive
cat < .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'

if [ -e "composer.json" ];
 then
  if [ -d "vendor" ];
    then
      /opt/php7.2/bin/php -d memory_limit=500M ~/.utils/composer.phar install --no-dev
  else
      /opt/php7.2/bin/php -d memory_limit=500M ~/.utils/composer.phar update --no-dev
  fi
fi
git reset --hard

EOF
chmod +x .git/hooks/post-receive

====
Чтобы этот хук срабатывал нужно чтобы подтягивалась в консоли нужная версия php, для этого
положить композер в ~/.utils/
создать в корне сайта или всего хостинга файл .bash_profile с алиасом к нужной версии php, иначе вендоры не установятся.!!! НЕ ПОМОЖЕТ так как этот профиль запускается только если вы активный пользователь консоли. а в скрипте не выйдет, поэтому выше скрипт написан с полными путями php на текущий момент 2019/02/23? а вот composer придется залить например в ~/.utils, composer.phar хоть и присутствует в системе, но мало вероятно что вам позволят его обновлять.

cat < .bash_profile
alias composer='/opt/php7.2/bin/php -d memory_limit=500M ~/.utils/composer.phar'

EOF2

Как узнать где лежит нужня версия php
Вводим whereis php
По результам увидим нужные пути, например /opt/php70/bin/php
Запустить команду от php 7.0: /opt/php70/bin/php /путь/script.php

Все что ниже, предыдущие опыты, совершенно не актуальны, и по большей части ошибочны.

Composer уже стоит.
Создаю поддомен.
В настройках сайта ставлю по дефолтом php 7.
Вхожу через ssh в корень сайта public_html.
Выполняю команду:

composer create-project --prefer-dist laravel/laravel .

Вроде что то ставится, к сожалению выпадаю в ошибку после установки в момент конфигурации. Похоже дело в выбранной версии php. так и есть по умолчанию в консоли версия 5.3...! Чтобы успешно запустить скрипт artisan, нужно добавить расположение нужной консольной версии php в команду:

/opt/php7.0/bin/php artisan optimize

Не знаю нужно ли что то еще, надо проверять на локальной машине, чтобы знать наверняка, что после выполнения скрипта установка завершена. или смотреть код 🙂

Below are steps I've set on a hosting with cPanel without any changes in laravel_app:

check out/copy laravel_app code to your home, /home/your_user/laravel_app

set permissions:

chmod 755 /home/your_user/laravel_app/ 
chmod 755 /home/your_user/laravel_app/public/
chmod 644 /home/your_user/laravel_app/public/index.php 
chmod -R 777 /home/your_user/laravel_app/storage 
chmod -R 777 /home/your_user/laravel_app/bootstrap/cache 

create symlink

ln -s /home/your_user/laravel_app/public ~/public_html/laravel_app_public

create ~/public_html/.htaccess .htaccess

Options -Indexes

RewriteEngine On 
RewriteCond %{REQUEST_URI} !^/laravel_app_public/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ laravel_app_public/$1 
RewriteRule ^(/)?$ laravel_app_public/index.php [L] 

Чиним composer.json прописал в нем пути к php 7-мой версии (там аж 4 места для правки было), но все тщетно 🙂 Скрипт успешно исполняется, но ошибки в гуи не исчезают. Оказывается нужно сгенерировать ключ:

/opt/php7.0/bin/php artisan key:generate

По итогу.
Установил laravel в папку .laravel (чтоб не пересекалась с сайтами, хотя по сути получается что в ней будут храниться файлы сайта, в корень которого будет положена симлинка)
Правка файла composer.json чтобы команды корректно отрабатывали из консоли.
Запуск команды composer update для переактивации установленного с ошибкой конфигурирования laravel
Генерация ключей.

И вроде как все. Почти уверен что траблы не привязанного жестко php еще всплывут, так как скорее всего в процессе работы laravel со всем его комбайном обязательно обратится к консольной версии php.

P.S.: В стандартном мануале большая часть проблем описана. Так например траблы с ключом решаются переименованием файла env.example и там же описано как перегенерировать ключ, и при генерации файлик "env" с вписанным ключом появляется.

Так же там указано что следует дать полный доступ к bootstrap/cache.

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

Полезно знать:
Database.
Session.
Cache.
OAuth2 - Laravel Passport.
Laravel Elixir - api для работы с препроцессорами.
Инсталяция 5-той версии.
Объяснение основ.
Laravel проект в Docker контейнерах. Github project LaraDock.
Try-laravel online course.
Первоисточник английских вкраплений.

Комментариев: 0

Node.JS на timeweb.ru

Редакция автор: stain
nodejs

Node.js + Timeweb : Источник.

Второстепенный материал по ssh.

Последние версии для линукс лежат тут.
Информация о том какая версия текущая, а какая c LTS поддержкой там.

На сервере через SSH в папке пользователя

wget https://nodejs.org/dist/latest-v6.x/node-v6.9.4-linux-x64.tar.gz
tar xf node-v6.9.4-linux-x64.tar.gz
mv node-v6.9.4-linux-x64 nodejs
cd nodejs/bin

Проверка версии

./node -v

Добавить файлы .bash_profile и .bashrc в корень домашнего каталога пользователя
в которых прописать пути
alias node='~/nodejs/bin/node'
alias npm='~/nodejs/bin/npm'
export PATH=$PATH:~/nodejs/bin/

Перезайти по ssh
Проверить доступность

node -v

Все, теперь для всех доменов и поддоменов node.js доступен.

package.json в папке проекта можно сформировать командой

npm init

Желательно перед этим настроить git.

node.js.pdf
express js.pdf
Доки по модулям nodejs

Вы спросите причем тут Django, Perl, Ruby on Rail, Composer. Я по чести сказать и сам не догадываюсь.

Комментариев: 0

Гит-циклы и работа с хостингом Timeweb

Редакция автор: stain

Git поддержка: GitHub, SourceForge, BitBucket и Google Code.

Начало:

Эта команда создаёт в текущем каталоге новый подкаталог с именем .git содержащий все необходимые файлы репозитория — основу Git-репозитория. На этом этапе ваш проект ещё не находится под версионным контролем.

git init

Git Цикл №1: Индексируем, Подтверждаем, Заливаем.

Индексация - Добавляем новые и измененные данные. Если вы выполнили индексацию, то автоматически согласились с внесением изменений.

git add filename

, или для всех файлов каталога git add .

Делаем новый коммит(снапшот).

git commit -m "комментарий"

Да если добавить параметр -a, то предыдущую команду выполнять не нужно. Дополнительно для проверки состояния репозитария команда git status и более подробная git diff

Или все тоже но в одну строку

git init && git add -A && git commit -m "Initial commit"

Заливка на github.

Предварительно нужно создать на ресурсе github пустой репозиторий.
для справки origin - это название удаленного репозитория, на локальной машине.

git remote add origin git@github.com:loginname/objectname.git
git push -u origin master

Клонируем чужой репозиторий с того же github по ssh.

Создаем или выбираем каталог где будет храниться клон репозитория. В git заходим в выбранную папку.
На github находим нужный нам репозиторий, например jquery, выбираем тип подключения SSH(требуются ключи), забираем ссылку, перед ней вставляем git clone.

git clone git@github.com:jquery/jquery.git

Не Цикл: Заливка на хостинг timeweb.ru.

(утомился ломиться, но ура!).

На хостинге:

через ssh заходим в папку нашего сайта public_html
Инициализация репозитория на сервере, а затем так как мы работаем не с голым (bare) репозиторием, обязательно разрешим перезапись текущей ветки:

git init
git config receive.denyCurrentBranch ignore

естественно нужно все это делать в public_html или на уровень ниже, но надо понимать что распаковка изменений будет аналогично локальному репозитарию.
Хук который делает всю работу

touch .git/hooks/post-receive
cat << EOF > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
EOF
chmod +x .git/hooks/post-receive

теперь строка на клиентской машине, которая отвечает за правильный коннект к вашему удаленному репозиторию

git remote add --track master origin ssh://логин@сервер/~/каталогсайта/public_html/.git

Загрузка на целевой сервер основной ветки.

git push --set-upstream origin master

дальше ориентируйтесь на эту статью

Или складываем хуки.

Для выгрузки использовать

git add имяфайла
git commit -m "Ещё один коммит"
git push

Для конкуретного обновления файлов через SSH/FTP нужен еще один хук

touch .git/hooks/pre-receive
cat << EOF > .git/hooks/pre-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git stash save --quiet
git stash show || true
EOF
chmod +x .git/hooks/pre-receive

, но и поправить хук для выгрузки через ssh.

touch .git/hooks/post-receive
cat << EOF > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
git stash pop --quiet || git reset --hard
EOF
chmod +x .git/hooks/post-receive

В этой усложнённой схеме, в случае конфликтов при git push, вам нужно будет вручную сделать git stash pop на сервере и разрешить конфликты.

ЗЫ:

1. Важно, если ниже, ниже .... уровнем существует каталог .git, то git это видит.

2. если у вас не получилось корректно подключиться, можно удалить созданный вами удаленный репозиторий командой:

git remote remove origin

, в данном примере удаленный репозиторий назван origin

Безусловно еще нужно сделать ключи RSA, залить публичные на сервер. а на клиентской машине прописать конфиг, где будет указано для какого ресурса какие ключи.

Git Цикл №2: Создание и переход в новую ветку.

git checkout -b название ветки

Вернуться к ветке master

git checkout master

т.е. можно работать над какой то обособленной задачей, и если вдруг необходимо решить текущие задачи, то легко можно вернуться к основной ветке, или любой другой.

После решения задачи следует сделать слияние с основной веткой(без полного понимания не исполнять).

git merge названиеветки

После слияния с основной веткой и если задача для которой была создана ветка решена, следует удалить ветку в которой вы решали задачу.

git branch -d название ветки

Также если у вас несколько веток, и допустим нужно дополнить одну из второстепенных веток изменениями в ветке master, выполните

git merge master

Источник: Основы-ветвления-и-слияния

 

Git Цикл №3: Возврат к более раннему коммиту.

(состоянию, снапшоту).

Просмотр всех существующих коммитов

git log

но добавив параметры -p -2 , мы зададим первым показ изменений, а вторым глубину погружения на 2 ниже.

Теперь само удаление(откат)
Выбираем нужную ветку

git checkout названиеветки

делаем откат изменений в репозитории, для примера на два коммита назад

git reset --hard HEAD~2

Можно сделать до какого то определенного коммита по хешу

git reset --hard HEAD hash

Хеш можно взять в вебинтерфейсе гитхаба.

Далее делаем принудительный коммит в основной репо на удаленном сервере

git push -f origin названиеветки

без -f будет ругаться что у вас версия младше чем на сервере и типа вам надо сделать pull.

Источники: Как откатить коммиты, Git Wizardry.

Забыли произвести индексацию нестрашно, проведите ее после коммита, а затем выполните команду обновления коммита (она также позволяет отредактировать комментарий). Ниже показан весь цикл.

git commit -m 'initial commit'
git add forgotten_file
git commit --amend

Также можно отменить индексацию, если вы еще не провели операцию коммит

git reset HEAD имя файла

какие именно файлы попали в индексацию вы можете узнать с помощью команды git status.

Также можно отменить изменения файла, но нужно понимать что они исчезнут затрутся старым файлом из предыдущего коммита.

git checkout --имяфайла

Как забрать себе репозиторий с Timeweb

Все делается на локальной машине, выбирается папка приемник
в ней открывается консоль GIT

git init
git remote add --track master origin ssh://accountname@IP_server/~/project_folder/public_html/.git
# git fetch - -all #Это лишнее, это для копии текущего состояния без развертывания, чтобы можно было позже сделать слияние.
git pull

# Последующие разработчики, но тут загвоздка пользователь хостинга все же один.
git clone ssh://accountname@IP_server/~/project_folder/public_html/.git
# Проверил работает, но создает каталог public_html, что ломает работу с openserver, но простое перекидывание содержимого на уровень ниже решает проблему.

А если кто то менял файлы ручками на сервере, в истории git это не отобразится, чтобы сделать актуальным состояние в скачиваемых с сервера файлах посредством git, нужно зайти через консоль putty/ssh/или через админку и если полностью то

git add . && git commit -m "commit subject about change"

и уже после этого git pull на клиенте.

P.S.: Естественно у вас должна быть в домашней папке компьютера папка ~/.ssh, с ключем rsa, с конфигом в файле ~/.ssh/config.

Host IP_adress
HostName servername.timeweb.ru
User accountnametimeweb
IdentityFile /C/Users/localusername/.ssh/filenamekey

А на сервере в корне выданной хостером домашней папке, тоже каталог .ssh с публичным ключом вписанным в файл ~/.ssh/authorized_keys

Трабл слияния, если копошиться в одних и тех же файлах, и делать комиты не последовательно, то в итоге будут неразрешимые автоматически конфликты. Как вариант можно откатиться назад на несколько шагов, и забрать с сервера свежие файлы, или разгребать изменения и мерджить в ручную как пока не скажу. 😊 Пока что совет не работать в команде над одними и теми же файлами.

!!!После git pull требуется нажать клавишу insert вписать коммент к смерджованному комиту, затем esc, затем :w, что сохранит смерджованые данные, и по сути создаст следующий по счету коммит, после чего можно будет запушить свежий коммит обратно на сервер.

Как поступать с конфликтами при слиянии, и получается что если один файл в разных коммитах имеет разные дополнения, то сливать придется редактированием этого файла до состояния включающего все что вам в нем нужно, и последующей индексацией.
git add . или git add имяфайла
и затем git commit.

Скрипт инициализации git цикла на сервере, исключительно для shared хостинга Timeweb поскольку у него домашние каталоги хостящегося клиента выглядят так /home/u/username.

#!/bin/bash
#bash gitps.sh site user
if [ -z $1 ] ; then
echo «Do not set your domain name.»
exit 1 ; fi
if [ -z $2 ] ; then
username='im'
echo «Do not set your user name. Default name is ${username}» ; fi
if [ ! -d ~/$1/ ]; then
echo '«Site directory noexist! Script stoped.»'
exit 1; fi
if [ -d ~/$1/.git/ ]; then
echo '«Git directory exist, script stoped.»'
exit 1; fi

#git prepare
#subdomain.timeweb.ru
ipsrv='192.168.0.1'
sitename=$1
# $u is first character in username
u=$(echo $username | sed 's/^\(.\).*/\1/')

cd /home/$u/$username/$sitename

git init
git config receive.denyCurrentBranch ignore

touch .git/hooks/post-receive
cat < .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
EOF
chmod +x .git/hooks/post-receive

cd /home/$u/$username

echo ""
echo "«First webdev»"
echo '  «git init»'
echo '  «git add . && git commit -m "commit subject about change"»'
echo "  «git remote add --track master origin ssh://${username}@${ipsrv}/~/${sitename}/.git»"
echo '  «git push»'
echo ''
echo '«Other webdev»'
echo "  «git clone ssh://${username}@${ipsrv}/~/${sitename}/.git»"

Комментариев: 0