Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения

вторник, 4 февраля 2025 г.

Маленький веб сервер

Встроенный веб-сервер php

cd ~/public_html

sudo php -S localhost:80


Средствами nc

http://хост netcat:80/index.html. Для использования стандартного порта веб-сервера под номером 80 необходимо запустить nc c root привелегиями:

while true; do sudo nc -lp 80 < index.html; done

суббота, 31 декабря 2022 г.

yii2 docker-compose.yml



На старте уже должны стоять docker, docker-compose, php и php-composer.

Создаем папку с проектом и в ней папку docker.


mkdir lk_site

cd lk_site && mkdir docker

cd docker


В папке docker создаем файл docker-compose.yml для поднятия окружения разработки.


vim docker-compose.yml

 

start____________________________________________________________

# Последняя версия docker-compose

version: '3'


# Создаем общую сеть deafult для всех контейнеров

networks:

  default:

    driver: bridge

services:

  web:

    build: ./web

    # Подключаем к общей сети с другими контейнерами

    networks: 

       - default

    # Запускаем только после db

    depends_on: 

      - db    

    # Линкуем внешнюю папку с исходниками внутрь

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

      - "../conf/apache2:/etc/apache2/sites-available"

    ports:

      - 8085:80

    working_dir: ${APP_PATH_CONTAINER}

  db:

    image: mariadb

    # Подключаем к общей сети с другими контейнерами

    networks: 

      - default

    restart: always

    environment:

      MARIADB_ROOT_PASSWORD: example

      MARIADB_DATABASE: yii2db

      MARIADB_USER: userdb

      MARIADB_PASSWORD: secret

    volumes:

      - ${DB_PATH_HOST}:/var/lib/mysql

  adminer:

    image: adminer

    restart: always

    ports:

      - 8088:8080 

  composer:

    image: composer:2.0.8

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}

    command: composer install

  nvim:

    build: ./nvim

    tty: true

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}


end____________________________________________________________

    

В папке docker создаем файл .ENV

vim .ENV


start____________________________________________________________

#PATHS

DB_PATH_HOST= ../databases

APP_PATH_HOST= ../www

APP_PATH_CONTAINER= /var/www/html/

end____________________________________________________________


В папке web создаем файл конфигурации нашего контейнера Dockerfile.

    

mkdir web

cd web


vim Dockerfile


start____________________________________________________________

FROM php:7.4-apache


# Install system dependencies

RUN apt-get update && apt-get install -y \

    curl \

    libpng-dev \

    libonig-dev \

    libxml2-dev \

    zip \

    unzip


# Clear cache

