Сборка своего Dockerfile c PHP 5.3 + ioncube + memcache

Понадобилось собрать образ с PHP 5.3 + ioncube + memcache для развертывания древнего сайта на новом сервере, получилось как-то так:

Dockerfile

FROM ubuntu:12.04
MAINTAINER Alexander Schenkel <alex@alexi.ch>

VOLUME ["/var/www"]

RUN apt-get update && \
    apt-get install -y \
      wget \
      apache2 \
      php5 \
      php5-cli \
      libapache2-mod-php5 \
      php5-gd \
      php5-ldap \
      php5-mysql \
      php5-pgsql \
      php5-memcached \
      php5-memcache

#install ioncube
RUN wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
RUN tar xvfz ioncube_loaders_lin_x86-64.tar.gz
RUN cp ioncube/*.so /usr/lib/php5/2*/
RUN echo zend_extension = /usr/lib/php5/2*/ioncube_loader_lin_5.3.so > /etc/php5/apache2/conf.d/00-ioncube.ini
RUN service apache2 restart

COPY apache_default /etc/apache2/sites-available/default
COPY run /usr/local/bin/run
RUN echo "extension=memcached.so" >> /etc/php5/apache2/php.ini
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite

EXPOSE 80
CMD ["/usr/local/bin/run"]

собираем образ

docker build --tag myphp53:1.0 .

docker-compose.yml

version: '2'

networks:
  app-tier:
      driver: bridge

services:
    memcached:
        image: 'bitnami/memcached:latest'
        networks:
            - app-tier
    php53:
        image: 'myphp53:1.0'
        volumes:
            - "/var/www/vhosts/site.ru/httpdocs:/var/www"
        ports:
            - "8080:80"
                                        
        networks:
            - app-tier

и потом

docker-compose up -d

PHP 5.3 в debian\ubuntu

Наверное самый без проблемный вариант запуска древнего софта на свежем сервере не ломая зависимостей и не компилируя чёрти что

$ docker run -d -p 8080:80 \
     -v /home/user/webroot:/var/www \
     -e PHP_ERROR_REPORTING='E_ALL & ~E_STRICT' \
     bylexus/apache-php53

придумал не я, вот оно всё от сюда

https://github.com/bylexus/docker-apache-php53

запустится контейнер, что будет слушать 8080 порт и подмонтирует ваш старый код из /home/user/webroot

осталось только настроить nginx чтоб перенаправлял запросы в 8080

ну и сайту из контейнера нужен доступ к внешней для него mysql базе, не забывайте изменить настройки для доступа из контейнера.

а так очень удобно

Настроить прокси для Telegram

Раз пошла такая пляска, и основные читатели блога это люди не последние в ИТ, для вас пост:
1 купить виртуалку за 1 евро в месяц ( например тут )
2 выполнить 2-3 простейшие команды по установке и настройке dante, я использовал вот этот репозиторий

wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh 
bash install.sh

после чего добавляем пользователей, себе и хорошим друзьям

/etc/init.d/sockd adduser USERNAME PASSWORD

теперь можно сообщить им вот такую вот урлу

https://t.me/socks?server=IP&port=2016&user=USER&pass=PASS

IP
USER
PASS
ставим свои и радуемся, всё работает отлично

OpenVPN поверх PPPOE ( openvpn over pppoe redirect-gateway def1 )

Существует проблема замены маршрута по умолчанию при использовании openvpn поверх pppoe
дело в том, что pppoe поднимается с неправильным маршрутом по умолчанию, выглядит он вот так

Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

опенвпну не нравится gateway поэтому его нужно исправить, например на вот такой

Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         222.222.222.22  0.0.0.0         UG    0      0        0 ppp0

для этого создадим файл

/etc/ppp/ip-up.d/default-gateway

не забываем задать ему chmod u+x
с таким содержимым

#!/bin/bash

if [ $(ip route list exact default |\
  awk '/^default/ {print $2}') = dev ];
then
         IF=$(ip route | awk '/^default/ {print $3}')
         GW=$(ip address show $IF |\
  awk '/peer/ {print $4}' | cut -d"/" -f1)
         ip route replace default via $GW dev $IF
fi

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

ip route replace default via 222.222.222.22 dev ppp0

После чего опенвпн успешно подменит маршрут на свой, и трафик полетит в нужную сторону.

если до какого-то хоста нам нужно пустить трафик вне ОпенВПна, например до своего хоста, для подключения по ssh, то в этот же файл добавляем

#my route 91.91.91.91
route add 91.91.91.91 gw 222.222.222.22 dev ppp0

если шлюз динамический, то используем $GW вместо 222.ххх

PowerShell контроль доступности сайта с перезапуском демона

