Марат Шамшутдинов, Наш первичный entrypoint для php-fpm (я его слегка почистил) выглядел вот так
Код
#!/bin/bash
APPLICATION_DIR="{application_dir}"
APPLICATION_DOMAIN="{application_domain}"
APPLICATION_FROM="{application_from}"
MYSQL_DATABASE="{mysql_database}"
MYSQL_USER="{mysql_user}"
MYSQL_PASSWORD="{mysql_password}"
APPLICATION_FROM_SOURCE=${APPLICATION_FROM:0:5}
APPLICATION_FROM_SOURCE=${APPLICATION_FROM_SOURCE,,}
#todo: add error\exceptions
function destinationExists(){
local EXIST=$(wget -s -q $1 -O - 2>&1 | grep 'HTTP')
if [ -z "${EXIST}" ]; then
echo "true"
else
echo "false"
fi
}
if [ ${APPLICATION_FROM_SOURCE} = "https" ] || [ ${APPLICATION_FROM_SOURCE} = "http:" ]; then
APPLICATION_FROM_SOURCE="archive"
else
APPLICATION_FROM_SOURCE="git"
fi
###BITRIX###
#################################
# Bitrix not installed
if [ ! -d "${APPLICATION_DIR}/bitrix" ]; then
# Fr om archive
if [ ${APPLICATION_FROM_SOURCE} = "archive" ]; then
EXISTS=true
COUNTER=0
# Download
while [ ${EXISTS} = true ]
do
URL=${APPLICATION_FROM}
if (( ${COUNTER} > 0 )); then
URL+=".${COUNTER}"
fi
EXISTS=$(destinationExists "${URL}")
if [ ${EXISTS} = true ]; then
wget ${URL} -P ${APPLICATION_DIR}
fi
let COUNTER=COUNTER+1
done
# Full archive name without path
ARCHIVE="${APPLICATION_FROM##*/}"
# Archive name without .tar.gz
ARCHIVE_NAME="${ARCHIVE::-7}"
# Prepare archive
cat ${APPLICATION_DIR}/${ARCHIVE}* > ${APPLICATION_DIR}/archive.tar.gz
rm -rf ${APPLICATION_DIR}/${ARCHIVE}*
# Extract
tar -xzf ${APPLICATION_DIR}/archive.tar.gz -C ${APPLICATION_DIR}
# Delete archive
rm ${APPLICATION_DIR}/archive.tar.gz
# Copy database file to root folder
if [ -f "${APPLICATION_DIR}/bitrix/backup/${ARCHIVE_NAME}.sql" ]; then
mv ${APPLICATION_DIR}/bitrix/backup/${ARCHIVE_NAME}.sql ${APPLICATION_DIR}/bitrix.sql
fi
if [ -f "${APPLICATION_DIR}/bitrix/backup/${ARCHIVE_NAME}_after_connect.sql" ]; then
mv ${APPLICATION_DIR}/bitrix/backup/${ARCHIVE_NAME}_after_connect.sql ${APPLICATION_DIR}/bitrix_after_connect.sql
fi
# From git repository
else
# Clone
shopt -s dotglob \
&& find . -mindepth 1 -delete \
&& git clone --depth 1 ${APPLICATION_FROM} ${APPLICATION_DIR} \
&& rm -rf ${APPLICATION_DIR}/.git \
&& shopt -u dotglob
fi
# Upd ate after_connect_d7.php if exists
if [ -f "${APPLICATION_DIR}/bitrix/php_interface/after_connect_d7.php" ]; then
sed -i "s@utf8@utf8mb4@g" ${APPLICATION_DIR}/bitrix/php_interface/after_connect_d7.php
fi
# Update after_connect.php if exists
if [ -f "${APPLICATION_DIR}/bitrix/php_interface/after_connect.php" ]; then
sed -i "s@utf8@utf8mb4@g" ${APPLICATION_DIR}/bitrix/php_interface/after_connect.php
fi
# @todo add escape for password
if [ -f "${APPLICATION_DIR}/bitrix/php_interface/dbconn.php" ]; then
sed -i -E "s|\\\$DBHost.+|\\\$DBHost = \"mysql\";|g" ${APPLICATION_DIR}/bitrix/php_interface/dbconn.php \
&& sed -i -E "s|\\\$DBName.+|\\\$DBName = \"${MYSQL_DATABASE}\";|g" ${APPLICATION_DIR}/bitrix/php_interface/dbconn.php \
&& sed -i -E "s|\\\$DBLogin.+|\\\$DBLogin = \"${MYSQL_USER}\";|g" ${APPLICATION_DIR}/bitrix/php_interface/dbconn.php \
&& sed -i -E "s|\\\$DBPassword.+|\\\$DBPassword = \"${MYSQL_PASSWORD}\";|g" ${APPLICATION_DIR}/bitrix/php_interface/dbconn.php
# Switch on MySQLi
if ! (( $(grep -wc "BX_USE_MYSQLI" "${APPLICATION_DIR}/bitrix/php_interface/dbconn.php") > 0 )); then
sed -i "s@<?@<?php\ndefine(\"BX_USE_MYSQLI\", true);\n?><?@1" ${APPLICATION_DIR}/bitrix/php_interface/dbconn.php
fi
fi
if [ -f "${APPLICATION_DIR}/bitrix/.settings.php" ]; then
sed -i "s@//#docker@@g" ${APPLICATION_DIR}/bitrix/.settings.php \
&& sed -i -E "s@'host' =>.+,@'host' => 'mysql',@g" ${APPLICATION_DIR}/bitrix/.settings.php \
&& sed -i -E "s@'database' =>.+,@'database' => '${MYSQL_DATABASE}',@g" ${APPLICATION_DIR}/bitrix/.settings.php \
&& sed -i -E "s@'login' =>.+,@'login' => '${MYSQL_USER}',@g" ${APPLICATION_DIR}/bitrix/.settings.php \
&& sed -i -E "s@'password' =>.+,@'password' => '${MYSQL_PASSWORD}',@g" ${APPLICATION_DIR}/bitrix/.settings.php \
# Switch on MySQLi
sed -i -E "s@MysqlConnection@MysqliConnection@g" ${APPLICATION_DIR}/bitrix/.settings.php
fi
fi
#################################
###DNS###
#################################
# Se t IP for requests to self
if [ ${APPLICATION_DOMAIN} != "_" ]; then
while [ -z $(dig +short nginx) ]
do
sleep 2
done
NGINX_IP=$(dig +short nginx | head -1)
echo "${NGINX_IP} ${APPLICATION_DOMAIN}" >> /etc/hosts
fi
#################################
###DB###
#################################
if [ -f "${APPLICATION_DIR}/bitrix.sql" ]; then
# Wait until DB will be available
while [ -z $(dig +short mysql) ]
do
sleep 2
done
# Check if DB is empty 0 - empty; !0 - some tables exists
MYSQL_EMPTY=$(mysql -hmysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" -sse "sel ect count(*) fr om information_schema.tables wh ere table_schema = '${MYSQL_DATABASE}';" | sed s/[^0-9]*//)
# Import DB if DB is empty and import SQL file exists
if [ ${MYSQL_EMPTY} = "0" ]; then
mysql -hmysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" ${MYSQL_DATABASE} < ${APPLICATION_DIR}/bitrix.sql
# Delete sensitive SQL data
if [ -f "${APPLICATION_DIR}/bitrix.sql" ]; then
rm -rf ${APPLICATION_DIR}/bitrix.sql
fi
if [ -f "${APPLICATION_DIR}/bitrix_after_connect.sql" ]; then
rm -rf ${APPLICATION_DIR}/bitrix_after_connect.sql
fi
fi
fi
#################################
###END###
# Run PHP-FPM
php-fpm
- каким образом версия PHP влияет на штатное api bitrix которое реализовано под php 5.3 ?
1. Сделайте поиск по коду Битрикса "/bug.php" и увидите сколько есть "костылей" для того чтобы пофиксить те или иные баги РНР. И это только те, которые не получилось обойти более красивым образом. Отсюда вывод, что самим тоже надо тестировать, особенно в самых популярных версиях РНР. 2. Передаю пламенный привет версии РНР 7.1, которая более менее стала стабильно работать спустя пол года с официального релиза 3. Передаю напалмовый привет версии РНР 7.2, на которой битрикс не заведется в нынешнем его виде в принципе 4. Передаю злобный привет будущей версии 7.3, где Битриксу придется "выпилить" все свои костыли связанные с mbstring, собственно как и всем остальным разработчикам которые надеялись на эту фичу.
Цитата
- каким образом версия mysql влияет на на штатное api D7 а в основом вообще только api инфоблоков bitrix которое не предполагает прямых запросов?
1. Передаю привет MySQL 5.7 и всем его форкам, в особенности тем, кто воспользовался "сомнительной" поддержкой handlersocket от Битрикса, ибо handlersocket просто выпилили из версии 5.7. Хотя, с другой стороны, handlersocket Битриксом не поддерживается на должном уровне, ибо там баг багом погоняет, не смотря на заявления вендора https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=5746
Цитата
- каким образом доукер решает вышеназванные проблемыс несовместимостями на хостингах где докера нет впринципе (либо шаред-хостинг либо готовое bitrix окружение)?
Как минимум докер позволяет быстро развернуть окружение и все протестировать и производить относительно плавный переход с версии на версию и при необходимости откатываться назад. Хотел бы я посмотреть как вы будете откатываться назад, используя Битрикс окружение когда что-то пошло не так, особенно когда даунтайм не должен превышать 10 минут, покажите нам мастеркласс.
возможно стоит прочитать рекомендации к платформе bitrix. прежде чем обновляться на свежие версии php mysql etc. так же в админке есть раздел Проверка системы.
Mikhail Kryachek написал: 1. Производительность2. Новые языковые возможности3. Безопасность\Багфиксы, например для 5.3 никто и ничего исправлять не будет.итд итпИ вправду, зачем, сидели бы на 3й версии РНР и не выпендривались бы...
иначе я не понимаю как вы использовали эти хваленые новые возможности. наиболее полезное это генераторы - но битриксовое api даже итераторов не использовало. олдскул while-цикл повсюду для перебора элементов выборки.
веть только сейчас с официальной поддержкой новых версий php это как то может отразится использовании этих новых возможностей в своей разработке.
Mikhail Kryachek написал: Хотел бы я посмотреть как вы будете откатываться назад, используя Битрикс окружение когда что-то пошло не так, особенно когда даунтайм не должен превышать 10 минут, покажите нам мастеркласс.
вы используете докер для обновлений на продакшене ? я вам сочуствую.
вы не поверите - но сейчас можно поднять копию сайта и там обновить окружение и протестировать сайт и все это никак не затрагивая рабочий сайт и без использования докера и откатов назад.
возможно стоит прочитать рекомендации к платформе bitrix. прежде чем обновляться на свежие версии php mysql etc. так же в админке есть раздел Проверка системы.
А чем рекомендации помогут? Вы можете назвать поверсионно вплоть до минорной версии когда Битрикс полноценно без ошибок стал поддерживать PHP5.5.x/5.6.x/7.0.x/7.1.x ? А если клиенту хочется обновиться с PHP 5.5 до 7.0.x но у него нет последних обновлений - ваши действия? У клиента отдел безопасности, который требует обновиться до 7й версии - ваши действия?
Ваш перфекционно сферический вакуум здесь не работает от слова совсем. Удивительно, не правда ли?
Цитата
вы код ядра чтоли правили все это время?
При необходимости правили. Да, и сейчас приходится править не зависимо от версий ПО. Передаю пламенный привет поддержке handlersocket от Битрикс. Да и "полезностей" в новых версиях куда больше, чем просто генераторы, очень прискорбно что вы их либо не знаете, либо не умеете использовать.
Это надо было делать еще несколько лет назад, и актуализировать каждый год, как минимум. На счет 5.6 вас не напрягает, что поддержки данной версии уже нет, кроме ошибок безопасности?
Цитата
вы используете докер для обновлений на продакшене ? я вам сочуствую.
А вы используете BitrixVM? То мне вас еще больше жаль
Цитата
вы не поверите - но сейчас можно поднять копию сайта и там обновить окружение и протестировать сайт и все это никак не затрагивая рабочий сайт и без использования докера и откатов назад.
Тут вопрос времени, сколько займет времени протестировать проект, например CRM на 5.6\7.0\7.1? час? два? день? у нас это занимает 1-2 часа с нуля. Время=Деньги
Особенно интересно посмотреть как вы все это будет делать, когда у клиента корпоративный стандарт suse enterprise или debian итд.
возможно стоит прочитать рекомендации к платформе bitrix. прежде чем обновляться на свежие версии php mysql etc. так же в админке есть раздел Проверка системы.
А чем рекомендации помогут? Вы можете назвать поверсионно вплоть до минорной версии когда Битрикс полноценно без ошибок стал поддерживать PHP5.5.x/5.6.x/7.0.x/7.1.x ? А если клиенту хочется обновиться с PHP 5.5 до 7.0.x но у него нет последних обновлений - ваши действия? У клиента отдел безопасности, который требует обновиться до 7й версии - ваши действия?
ну вы оперировали преимуществом докера - можно обновлятся на продакшене без даунтайма. правда как вас за обновление на продакшене еще не уволили - загадка.
а я говорю что битрикс на даный момент позволяет установить на отдельной машине полную копию сайта или даже на той же машине - обновлять и тестировать и разрабатывать. никак не затрагивая рабочую копию сайта. и это без докера - круто не правда ли?
возможно стоит прочитать рекомендации к платформе bitrix. прежде чем обновляться на свежие версии php mysql etc. так же в админке есть раздел Проверка системы.
А чем рекомендации помогут? Вы можете назвать поверсионно вплоть до минорной версии когда Битрикс полноценно без ошибок стал поддерживать PHP5.5.x/5.6.x/7.0.x/7.1.x ? А если клиенту хочется обновиться с PHP 5.5 до 7.0.x но у него нет последних обновлений - ваши действия? У клиента отдел безопасности, который требует обновиться до 7й версии - ваши действия?
ну вы оперировали преимуществом докера - можно обновлятся на продакшене без даунтайма. правда как вас за обновление на продакшене еще не уволили - загадка.
а я говорю что битрикс на даный момент позволяет установить на отдельной машине полную копию сайта или даже на той же машине - обновлять и тестировать и разрабатывать. никак не затрагивая рабочую копию сайта. и это без докера - круто не правда ли?
А каким образом сейчас быстро разворачивают копию битрикса на новой машине? (кроме физического переноса базы и файлов бекапа)