RUN apt-get clean && rm -rf /var/lib/apt/lists/*


# Install PHP extensions

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# gd with-freetype требуется для капчи в yii2. После для проверки "php -r 'var_dump(gd_info());'"

RUN docker-php-ext-configure gd --with-freetype   && docker-php-ext-install gd


WORKDIR /var/www/html/

end____________________________________________________________


В папке nvim создаем файл конфигурации нашего контейнера Dockerfile astronvim.

    

cd .. && mkdir nvim

cd nvim


vim Dockerfile


start____________________________________________________________

FROM alpine:edge


# Install system dependencies

RUN apk add bash git lua nodejs npm lazygit bottom python3 go neovim ripgrep alpine-sdk --update


RUN git clone https://github.com/AstroNvim/AstroNvim ~/.config/nvim


RUN nvim --headless -c "autocmd User PackerComplete quitall"


WORKDIR /var/www/html/

end____________________________________________________________



Для apache2 создаем папку lk_site/conf/apache2 и файл 000-default.conf в ней. Файлик может изменяться, в зависимости от того, как вы хотите настроить apache2 на своем проекте. Его можно менять локально, т.к. он подключается через volume. Но надо не забывать внутри контейнера перезагружать apache2: service apache2 reload


cd ../.. && mkdir conf

cd conf && mkdir apache2

cd apache2


vim 000-default.conf


start____________________________________________________________

<VirtualHost *:80>                                                                              

        ServerName lk.site.ru


        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>

end____________________________________________________________


Все команды выполняются из корневой папки.


cd ..


Выполняем команду создания проекта:

composer create-project --prefer-dist yiisoft/yii2-app-advanced:2.0.47 www


В файле composer.json меняем это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org"

        }

    ]

на это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org",

            "options": {

            "ssl": {

          "verify_peer": false

            }

            }

        }

    ]


Запускаем окружение:

docker-compose -f docker/docker-compose.yml up -d --build


Инициализируем проект:

www/init --env=Development --overwrite=All


Открываем в редакторе файл www/common/config/main-local.php и заполняем его данными для подключения к БД.


Подключаемся к контейнеру:

docker exec -it docker_web_1 bash


Выполняем команду миграции БД:

php /var/www/html/yii migrate


Создаем папку для логов mkdir /var/www/html/log


И выходим exit



Тормозим сервис:

docker-compose -f docker/docker-compose.yml down


Запускаем его заново:

docker-compose -f docker/docker-compose.yml up -d


Открываем localhost:8085 в браузере и смотрим на новый сайт.


Шпаргалка:

Из папки doker

docker-compose ps - вывести список контенеров в папке docker

docker-compose stop web

docker-compose stop db

docker-compose rm web - удуалить



Применение

Основные команды для Docker:


docker-compose up -d

чтобы запустить все службы в вашем стеке в фоновом режиме


docker-compose ps

вывести список запущенных сервисов


docker-compose logs -f

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


docker-compose stop

чтобы изящно остановить все службы в вашем стеке


docker-compose kill

немедленно остановить все службы в вашем стеке


docker-compose down -v

чтобы остановить и удалить все службы, помните о потере данных, когда не используются хост-тома


Для запуска команд в контейнере


docker-compose run --rm web composer install

запускает установку композитора в новом контейнере


docker-compose exec web bash

выполняет bash в запущенной php службе

понедельник, 18 января 2016 г.

Копирование сайта с тестового сервера на удаленный сервер

Захотел заказчик видеть как продвигается его проект.
Настраиваем разворачивание бекапов с рабочего сервера на удаленный.

  • user - это имя Вашего пользователя в системе
  • dbsupersait - имя базы данных сайта

Удаляем старые бэкапы
nano /home/user/cron/delbackup.sh

 #!/bin/bash
 rm /home/user/Yandex.Disk/*.tar.*
 rm /var/www/supersait/bitrix/backup/*.tar.*
 echo "Старые бэкапу удалены"

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log

Создаем новый бэкап средствами Bitrix Для этого добавляем еще одно задание в cron на тестовом серваке
crontab -eu user
0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php  >> /var/log/watchdog-backup.log

Копируем бэкапы в Yandex.Disk
nano /home/user/cron/copyBackup.sh

 #!/bin/bash
 cp /var/www/supersait/bitrix/backup/*.tar.* /home/user/Yandex.Disk/
 chmod 777 /home/user/Yandex.Disk/*.tar.*
 yandex-disk sync
 yandex-disk status
 echo "Копирование бэкапов в облако завершено"
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

И так. На тестовом серваке у нас три задания.
crontab -lu user

 0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php >>  /var/log/watchdog-backup.log
 0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log
 0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

Теперь на удаленном сервере добавляем скрипт разворачивания сайта в крон
nano /home/user/cron/restorebitrix.sh

 #!/bin/bash
 FILE=$(date +"%Y%d%m_%H%M")
 yandex-disk sync >> /var/log/siterestore/$FILE.log
 yandex-disk status >> /var/log/siterestore/$FILE.log
 chmod 777 /home/user/Yandex.Disk/*.tar.* >> /var/log/siterestore/$FILE.log
 echo "Копирование бэкапов в облако завершено" >> /var/log/siterestore/$FILE.log
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

 rm -rf /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Удален корневой каталог сайта" >> /var/log/siterestore/$FILE.log

 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Удаление Базы MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "drop database dbsupersait" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Создаем новую базу MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "create database dbsupersait" >> /var/log/siterestore/$FILE.log

 mkdir /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Создан каталог кореня сайта с владелбцем www-data:www-data и правами 7777" >> /var/log/siterestore/$FILE.log
 echo "Копируем бекап в корень сайта" >> /var/log/siterestore/$FILE.log

 cp /home/user/Yandex.Disk/*.tar.* /var/www/supersait >> /var/log/siterestore/$FILE.log
 chown -hR www-data:www-data /var/www/supersait >> /var/log/siterestore/$FILE.log
 chmod -R 777 /var/www/supersait >> /var/log/siterestore/$FILE.log
 cd /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Извлечение из архива" >> /var/log/siterestore/$FILE.log
 cat *.* | tar xzv >> /var/log/siterestore/$FILE.log
 echo "восстановление дампа базы данных" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль dbsupersait < /var/www/supersait/bitrix/backup/*full_????????.sql

 sed 's/'"'"'database.*/'"'"'database'"'"' => '"'"'dbsupersait'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'login.*/'"'"'login'"'"' => '"'"'root'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'password.*/'"'"'password'"'"' => '"'"'пароль'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php

 sed 's/$DBLogin.*/$DBLogin = "root";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBName.*/$DBName = "dbsupersait";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBPassword.*/$DBPassword = "пароль";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log

 echo "Удаление служебной информации" >> /var/log/siterestore/$FILE.log
 rm /var/www/supersait/*.tar.* >> /var/log/siterestore/$FILE.log
crontab -eu user

На удаленном серваке у нас одно задание.
crontab -lu user
0 23 * * * /home/user/cron/restorebitrix.sh >> /var/log/wathcdog-backup.log

понедельник, 30 ноября 2015 г.

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.

tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

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

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.
tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

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

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

Split / разбить dump

//Разбить дамп по 50000 строк for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sq...