однажды с бэк-эндом одного далёкого сервера случался кабздец, и он перестал отзываться, при этом статику сервер отдавал, а то, что обрабывает JAVA код, то видимо ломалось.
как временная мера такому безобразию был накидан примерно вот такой скрипт.
коль баш мне роднее, то пришлось немного погуглить, и нагуглилась вот эта страничка с функцией проверки сайта
Using PowerShell to Query Web Site Information
на всякий случай привожу код ниже полностью.

 function Get-WebSite {
<#  
.SYNOPSIS  
    Retrieves information about a website.
.DESCRIPTION
    Retrieves information about a website.
.PARAMETER Url
    URL of the website to test access to.
.PARAMETER UseDefaultCredentials
    Use the currently authenticated user's credentials  
.PARAMETER Proxy
    Used to connect via a proxy
.PARAMETER TimeOut
    Timeout to connect to site, in milliseconds
.PARAMETER Credential
    Provide alternate credentials              
.NOTES  
    Name: Get-WebSite
    Author: Boe Prox
    DateCreated: 08Feb2011        
.EXAMPLE  
    Get-WebSite -url "http://www.bing.com"
     
Description
------------
Returns information about Bing.Com to include StatusCode and type of web server being used to host the site.
 
#>
[cmdletbinding(
    DefaultParameterSetName = 'url',
    ConfirmImpact = 'low'
)]
    Param(
        [Parameter(
            Mandatory = $True,
            Position = 0,
            ParameterSetName = '',
            ValueFromPipeline = $True)]
            [string][ValidatePattern("^(http|https)\://*")]$Url,
        [Parameter(
            Position = 1,
            Mandatory = $False,
            ParameterSetName = 'defaultcred')]
            [switch]$UseDefaultCredentials,
        [Parameter(
            Mandatory = $False,
            ParameterSetName = '')]
            [string]$Proxy,
        [Parameter(
            Mandatory = $False,
            ParameterSetName = '')]
            [Int]$Timeout,
        [Parameter(
            Mandatory = $False,
            ParameterSetName = 'altcred')]
            [switch]$Credential            
                         
        )
Begin {     
    $psBoundParameters.GetEnumerator() | % { 
        Write-Verbose "Parameter: $_" 
        }
    
    #Create the initial WebRequest object using the given url
    Write-Verbose "Creating the web request object"        
    $webRequest = [net.WebRequest]::Create($url)
     
    #Use Proxy address if specified
    If ($PSBoundParameters.ContainsKey('Proxy')) {
        #Create Proxy Address for Web Request
        Write-Verbose "Creating proxy address and adding into Web Request"
        $webRequest.Proxy = New-Object -TypeName Net.WebProxy($proxy,$True)
        }
         
    #Set timeout
    If ($PSBoundParameters.ContainsKey('TimeOut')) {
        #Setting the timeout on web request
        Write-Verbose "Setting the timeout on web request"
        $webRequest.Timeout = $timeout
        }        
     
    #Determine if using Default Credentials
    If ($PSBoundParameters.ContainsKey('UseDefaultCredentials')) {
        #Set to True, otherwise remains False
        Write-Verbose "Using Default Credentials"
        $webrequest.UseDefaultCredentials = $True
        }
    #Determine if using Alternate Credentials
    If ($PSBoundParameters.ContainsKey('Credentials')) {
        #Prompt for alternate credentals
        Write-Verbose "Prompt for alternate credentials"
        $wc.Credential = (Get-Credential).GetNetworkCredential()
        }            
         
    #Set TimeStamp prior to attempting connection    
    $then = get-date
    }
Process {    
    Try {
        
        #Make connection to gather response from site
        $response = $webRequest.GetResponse()
        #If successful, get the date for comparison
        $now = get-date         
                 
        #Generate report
        Write-Verbose "Generating report from website connection and response"  
        $report = @{
            URL = $url
            StatusCode = $response.Statuscode -as [int]
            StatusDescription = $response.StatusDescription
            ResponseTime = "$(($now - $then).totalseconds)"
            WebServer = $response.Server
            Size = $response.contentlength
            Date = $now
            } 
            
            $report | Out-File -FilePath c:\Tools\checkServer_log.txt -Append                    
        }
    Catch {
        #Get timestamp of failed attempt
        $now = get-date
        #Put the current error into a variable for later use
        $errorstring = "$($error[0])"
        
        Restart-Service ApacheTomCat9
        
        #Generate report
        $report = @{
            URL = $url
            StatusCode = ([regex]::Match($errorstring,"\b\d{3}\b")).value
            StatusDescription = (($errorstring.split('\)')[2]).split('.\')[0]).Trim()
            ResponseTime = "$(($now - $then).totalseconds)"
            WebServer = $response.Server
            Size = $response.contentlength
            Date = $now            
            } 
        $report | Out-File -FilePath c:\Tools\checkServer_error_log.txt -Append;  

        }                        
    }
End {        
    #Display Report    
    New-Object PSObject -property $report 
    }    
}

 for(;;) {
 try {
    # invoke the worker script
    Get-WebSite -url "https://site.ru/Form.php" -TimeOut "15000" -Verbose
 }
 catch {
  # do something with $_, log it, more likely
 }

 # wait for a minute
 Start-Sleep 60
}

чуть выше в коде есть комментарий про соль нашу, это как раз если что-то пошло не так, то рестарт демона
дальше берём вызов этой функции в бесконечный цикл, с паузой 60 секунд, и проверяем…

for(;;) {
try {
# invoke the worker script
Get-WebSite -url "https://site.ru/Form.php" -TimeOut "15000" -Verbose
}
catch {
# do something with $_, log it, more likely
}

# wait for a minute
Start-Sleep 60
}

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