Марат Шамшутдинов, Наш первичный 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й версии - ваши действия?
ну вы оперировали преимуществом докера - можно обновлятся на продакшене без даунтайма. правда как вас за обновление на продакшене еще не уволили - загадка.
а я говорю что битрикс на даный момент позволяет установить на отдельной машине полную копию сайта или даже на той же машине - обновлять и тестировать и разрабатывать. никак не затрагивая рабочую копию сайта. и это без докера - круто не правда ли?
А каким образом сейчас быстро разворачивают копию битрикса на новой машине? (кроме физического переноса базы и файлов бекапа)
Роман Семёнов написал: ну вы оперировали преимуществом докера - можно обновлятся на продакшене без даунтайма. правда как вас за обновление на продакшене еще не уволили - загадка.
оО у вас прод правда не обновляется? Как вас за это еще не уволили я не понимаю. Я совершенно не имею отношения к докеру, но обновление серверов в проде тоже превращается в попаболь и downtime и это реальность. Даже не приложения, а хотя бы софта сервера после очередного обнаружения дыры в ssh к примеру. Я согласен с вами что сейчас и без докера все более мение круто в разработке, но с обновлением пока беда...
Роман Семёнов написал: ну вы оперировали преимуществом докера - можно обновлятся на продакшене без даунтайма. правда как вас за обновление на продакшене еще не уволили - загадка.
оО у вас прод правда не обновляется? Как вас за это еще не уволили я не понимаю. Я совершенно не имею отношения к докеру, но обновление серверов в проде тоже превращается в попаболь и downtime и это реальность. Даже не приложения, а хотя бы софта сервера после очередного обнаружения дыры в ssh к примеру. Я согласен с вами что сейчас и без докера все более мение круто в разработке, но с обновлением пока беда...
как докер помогает в обновлении на продакшене? только аргументировано пожалуйста
Николай Казаков написал: А каким образом сейчас быстро разворачивают копию битрикса на новой машине? (кроме физического переноса базы и файлов бекапа)
снова здророва.
я уже спрашивал как докер помогает быстро разворачивать копии битрикс? но мне только чтото промычали про то что надо создать образ и написать какойто скрипт. импортироание точно такое же в БД как и без докера - или докер внезапно ускоряет БД?
Все равно не вижу смысла в докере. Работаю из под винды, написал PS скрипт который копирует, заранее подготовленные образ с веб окружением от Вендера, и запускает виртуалку. Но это оказалось лишним, достаточно к себе на комп тянуть ветки из git, а на одной (!!!!!!) виртуалке разными виртуалхостами создаются разные проекты. На прод докер! вы издеваетесь?
ИМХО докер удобен для компилируемых языков и микросервисов. хранить базу в докере это халакост
Вы просто не умеете им пользоваться. Не буду вдаваться в подробности его определенных плюсов и тонкостей ибо надоело, это как об стенку горох.
Конкретно про ваш случай. Судя по описанию вы не тестируете на разных версиях РНР, MySQL свой код, от слова совсем, раз у вас только 1 виртуалка и та от вендора. На счет БД, вам религия помешала вытащить файлы БД например на внешний диск в то время как управления будет происходить из контейнера, скажем на основном диске?
Ну и напоследок, предположим у вашего клиента корпоративный стандарт Red Hat Enterprise и менять он его не будет. Ваши действия по окружению, тоже от вендора поставите?
Не совсем в кассу, но вроде все отлично завел с php 7.1, mysql 5.7. Сейчас пытаюсь выбить максимальное число баллов по производительности. Если таки получится быть докеру в проде, вполне отличная идея. Все команды и конфиги можно кинуть в один Makefile, который будет и дампить и разворачивать, хотя лучше, конечно, посмотреть в сторону CI.
Олег Шамаев написал: Наверное сначала стоит себе и коллегам объяснить зачем это нужно вообще. По мне так это звучит как докер ради докера, без какой либо практической пользы.
Ну опишу немного чего я использую 1-2 года.
В бою. LXС + BitrixVM
В разработке пред. показ и локально (linux, win10) docker + caddyserver + php-fpm
Кроме преимуществ самого докера, замечено следующее.
Меньше ест ресурсов.
Быстрей проводятся сервисные операции (перезапуск, обновление, смена окружения и т.д.)
Проще организовать метрики и телеметрию.
Ну админы просто в восторге.
Разработчикам проще манипулировать копиями контейнеров нежели виртуальными машинами.
Вы просто не умеете им пользоваться. Не буду вдаваться в подробности его определенных плюсов и тонкостей ибо надоело, это как об стенку горох.
Конкретно про ваш случай. Судя по описанию вы не тестируете на разных версиях РНР, MySQL свой код, от слова совсем, раз у вас только 1 виртуалка и та от вендора. На счет БД, вам религия помешала вытащить файлы БД например на внешний диск в то время как управления будет происходить из контейнера, скажем на основном диске?
Ну и напоследок, предположим у вашего клиента корпоративный стандарт Red Hat Enterprise и менять он его не будет. Ваши действия по окружению, тоже от вендора поставите?
Подождите! Речь идет о разработке? Причем тут тестирование? Да мне без разницы на чем там клиент запускает, это работа devopsа! моя задача заявить требования к версиям. docker на прод... до первого краша))) вспомните ещё
Подождите! Речь идет о разработке? Причем тут тестирование? Да мне без разницы на чем там клиент запускает, это работа devopsа! моя задача заявить требования к версиям.
Вы код пишете на глазок? Работает не работает, пусть DevOps парится? Таражные решения также пишете? "У меня работает на РНР 7.0.3, а на все остальное мне на чхать"?
Цитата
Да мне без разницы на чем там клиент запускает, это работа devopsа! моя задача заявить требования к версиям.
Более полутора лет в проде, и полет нормальный, и с "мертвых" инстансов поднимали в новом месте. ЧЯДНТ?
Mikhail Kryachek написал: Более полутора лет в проде, и полет нормальный, и с "мертвых" инстансов поднимали в новом месте. ЧЯДНТ?
Присоединяюсь - 1,5 года на проде без проблем.
Цитата
Денис Филимонов написал: Подождите! Речь идет о разработке? Причем тут тестирование? Да мне без разницы на чем там клиент запускает, это работа devopsа! моя задача заявить требования к версиям.
Видимо, вы не сталкивались с ситуацией, когда у вас несколько проектов и все они на разных php, mysql и пр. А если и сталкивались, то вам, видимо, ваш девопс тестовое окружение настраивал. В таком случае не засоряйте ветку, она не для вас. Понимая Docker (на русском) - ссылка для общего развития. Если вы на "нормальной" IDE работаете, например, phpstorm, то вашей компании не нужен девопс, а продакшен на арендованных мощностях работает по заявленным вами требованиям. Живой пример: в работе 9 проектов, из них 6 на wordpress (php7), 1 на битрикс (php 5.6, т.к. ядро старое), 1 VBulletin (php 5.3), 1 Drupal (php 5.3). Вы, чтобы это у себя для разработки поднять, будете искать девопса, а я настроил докер. Пример конфига на 1 сайт тестового окружения:
Александр Михайлов написал: Живой пример: в работе 9 проектов, из них 6 на wordpress (php7), 1 на битрикс (php 5.6, т.к. ядро старое), 1 VBulletin (php 5.3), 1 Drupal (php 5.3).
ну да тут соглашусь - если держать всякое гов*но кроме битрикс то докер пригодится.
Условия: Имеем 1 клиента с Битрикс 17.5, 2 клиента с Битрикс 17, 4 клиента с Битрикс 14 и 2 Клиента с Битрикс 11. Задача: "завести" все это не гов*но
ЗЫ. никто из клиентов обновляться не будет.
странно это - тогда ваиши клиенты должны быть настолько богаты, что на индивидуальную тех. поддержку выкладывают деньги. (веть и битрикс и партнеры не оказывают никакой тех.поддержки в случае устаревшей версии и несоответсвия требуемому окружению и вам приходится все самим чинить и поддерживать) в итоге вам должно хватать на отдельные сервера и на сервера каждому разработчику и на девопсов - а вы хостите этот зоопарк на одной машине
Вот оно что, т.е. если клиент по тем или иным причинам не хочет обновляться, то вы не предоставляете поддежки и выгояете со своего "супер" сервера. Все с вами ясно, удачи вам с вашим "не гов*ном"