«10 привычек довольного node.js разработчика» и «3proxy»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
(Новая страница: «К концу 2015 года в распоряжении JavaScript разработчиков образовалось огромное количество ин…»)
 
imported>Vix
Нет описания правки
 
Строка 1: Строка 1:
К концу 2015 года в распоряжении JavaScript разработчиков образовалось огромное количество инструментов. В этой экосистеме легко потеряться, поэтому успешные команды следуют выработанным правилам, которые позволяют не терять время и сохранять здоровье проектов. Под катом перевод статьи 2016 года от команды Heroku, в которой они рассказывают о десяти привычках веб разработчиков, у которых все работает и ничего не болит. Скорее всего 80% написанного вы уже знаете – тем интереснее вам будет прочитать об оставшихся двух приемах!
Прокси сервер который умеет HTTP\HTTPS, ознакомится можно [https://ru.wikipedia.org/wiki/3proxy тут].
<hr>
Для установки необходимо сделать сдледующее:


1. скачать архив последней версии [https://github.com/z3APA3A/3proxy тут]:
* - через git:
git clone https://github.com/z3APA3A/3proxy.git
* - скачиваем архивом
wget -c https://github.com/z3APA3A/3proxy/releases


1. Начинайте новый проект командой npm init
2. если копия сделана через git то просто создаем в папке 3proxy файл debinstall.sh
cd 3proxy
touch debinstall.sh


Эта команда сразу создаст правильный package.json, основываясь на имени директории проекта и ваших ответах на вопросы визарда:
иначе распаковываем архив и также создаем этот файл.<br>
Далее..  


$ mkdir my-awesome-app
и вносим содержимое:
$ cd my-awesome-app
$ npm init --yes


 
#!/bin/bash
Использование флага --yes позволяет не отвечать на вопросы визарда, а в поле engines получившегося package.json можно сразу установить нужную версию ноды (node -v):
# author Koshuba V.O.
 
# config examples & init.d script author Altavista375
  "engines": {
# (c) 2018
  "node": "4.2.1"
# the install for Debian
#
option=$1;
getpkg=( "build-essential" "wget" "tar" "gzip" );
log="/var/log/syslog";
deb_release="";
## functions & operations
operation_install=( "checkDep" "install" "printInfo" );
operation_uninstall=( "checkDep" "uninstall" "printInfo" );
operation_help=( "printInfo" );
execute_func=();
##
## -@F logic executor
function eXlogic() {
lEnd=1;
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
    then echo "exit - eXlogic";
          exit 0;
fi
local exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
  do
    ## !! debug operation...
    #echo "eXlogic = execution: function ${iFs[$lg_index]} : index=$lg_index";
    local lg=$(echo $((${iFs[$lg_index]})) );
    local exfunc=( ${logic[$lg_index]} );
    local runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
    $runfunc;
    if [[ $lEnd == 0 ]]
        then lg_index=$((${#iFs[@]}-1));
    fi
done
iFs=();
logic=();
value_in="";
}
##--@F write log events
function writeToLog() {
for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
do
    echo  "$rdate 3proxy install  message: ${reports[$rpt_index]}">>$log;
done
}
##--@F make all errors
function makeErr() {
  reports[${#reports[@]}]="Operation not succeded";
  printInfo;
  writeToLog;
  exit 0;
}
##--@F Check the program dependency
function checkDep() {
if [[ ! $(apt-cache policy ${getpkg[@]} | grep status|wc -l) = $(echo -e ${#getpkg[@]}) ]];
    then apt-get install $(echo ${getpkg[@]});
fi
for ((ipkg=0; ipkg != ${#getpkg[@]}; ipkg++))
  do
    if [ ! "$(apt-cache policy ${getpkg[$ipkg]} | grep status)" ]
    then
    ## lang messages if yes then lang else us...
    reports[${#reports[@]}]="Do not set ${getpkg[$ipkg]} package";
    makeErr;
fi
done
local lsbtools=$(whereis -b lsb_release|awk '/^lsb_release:/{print $2}');
deb_release=$( $lsbtools -r|awk '/^Release:/{print $2}'|sed 's/\./ /g'|awk '{print$1}' );
}
function printInfo() {
value_in="$option";
iFs=(  "$(echo -n $value_in|wc -m) == 0"
        "$(echo -n $value_in|sed 's/--help//g'|wc -m) == 0"
        "$(echo -n ${#reports[@]}) == 0" );
logic=( '"" "pIhelp"'
        '"" "pIhelp"'
        '"pIdf" "pIhelp"' );
function pIhelp() {
    lEnd=0;
    clear
    echo
    echo -e "install: debinstall.sh --install";
    echo -e "uninstall: debinstall.sh --uninstall";
    echo -e "help: debinstall.sh --help";
    exit 0;
}
## default function last eXlogic..
function pIdf() {
    for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
        do
    echo  "${reports[$rpt_index]}";
    done
    exit 0;
    }
  eXlogic;
}
# install 3proxy
function install() {
make -f Makefile.Linux
if [ ! -d "/etc/3proxy" ]
    then
    mkdir -p /etc/3proxy;
fi
cp $PWD/bin/3proxy /usr/bin/
adduser --system --no-create-home --disabled-login --group proxy3
chown proxy3:proxy3 /usr/bin/3proxy
iduser=$(id -u proxy3);
idgroup=$(id -g proxy3);
# config examples author Altavista375
touch /etc/3proxy/3proxy.cfg
echo -e '# Запускаем сервер от пользователя proxy3
# (возможно в вашей ОС uid и gid пользователя proxy3
# будут другими. Для их определения воспользуйтесь командой id proxy3)
setgid '"$idgroup"'
setuid '"$iduser"'
#
# Пропишите правильные серверы имен посмотрев их
# на своем сервере в /etc/resolv.conf
nserver 127.0.0.1
#
# Оставьте размер кэша для запросов DNS по умолчанию
nscache 65536
#
# Равно как и таймауты
timeouts 1 5 30 60 180 1800 15 60
#
# Если несколько IP на одном сервере, указываем тот,
# через который ходить во внешний мир.
# Иначе эту строку игнорируем
#external <YOURSERVERIP>
# Тоже самое, только указываем IP, который надо слушать
# Если проигнорировать, то прокси слушает все адреса на сервере
#internal <YOURSERVERIP>
#
# Указываем на расположение файла с пользователями и паролями
#users $/etc/3proxy/.proxyauth
#
# укажите режим запуска как deamon
daemon
#
# путь к логам и формат лога, к имени лога будет добавляться дата создания
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
#
# Включаем авторизацию по логинам и паролям
#auth cache strong
#
# Конфигурация http(s) proxy
# Запускаем анонимный (-a) HTTP-proxy на порту (-p) 3128 и
# c отключенной NTLM-авторизацией (-n)
proxy -n -p3128 -a'>/etc/3proxy/3proxy.cfg
chown proxy3:proxy3 /etc/3proxy/3proxy.cfg
chmod 444 /etc/3proxy/3proxy.cfg
if [ ! -d "/var/log/3proxy" ]
    then
    mkdir -p /var/log/3proxy;
    chown proxy3:proxy3 /var/log/3proxy
fi
# script starts 3proxy author Altavista375
touch /etc/init.d/3proxyinit
echo '#!/bin/sh
#
### BEGIN INIT INFO
# Provides: 3Proxy
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Initialize 3proxy server
# Description: starts 3proxy
### END INIT INFO
case "$1" in
  start)
  echo Starting 3Proxy
  /usr/bin/3proxy /etc/3proxy/3proxy.cfg
  ;;
  stop)
  echo Stopping 3Proxy
  /usr/bin/killall 3proxy
  ;;
  restart|reload)
  echo Reloading 3Proxy
  /usr/bin/killall -s USR1 3proxy
  ;;
  *)
  echo Usage: \$0 "{start|stop|restart}"
  exit 1
esac
exit 0'>/etc/init.d/3proxyinit;
chmod 0644 /etc/init.d/3proxyinit;
chmod +x /etc/init.d/3proxyinit;
if [[ $deb_release < 8 ]];
    then
    update-rc.d -n 3proxyinit defaults;
    else
    echo -e '    [Unit]
    SourcePath=/etc/3proxy
    Description=proxy
    After=network-online.target
    Wants=network-online.target
    Conflicts=shutdown.target
    [Service]
    User=proxy3
    Group=proxy3
    GuessMainPID=no
    Type=notify
    NotifyAccess=all
    RemainAfterExit=yes
    WorkingDirectory=/etc/3proxy/
    ExecStart=/etc/init.d/3proxyinit start
    ExecStop=/etc/init.d/3proxyinit stop
    ExecReload=/etc/init.d/3proxyinit restart
    TimeoutSec=5min
    [Install]
    WantedBy=multi-user.target
'>/lib/systemd/system/3proxy.service;
    systemctl daemon-reload
/bin/systemctl enable 3proxy.service;
fi
#
reports[${#reports[@]}]="3proxy install susseful";
writeToLog;
printInfo;
  }
  }
 
 
function uninstall() {
2. Используйте «умный» .npmrc
    if [[ $deb_release < 8 ]];
 
      then
По умолчанию npm не записывает установленные зависимости в package.json (а за зависимостями надо следить всегда!).
    /etc/init.d/3proxyinit stop;
 
    update-rc.d -n 3proxyinit remove;
Если вы воспользуетесь флагом --save для автоматического обновления package.json, то npm сохранит имя зависимости с префиксом ^. Семантическое версионирование ставит ваши зависимости под угрозу, так как при чистой инсталляции в проект могут установиться другие версии зависимостей, и кто знает, какие в них могут быть баги и проблемы. Такой способ хорош во время разработки, но не в продакшне. Одно из решений – сохранять точную версию зависимости:
    else
 
    /bin/systemctl stop 3proxy.service;
$ npm install foobar --save --save-exact
    /bin/systemctl disable 3proxy.service;
 
    rm /lib/systemd/system/3proxy.service;
 
    systemctl daemon-reload;
А еще лучше – поменять глобальные настройки npm в ~/.npmrc, чтобы все происходило автоматически:
    fi
 
    rm -f /etc/3proxy/3proxy.cfg;
$ npm config set save=true
    rm -f /usr/bin/3proxy;
$ npm config set save-exact=true
    rm -rf /etc/3proxy;
$ cat ~/.npmrc
    deluser proxy3;
 
  reports[${#reports[@]}]="3proxy uninstall susseful";
 
  writeToLog;
При такой конфигурации установка зависимостей сохранит точную версию и ваш проект никогда не настигнет жуткий “version drift”!
  printInfo;
 
Если вы предпочитаете последние версии зависимостей во время разработки, плюс заморозку для прода, то вы можете воспользоваться функцией shrinkwrap. Такая конфигурация потребует несколько больше усилий, но позволит более гибко подойти к версионированию зависимостей.
 
3. Не упустите уходящий поезд ES6
 
Начиная с 4-й версии Node.js вы можете использовать многие функции ES6. Начните использовать уже сейчас простые и удобные улучшения синтаксиса, которые сделают ваш код проще и понятнее:
 
let user = users.find(u => u.id === ID);
console.log(`Hello, ${ user.name }!`);
 
 
4. Придерживайтесь нижнего регистра
 
Некоторые языки рекомендуют именовать файлы так же, как классы. Например, файл, имплементирующий MyClass, предлагается называть MyClass.js. Не делайте так в node. Используйте нижний регистр:
 
let MyClass = require('my-class');
 
 
Node.js это редкий пример линуксовой программы с великолепной поддержкой кроссплатформенности. Несмотря на то, что OSX и Windows будут считать файлы myclass.js и MyClass.js одним и тем же файлом, Linux так считать не будет. Если вы хотите писать кросс-платформенный код, вам необходимо именовать файлы в том же регистре, который вы используете для require.
 
Самый простой пусть сделать все правильно – это использовать нижний регистр, то есть my-class.js (примечание переводчика: или my_class.js, что все-таки популярнее среди программистов, нежели css нотация).
 
5. Кластеризируйте ваше приложение
 
Так как процесс node ограничен одним ядром и полутора гигабайтами оперативной памяти, деплой некластеризованного приложения на мощный сервер является тратой полезных ресурсов впустую. Чтобы использовать несколько ядер и много памяти, добавьте в свое приложение поддержку кластеризации. Даже если сейчас вы запускаете приложение на одноядерной vps с гигом памяти, добавление кластеризации будет хорошим заделом на будущее.
 
Лучший способ найти оптимальное количество процессов это, конечно, тестирование. Но для начала подойдет значение по умолчанию, предлагаемое платформой. Ну и адекватный fallback, конечно же:
 
const CONCURRENCY = process.env.WEB_CONCURRENCY || 1;
 
 
Использование кластеризации позволяет не изобретать велосипед для управления потоками. Если вам нравится разделение по файлам на “master” и “worker”, то попробуйте forky. Если же вы предпочитаете единую точку входа, то throng.
 
6. Следите за переменными окружения
 
Используйте переменные окружения вместо конфиг файлов. Для этого установите node-foreman:
 
  $ npm install --save --save-exact foreman
 
 
Затем создайте Procfile, чтобы указать тип приложения:
 
  web: bin/web
  worker: bin/worker
 
 
И установите альяс для запуска:
 
"scripts": {
  "start": "nf start"
  }
  }
 
   
 
  ##--@F executor
Теперь, чтобы изменить настойки окружения, достаточно создать (и добавить в .gitignore) файл с именем .env, который будет автоматически загружен node-foreman:
function executor() {
 
  if [[ ${#execute_func[@]} -eq 0 ]]
  DATABASE_URL='postgres://localhost/foobar'
    then echo "exit";
  HTTP_TIMEOUT=10000
          exit 0;
 
fi
 
  for ((ex_index=0; ex_index != ${#execute_func[@]}; ex_index++))
С такими настройками достаточно одной команды npm start, чтобы запустить web и worker процессы, а затем прменить к ним настройки в соответствии с переменными окружения. Это намного проще, чем 'config/abby-dev.js', 'config/brian-dev.js', 'config/qa1.js', 'config/qa2.js', 'config/prod.js', итд.
  do
 
    ## !! debug operation...
7. Избегайте мусора
    ##echo "execution: function ${execute_func[ex_index]}"
 
  ${execute_func[ex_index]};
Node.js (в лице движка V8) использует «ленивый» и «жадный» сборщик мусора. С лимитом по умолчанию в полтора гигабайта он часто ждет до последнего, прежде чем освободить не используемую память. Если у вас постепенно растет использованная память, это может быть не ее утечка, а вполне штатное поведение сборщика мусора node.
done
 
Для лучшего контроля за сборщиком мусора, в Procfile можно поместить команды для движка V8:
 
  web: node --optimize_for_size --max_old_space_size=920 --gc_interval=100 server.js
 
 
Это особенно важно, если ваше приложение запущено на машине с менее чем полутора гигами доступной памяти. Например, для контейнера с 512 мегабайтами памяти строка аргументов может выглядеть вот так:
 
  web: node --optimize_for_size --max_old_space_size=460 --gc_interval=100 server.js
 
 
8. Используйте хуки
 
“Lifecycle scripts” в node.js предоставляют широкие возможности для автоматизации. К примеру, если вам нужно что-нибудь запустить перед сборкой приложения, вы можете воспользоваться скриптом preinstall. Нужно собрать ассеты с помощью grunt, gulp, browserify или webpack? Используйте скрипт postinstall. Все эти скрипты можно задать прямо в package.json:
 
"scripts": {
  "postinstall": "bower install && grunt build",
  "start": "nf start"
  }
  }
##- Begin zramraid
case "$option" in
## install zramraid
"--install" | "--install" )
execute_func=( ${operation_install[@]} );
executor;
exit 0
;;
## uninstall zramraid
"--uninstall" | "--uninstall" )
execute_func=( ${operation_uninstall[@]} );
executor;
exit 0
;;
## help
"--help" | "--help" )
execute_func=( ${operation_help[@]} );
executor;
exit 0
;;
* )
# selecting defaults.
execute_func=( ${operation_help[@]} );
executor;
exit 1
;;
esac
3. даем права на запуск
chmod +x debinstall.sh


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


И конечно вы можете использовать переменные окружения для управления скриптами:
5. после установки правим конфигурационный файл /etc/3proxy/3proxy.cfg


"postinstall": "if $BUILD_ASSETS; then npm run build-assets; fi",
Примеры можно посмотреть в папке с исходным кодом: ../3Proxy/cfg
"build-assets": "bower install && grunt build"


ИСТОЧНИКИ:
<hr>


Если скрипты стали слишком сложные – перенесите их в файлы:
* [https://community.vscale.io/hc/ru/community/posts/115001609005-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0-3proxy-%D0%BD%D0%B0-Debian-Ubuntu?page=1#community_comment_115001539545 Установка и настройка прокси-сервера 3proxy на Debian/Ubuntu ]
 
"postinstall": "scripts/postinstall.sh"
 
 
Важно: скрипты в package.json выполняются с ./node_modules/.bin автоматически добавленным в PATH, так что вы можете напрямую вызывать локально установленные npm пакеты, такие как webpack. Это позволяет вообще не устанавливать пакеты глобально.
 
9. Only git the important bits
 
Мне настолько понравился этот заголовок, что я оставил его без перевода. Красивая игра слов – «гитуйте только важные биты» = «добавляйте в git только то, что важно». Большинство приложений состоят из файлов двух типов: которые можно или нельзя сгенерировать автоматически. Когда вы используете систему контроля версий, избегайте добавлять в нее файлы, которые можно сгенерировать автоматически.
 
Например, у вашего приложения есть директория node_modules с установленными зависимостями. Да, есть люди, которые добавляют ее в систему контроля версий! Не надо так делать. Указание нужных версий зависимостей в package.json намного надежнее, так как npm install не очищает node_modules, и если там уже будут файлы из системы контроля версий, может случиться беда.
 
Также добавление генерируемых файлов производит много лишнего шума в логах и нотификациях вашего репозитория. Более того, некоторые зависимости требуют компиляции при установки, так что добавление установленной версии в репозиторий делает ваше приложение непортабельным и может привести к странным ошибкам.
По тем же причинам не стоит добавлять bower_components или скомпилированные grunt ассеты. Если в проекте директория node_modules уже добавлена в систему контроля версий, то ее всегда можно убрать, например, вот так:
 
$ echo 'node_modules' >> .gitignore
$ git rm -r --cached node_modules
$ git commit -am 'ignore node_modules'
 
 
Также я обычно добавляю в игнор логи npm, чтобы не засорять код:
 
$ echo 'npm-debug.log' >> .gitignore
$ git commit -am 'ignore npm-debug'
 
 
Игнорируя эти менее важные файлы, вы уменьшаете размер репозитория, упрощаете коммиты и не получаете конфликтов слияния.
 
10. Упрощайте
 
Предсказания в айти – дело неблагодарное. Но я все-таки сделаю одно. Предсказываю, что для JavaScript 2016 год станет годом упрощения.
Все больше программистов упрощают архитектуру своих решений. На смену монолитных MVC решений приходит статический фронтенд, который так удобно раздавать через CDN, и Node.js бэкенд для динамических данных.
 
Мы также начали замечать, насколько сложные системы сборки усложняют наши проекты. На острие прогресса разработчики упрощают эти решения, в частности, используя npm скрипты вместо bower, gulp и grunt.
 
И, наконец, в 2016 году мы будем упрощать написанный нами код. В ряде случаев это будет отказ от лишних фичей, как показал Douglas Crockford в своих The Better Parts. Или, наоборот, упрощение придет от добавления новой функциональности. Такой, как мои любимые async и await. В ноде их пока нет, но всегда можно воспользоваться транспайлером, например BabelJS.
 
Попробуйте не соревноваться друг с другом в том, сколько новых технологий можно запихнуть в один проект, а сфокусироваться на упрощении вашей работы.
 
ИСТОЧНИК:
<hr>
* [https://habr.com/company/Voximplant/blog/277707/ 10 привычек довольного node.js разработчика]

Версия от 15:15, 24 декабря 2018

Прокси сервер который умеет HTTP\HTTPS, ознакомится можно тут.


Для установки необходимо сделать сдледующее:

1. скачать архив последней версии тут:

* - через git:
git clone https://github.com/z3APA3A/3proxy.git
* - скачиваем архивом
wget -c https://github.com/z3APA3A/3proxy/releases

2. если копия сделана через git то просто создаем в папке 3proxy файл debinstall.sh

cd 3proxy
touch debinstall.sh

иначе распаковываем архив и также создаем этот файл.
Далее..

и вносим содержимое:

#!/bin/bash
# author Koshuba V.O.
# config examples & init.d script author Altavista375
# (c) 2018
# the install for Debian
#
option=$1;
getpkg=( "build-essential" "wget" "tar" "gzip" );
log="/var/log/syslog";
deb_release="";

## functions & operations
operation_install=( "checkDep" "install" "printInfo" );
operation_uninstall=( "checkDep" "uninstall" "printInfo" );
operation_help=( "printInfo" );
execute_func=();
##

## -@F logic executor
function eXlogic() {
lEnd=1;
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
    then echo "exit - eXlogic";
         exit 0;
fi

local exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
 do
    ## !! debug operation...
    #echo "eXlogic = execution: function ${iFs[$lg_index]} : index=$lg_index";
    local lg=$(echo $((${iFs[$lg_index]})) );
    local exfunc=( ${logic[$lg_index]} );
    local runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
    $runfunc;
    if $lEnd == 0  
        then lg_index=$((${#iFs[@]}-1)); 
    fi
done
iFs=();
logic=();
value_in="";
}

##--@F write log events
function writeToLog() {
for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
do
    echo  "$rdate 3proxy install  message: ${reports[$rpt_index]}">>$log;
done
}


##--@F make all errors
function makeErr() {
 reports[${#reports[@]}]="Operation not succeded";
 printInfo;
 writeToLog;
 exit 0;
}

##--@F Check the program dependency
function checkDep() {
if [[ ! $(apt-cache policy ${getpkg[@]} | grep status|wc -l) = $(echo -e ${#getpkg[@]}) ]];
    then apt-get install $(echo ${getpkg[@]});
fi

for ((ipkg=0; ipkg != ${#getpkg[@]}; ipkg++))
 do
    if [ ! "$(apt-cache policy ${getpkg[$ipkg]} | grep status)" ]
    then
    ## lang messages if yes then lang else us...
    reports[${#reports[@]}]="Do not set ${getpkg[$ipkg]} package";
    makeErr;
fi
done
local lsbtools=$(whereis -b lsb_release|awk '/^lsb_release:/{print $2}');
deb_release=$( $lsbtools -r|awk '/^Release:/{print $2}'|sed 's/\./ /g'|awk '{print$1}' );
}


function printInfo() {
value_in="$option";
iFs=(   "$(echo -n $value_in|wc -m) == 0"
        "$(echo -n $value_in|sed 's/--help//g'|wc -m) == 0" 
        "$(echo -n ${#reports[@]}) == 0" );

logic=( '"" "pIhelp"'
        '"" "pIhelp"'
        '"pIdf" "pIhelp"' );

function pIhelp() {
    lEnd=0;
    clear
    echo
    echo -e "install: debinstall.sh --install";
    echo -e "uninstall: debinstall.sh --uninstall";
    echo -e "help: debinstall.sh --help";
    exit 0;
}

## default function last eXlogic..
function pIdf() {
    for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
        do
    echo   "${reports[$rpt_index]}";
    done
    exit 0;
    }
eXlogic;
}


# install 3proxy
function install() {

make -f Makefile.Linux

if [ ! -d "/etc/3proxy" ]
    then
    mkdir -p /etc/3proxy;
fi

cp $PWD/bin/3proxy /usr/bin/
adduser --system --no-create-home --disabled-login --group proxy3
chown proxy3:proxy3 /usr/bin/3proxy

iduser=$(id -u proxy3);
idgroup=$(id -g proxy3);

# config examples author Altavista375
touch /etc/3proxy/3proxy.cfg
echo -e '# Запускаем сервер от пользователя proxy3
# (возможно в вашей ОС uid и gid пользователя proxy3
# будут другими. Для их определения воспользуйтесь командой id proxy3)
setgid '"$idgroup"'
setuid '"$iduser"'
#
# Пропишите правильные серверы имен посмотрев их
# на своем сервере в /etc/resolv.conf
nserver 127.0.0.1
#
# Оставьте размер кэша для запросов DNS по умолчанию
nscache 65536
#
# Равно как и таймауты
timeouts 1 5 30 60 180 1800 15 60
#
# Если несколько IP на одном сервере, указываем тот,
# через который ходить во внешний мир.
# Иначе эту строку игнорируем
#external <YOURSERVERIP>
# Тоже самое, только указываем IP, который надо слушать
# Если проигнорировать, то прокси слушает все адреса на сервере
#internal <YOURSERVERIP>
#
# Указываем на расположение файла с пользователями и паролями
#users $/etc/3proxy/.proxyauth
#
# укажите режим запуска как deamon
daemon
#
# путь к логам и формат лога, к имени лога будет добавляться дата создания
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
#
# Включаем авторизацию по логинам и паролям
#auth cache strong
#
# Конфигурация http(s) proxy
# Запускаем анонимный (-a) HTTP-proxy на порту (-p) 3128 и
# c отключенной NTLM-авторизацией (-n)
proxy -n -p3128 -a'>/etc/3proxy/3proxy.cfg
chown proxy3:proxy3 /etc/3proxy/3proxy.cfg
chmod 444 /etc/3proxy/3proxy.cfg

if [ ! -d "/var/log/3proxy" ]
    then
    mkdir -p /var/log/3proxy;
    chown proxy3:proxy3 /var/log/3proxy
fi

# script starts 3proxy author Altavista375
touch /etc/init.d/3proxyinit
echo '#!/bin/sh
#
### BEGIN INIT INFO
# Provides: 3Proxy
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Initialize 3proxy server
# Description: starts 3proxy
### END INIT INFO

case "$1" in
 start)
 echo Starting 3Proxy

 /usr/bin/3proxy /etc/3proxy/3proxy.cfg
 ;;

 stop)
 echo Stopping 3Proxy
 /usr/bin/killall 3proxy
 ;;

 restart|reload)
 echo Reloading 3Proxy
 /usr/bin/killall -s USR1 3proxy
 ;;
 *)
 echo Usage: \$0 "{start|stop|restart}"
 exit 1
esac
exit 0'>/etc/init.d/3proxyinit;
chmod 0644 /etc/init.d/3proxyinit;
chmod +x /etc/init.d/3proxyinit;

if [[ $deb_release < 8 ]]; 
    then
    update-rc.d -n 3proxyinit defaults;
    else
    echo -e '    [Unit]
    SourcePath=/etc/3proxy
    Description=proxy
    After=network-online.target
    Wants=network-online.target
    Conflicts=shutdown.target 

    [Service]
    User=proxy3
    Group=proxy3
    GuessMainPID=no
    Type=notify
    NotifyAccess=all
    RemainAfterExit=yes
    WorkingDirectory=/etc/3proxy/
    ExecStart=/etc/init.d/3proxyinit start
    ExecStop=/etc/init.d/3proxyinit stop
    ExecReload=/etc/init.d/3proxyinit restart
    TimeoutSec=5min

    [Install]
    WantedBy=multi-user.target

'>/lib/systemd/system/3proxy.service;
    systemctl daemon-reload
/bin/systemctl enable 3proxy.service;
fi
#
reports[${#reports[@]}]="3proxy install susseful";
writeToLog;
printInfo;

}

function uninstall() {
    if [[ $deb_release < 8 ]]; 
     then
    /etc/init.d/3proxyinit stop;
    update-rc.d -n 3proxyinit remove;
    else
    /bin/systemctl stop 3proxy.service;
    /bin/systemctl disable 3proxy.service;
    rm /lib/systemd/system/3proxy.service;
    systemctl daemon-reload;
    fi
    rm -f /etc/3proxy/3proxy.cfg;
    rm -f /usr/bin/3proxy;
    rm -rf /etc/3proxy;
    deluser proxy3;
reports[${#reports[@]}]="3proxy uninstall susseful";
writeToLog;
printInfo;
}

##--@F executor
function executor() {
if [[ ${#execute_func[@]} -eq 0 ]] 
    then echo "exit";
         exit 0; 
fi
for ((ex_index=0; ex_index != ${#execute_func[@]}; ex_index++))
 do
    ## !! debug operation...
    ##echo "execution: function ${execute_func[ex_index]}"
 ${execute_func[ex_index]};
done
}



##- Begin zramraid
case "$option" in

## install zramraid
"--install" | "--install" )
execute_func=( ${operation_install[@]} );
executor;
exit 0
;;

## uninstall zramraid
"--uninstall" | "--uninstall" )
execute_func=( ${operation_uninstall[@]} );
executor;
exit 0
;;

## help
"--help" | "--help" )
execute_func=( ${operation_help[@]} );
executor;
exit 0
;;

* )
# selecting defaults.
execute_func=( ${operation_help[@]} );
executor;
exit 1
;;
esac



3. даем права на запуск

chmod +x debinstall.sh

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

5. после установки правим конфигурационный файл /etc/3proxy/3proxy.cfg

Примеры можно посмотреть в папке с исходным кодом: ../3Proxy/cfg

ИСТОЧНИКИ: