- PVSM.RU - https://www.pvsm.ru -
Добрый день, читатели!
Наверняка каждый разработчик, рано или поздно, сталкивается с проблемой тестового окружения. Не очень удобно держать ПК включенным 24х7, да еще и заваливать его софтом для экспериментов под завязку. С другой стороны найти
Disclaimer: пост публикуется по просьбе icepro [2], поэтому не спешите менять карму мне, а лучше помогите хорошему человеку с инвайтом. Вы не найдете тут откровений или неожиданных решений, но проходя подобный путь сможете найти все необходимое в одном месте.
Заранее предупрежу: статья первая, сильно не бейте.
А теперь к деталям. Заранее прошу бородатых админов и всех компетентных в данной теме людей, не хвататься за сердце, фукать и спешить ставить минусы, ведь я только учусь и администрированием плотно не занимался. Зато надеюсь начинающим смогу сократить путь в Linux на пару шагов и пройти быстрое знакомство действительно быстро :)
Побродив по интернет магазинам я нашел вот такую материнскую плату: Intel BOXD2500HN.
Базируется она на процессоре Intel Atom D2500 (1.86 ГГц). Для меня этой мощности было предостаточно. Потребляет энергии — 10 Ватт. Цена — около $70. Охлаждение пассивное — шума нету. Так же дома валялась SO-DIMM память на 2 ГБ и полутерабайтный винт.
Теперь о корпусе. Опять таки хотелось меньше шума, и поэтому выбор пал на корпус со внешним БП — DELUX E-2012 Black Mini-ITX
Итого единственный кулер — 40 мм, размещенный над жестким диском (ну было штатное место, вот и решил укомплектовать полностью).
Сразу оговорюсь — Debian поразила меня богатством софтового репозитория. В нем можно найти все что угодно. Для того что бы поискать по имени интересующую программу воспользуемся командой:
sudo apt-cache search <название программы, или его часть>
для установки выполняем
sudo apt-get install <название программы>
Далее по тексту я буду упоминать об установке софта, но вы уже будете знать как это делать.
Ставить Debian не сложно. Скачиваем образ и делаем загрузочную USB флешку (сделать ее поможет LinuxLive USB Creator [7]). Далее загружаемся с нее и включаем графический установщик (так будет проще). В основном установка похожа на установку windows: жмем Далее, Далее, Далее. Но некоторые моменты все же есть:
— на шаге выбора разметки выбираем отдельные разделы
— после того как мастер авторазбивки диска покажет вам предполагаемую структуру — не соглашайтесь, увеличьте RootFS (она же "/") хотя бы до пары гигабайт (у меня сейчас 512 Мб и за разделом приходится очень пристально следить)
— выбор программного обеспечения оставляем как есть (галки на «Окружение рабочего стола» и «Стандартная система», остальное поставим позже)
Если все же нужна пошаговая помощь при установке то рекомендую на просторах интернета найти маунал «Web-сервер на Debian GNU_Linux для начинающих».
Далее было произведено несколько мелких твиков системы:
Для того что бы иметь возможность вашему пользователю исполнять команды от имени суперпользователя, его нужно добавить в sudoer list. Детали настройки можно найти в документе который я уже упоминал выше, в разделе «1.2.1 Базовая настройка sudo»
Дабы иметь возможность удаленного доступа, я сейчас говорю не про ssh, а как раз рабочий стол, был установлен VNC сервер — x11vnc.
Настройка довольно легкая, сначала генерируем авторизационный файл:
x11vnc -storepasswd <pass> <file>
а потом добавим VNC сервер в автозагрузку (/etc/xdg/lxsession/LXDE/autostart)
@/usr/bin/x11vnc -dontdisconnect -display :0 -notruecolor -noxfixes -shared -forever -rfbport 5900 -bg -o /var/log/x11vnc.log -rfbauth /home/ice/.vnc/passwd
Материнская плата умеет восстанавливать свое состояние после того как электричество было прервано и возобновлено. Но если к серверу не подключен монитор и не видно состояния системы, то после перебоев в электросети графическая среда так и будет висеть на странице Login после перезагрузки. Для того что бы устранить это неудобство добавим возможность автовхода для нашего пользователя, для этого в файл /etc/lightdm/lightdm.conf добавим строки:
autologin-user=ice
autologin-user-timeout=0
Следить за оборудованием поможет
lshw
lshw-gtk
Для мониторинга температуры я доставил lm-sensors и hddtemp.
Команда
sensors
показывает информацию о МП с доступных датчиков.
Перед использованием утилиты нужно что бы она обнаружила все датчики, для этого требуется запустить:
/usr/sbin/sensors-detect
А команда
hddtemp /dev/sda
подсказывает до какой температуры нагрелся жесткий диск.
Первое время у меня была мания проверять температуру и другие датчики, поэтому я написал кратенький скрипт для сбора и логирования данных:
#!/bin/bash
echo '################## TIME ##################'
date
echo '################# UP TIME ################'
uptime
echo '################# MB TEMP ################'
sensors
echo '################ HDD TEMP ################'
sudo hddtemp /dev/sda
echo
echo
Теперь создадим расписание запуска скрипта, но предварительно выдадим ему права на выполнение:
visudo
ice ALL=NOPASSWD: /home/ice/scripts/monitoring/temp.sh
а теперь Cron:
sudo crontab -e -u ice
*/10 * * * * sudo /home/ice/scripts/monitoring/temp.sh >> /home/ice/scripts/monitoring/temp.log 2>&1
Проверить что запуски происходят можно командой:
grep CRON /var/log/syslog
И еще одно — что бы логи не накапливались я настроил их ротацию. Что бы это сделать установим Logrotate
sudo apt-get install logrotate
А далее создадим в папке /etc/logrotate.d/ файл конфигурации. Мой выглядит так:
/home/ice/scripts/monitoring/temp.log { # путь к логам
daily # ротировать ежедневно
missingok # отсутствие файла не является ошибкой
rotate 30 # сохраняется последние 30 ротированных файлов
compress # сжимать ротируемый файл
delaycompress # сжимать предыдущий файл при следующей ротации (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми)
notifempty # не обрабатывать пустые файлы
create 640 ice ice # сразу после ротации создать пустой файл с заданными правами и пользователем
}
smbpasswd -a ice
LAMP [15] | nginx [16] | Node.js [17] | MongoDB [18] | GIT [19] | Java [20] | Python [21] | Ruby [22] | .NET [23] | Jenkins [24]
Да, я активный web-разработчик и без этой платформы как без рук. Ставится все элементарно:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install apache2 apache2-doc php5 libapache2-mod-php5 php-pear
sudo apt-get install mysql-server mysql-client php5-mysql
sudo apt-get install php5-curl php5-gd php5-imagick php5-ldap php5-imap php5-memcache php5-common php5-mysql php5-ps php5-tidy imagemagick php5-xcache php5-xdebug php5-xmlrpc php5-xsl
Но сразу после установки меня постигла неудача — php файлы никак не хотели обрабатываться apache'м. Для того что бы это исправить я произвел следующие манипуляции:
/etc/apache2$ sudo gedit apache2.con
# перед секцией инклудов добавил
AddHandler application/x-httpd-php .php .php4 .php3 .html
AddType application/x-httpd-php .html
Для удобного дебага php я поставил и настроил xdebug. Установка детально описана по следующим ссылкам:
— Configuring Xdebug for PHP development/Linux [25]
— Remote Xdebug на PhpStorm [26]
При создании виртуальных хостов не забываем прописывать их в hosts
Для повышение производительности апача рекомендуют использовать его в связке с nginx со следующим распределением ролей: apache — backend, nginx — frontend. О том как выполнить такую конфигурацию повествует статья — Установка и настройка Nginx. Nginx frontend + Apache backend. [27]
Прекрасная платформа, особенно для создания небольших клиент-серверных приложений. Одни только web-sockets чего стоят. Ну да ладно, вернемся к установке. Ставить node.js немного не тривиально, но не сложно — true'шным образом, то есть из исходников:
sudo apt-get install python g++ make checkinstall
mkdir ~/src && cd $_
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz && cd node-v* # убираем "v" из номера версии в окне диалога
./configure
checkinstall
sudo dpkg -i node_*
Чуть более подробно установка расписана тут — Installing Node.js [28]
А почему бы еще и не приобщиться к NoSQL сообществу? Вот и я задался этим вопросом. Ну может плотно NoSQL использовать я и не планировал, но пощупать — почему нет?
Устанавливаем!
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
sudo apt-get update
sudo apt-get install mongodb-10gen
… и запускаем
sudo /etc/init.d/mongodb start
Давно уже хотелось съехать с публичных репозиториев на github. И вот пришло время. Git поставить не сложно, он в репозитории пакетов так и зовется — git, но сконфигурировать его для удобной работы немного сложнее, нам нужно:
— создать отдельного пользователя — git
— установить giolite для администрирования репозиториев
Вот это видео помогло побороть ситуацию когда мои ключи сгенерированные в putty игнорировались — How To Fix «Server Refused Our Key» Error That Caused By RSA Public Key Generated By Puttygen [29]
Далее клонируем giolite репозиторий — ssh://git@192.168.1.110:/gitolite-admin.git и вуаля, управляем репами.
Настроить git+gitolite помогли следующие ссылки:
— Настройка сервера. Gitolite — хостинг git-репозиториев [30]
— Собственный git-сервер с нуля [31]
Для удобного обзора репозиториев из браузера существует — gitweb. Как его установить описано здесь — Setting up Gitweb on Debian [32].
От себя добавлю:
usermod -a -G gitolite www-data
для того что бы apach и gitolite подружились.
<VirtualHost *:81>
ServerAdmin webmaster@localhost
ServerName git-web.loc
SetEnv GITWEB_CONFIG /etc/gitweb.conf
DocumentRoot /home/git/repositories
Alias /static/gitweb.css /usr/share/gitweb/static/gitweb.css
Alias /static/git-logo.png /usr/share/gitweb/static/git-logo.png
Alias /static/git-favicon.png /usr/share/gitweb/static/git-favicon.png
Alias /static/gitweb.js /usr/share/gitweb/static/gitweb.js
Alias /git /home/git/repositories
ScriptAlias /gitweb.cgi /usr/lib/cgi-bin/gitweb.cgi
DirectoryIndex gitweb.cgi
<Directory /home/git/repositories/>
Allow from All
Options +ExecCGI
AllowOverride All
AuthType Basic
AuthName "Private Repository"
AuthUserFile /home/ice/stuff/keys/.htpasswd-gitweb
Require valid-user
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
</Directory>
SetEnv GIT_PROJECT_ROOT /home/git/repositories
SetEnv GIT_HTTP_EXPORT_ALL
ErrorLog ${APACHE_LOG_DIR}/git_web_error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/git_web_access.log combined
</VirtualHost>
Basic авторизация по вкусу, можно отключить.
Перейдем к java платформе. Первым делом удалим openjdk и поставим Java 7
sudo apt-get remove openjdk*
su -
# добавим репозитории java
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get update
# принимаем лицензию Oracle software license
echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
# ставим Oracle JDK7
apt-get install oracle-java7-installer
# выходим из под root
exit
# убедимся что java поставилась
java -version
Сверху я прибавил следующее ПО:
— scala (как раз изучаю, почему бы не потренироваться на своем сервере)
— glassfish — один из самых активно разрабатываемых (если не самый) серверов приложений
* если glassfish не запускается из-за того что занят порт 8080 (как это получилось у меня), то давайте сменим дефолтный порт. Для этого в GlassFish_Serverglassfishdomainsdomain1config находим наш порт и ставим другой:
<network-listener name="http-listener-1" port="8081" protocol="http-listener-1" thread-pool="http-thread-pool" transport="tcp"</network-listener>
Следующим пожаловал питон вместе с django. Ставятся из репозитория довольно легко. Вот тут можно посмотреть на простоту использования — Writing your first Django app [33]
Как и питон, руби я поставил тоже со своим фреймворком — Rails. Ставить чуть сложнее, поэтому приводу инструкцию:
apt-get install build-essential libapache2-mod-passenger ruby rdoc ruby-dev libopenssl-ruby rubygems
gem install fastthread
gem install rails --version 3.0.4
А так же не забудьте добавить rails в $PATH:
PATH=".../var/lib/gems/VERSION/bin"
Ну а использовать все так же легко — Getting Started with Rails [34]
Для внутренних нужд так же было решено развернуть баг-трекер, и им стал -Redmine.
Ставить вот так:
# доставляем нужные библиотеки
aptitude install libmagickcode-dev
aptitude install libmagickwand-dev
aptitude install ruby1.9.1-dev
aptitude install libmysqlclient-dev
# скачиваем и распаковываем redmine
cd /opt
wget http://files.rubyforge.vm.bytemark.co.uk/redmine/redmine-2.3.1.tar.gz
tar -zxvf redmine-2.3.1.tar.gz
cd /var/www
ln -s /redmine-2.3.1/public redmine
chown -R www-data:www-data /opt/redmine-2.3.1
Заходим в mysql клиент и создаем базу и пользователя:
CREATE DATABASE redmine_default CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my-password';
GRANT ALL PRIVILEGES ON redmine_default.* TO 'redmine'@'localhost';
Создаем конфигурацию базы
cd /redmine-2.3.1/config
cp database.yml.example database.yml
vi database.yml
и заполняем ее
production:
adapter: mysql2
database: redmine_default
host: localhost
username: redmine
password: my-password
encoding: utf8
Создаем файл настроек:
cd /redmine-2.3.1/config
cp configuration.yml.example configuration.yml
vi configuration.yml
и настраиваемся (благо в конфиге полно комментариев).
Теперь ставим ruby bundle
gem install bundler
bundle install --without development test postgresql sqlite
rake generate_secret_token
bundle install
и готовим базу данных:
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data
После всего этого нужно настроить виртуальных хост в апаче и можно пользоваться.
Настройка (получение информации о комитах из репозитория) описана тут — Redmine Settings [35]. С выбрал вариант в котором с помощью Cron настраивается автоматический опрос репозиториев.
Не забываем про .NET платформу. Основные компоненты это собственно mono платформа и XSP (ASP.NET сервер) ставятся вот так:
sudo apt-get install mono-common mono-xsp4
Все, теперь почти все прелести .NET нам доступны.
Деталей можно почерпнуть тут: Mono for Debian [36].
А венчает все это — CI сервер. Давайте рассмотрим как его поставить и настроить например для… PHP:
Ставим Jenkins
sudo apt-get update
sudo apt-get install php5-cli php5-xdebug php-pear ant git
php -r 'echo "Xdebug loaded? "; echo (extension_loaded("xdebug")) ? "yes" : "no"; echo chr(10);'
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo bash -c "echo 'deb http://pkg.jenkins-ci.org/debian binary/' > /etc/apt/sources.list.d/jenkins.list"
sudo apt-get update
sudo apt-get install jenkins
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin checkstyle
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin cloverphp
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin dry
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin htmlpublisher
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin jdepend
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plot
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin pmd
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin violations
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin xunit
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git
java -jar jenkins-cli.jar -s http://localhost:8080 safe-restart
sudo pear upgrade PEAR
sudo pear channel-discover pear.pdepend.org
sudo pear channel-discover pear.phpmd.org
sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover components.ez.no
sudo pear channel-discover pear.symfony-project.com
sudo pear install pdepend/PHP_Depend
sudo pear install phpmd/PHP_PMD
sudo pear install phpunit/phpcpd
sudo pear install phpunit/phploc
sudo pear install PHPDocumentor
sudo pear install PHP_CodeSniffer
sudo pear install --alldeps phpunit/PHP_CodeBrowser
sudo pear install --alldeps phpunit/PHPUnit
Конфигурируем:
— скачиваем /build.xml из http://jenkins-php.org/ [37] и редактируем под свой проект
— качаем PMD правила http://phpmd.org/ [38] и кладем как /build/phpmd.xml в проект
— опционально можно добавить ее правил http://pear.php.net/ [39] и ложим как /build/phpcs.xml в проект
— конфигурируем PHPUnit в /tests/phpunit.xml
— скачиваем шаблон задания
cd /var/lib/jenkins/jobs/
sudo git clone git://github.com/sebastianbergmann/php-jenkins-template.git php-template
sudo chown -R jenkins:nogroup php-template/
sudo /etc/init.d/jenkins stop
sudo /etc/init.d/jenkins start
— создаем новое задание из шаблона, привязываем к репозиторию (возможно придется добавить плагин под свою систему контроля версий) и радуемся.
Сам процесс разделен на 2 вида:
— полное (делаю выборочно, когда чувствую что в системе прошло много изменений и нужно бы сохраниться)
— частичное (все узлы системы которые подвержены ежедневным изменениям: базы, исходники и т.д.)
Сбор полного дампа произвожу с помощью remastersys скриптом.
#!/bin/bash
# замеряем сколько идет резервирование
start=`date +%s`
echo '[FULL BACK UP Start]'
DATE_NOW=`date +%F`
echo '[FULL BACK UP Dump Creation]'
# запускаем резервирование
sudo remastersys backup install-$DATE_NOW.iso
echo '[FULL BACK UP Dump Saving]'
# перемещаем в основную папку хранения
sudo cp /home/remastersys/remastersys/install-$DATE_NOW.iso /home/backups/system-iso/install-$DATE_NOW.iso
sudo cp /home/remastersys/remastersys/install-$DATE_NOW.iso.md5 /home/backups/system-iso/install-$DATE_NOW.iso.md5
echo '[FULL BACK UP Clean up]'
# чистим tmp
sudo remastersys clean
echo '[FULL BACK UP End]'
end=`date +%s`
runtime=$((end-start))
echo 'Backup time =' $runtime 'sec(s)'
Частичное выполняется скрпитом в cron еженощно.
#!/bin/bash
start=`date +%s`
echo '[BACK UP Start]'
DATE_PREF=`date +%F`
echo '[BACK UP Config]'
# настраиваем пути к папкам
BACKUP_MYSQL_DIR=/home/backups/mysql/$DATE_PREF
BACKUP_WWW_DIR=/home/backups/www/$DATE_PREF
BACKUP_GIT_DIR=/home/backups/git/$DATE_PREF
echo '[BACK UP Clean up]'
# чистим все что лежит дольше недели
find /home/backups/mysql/ -mtime +7 -print -mindepth 1 -delete >/dev/null 2>&1
find /home/backups/www/ -mtime +7 -print -mindepth 1 -delete >/dev/null 2>&1
find /home/backups/git/ -mtime +7 -print -mindepth 1 -delete >/dev/null 2>&1
echo '[BACK UP Not Clened Items]'
ls /home/backups/mysql/
ls /home/backups/www/
ls /home/backups/git/
echo '[BACK UP Back Up Hosts]'
# резервируем хосты
tar cpzf $BACKUP_WWW_DIR-www.tgz /home/www/ >/dev/null 2>&1
echo '[BACK UP Back Up Repositories]'
# резервируем репозитории
tar cpzf $BACKUP_GIT_DIR-git.tgz /home/git/ >/dev/null 2>&1
echo '[BACK UP Back Up MySQL]'
# резервируем базы данных
mysqldump -q -u root -p<password> -h localhost tt_rss | gzip -c > $BACKUP_MYSQL_DIR-tt_rss.sql.gz
mysqldump -q -u root -p<password> -h localhost test | gzip -c > $BACKUP_MYSQL_DIR-test.sql.gz
mysqldump -q -u root -p<password> -h localhost redmine | gzip -c > $BACKUP_MYSQL_DIR-redmine.sql.gz
mysqldump -q -u root -p<password> -h localhost phpmyadmin | gzip -c > $BACKUP_MYSQL_DIR-phpmyadmin.sql.gz
mysqldump -q -u root -p<password> --skip-lock-tables -h localhost performance_schema | gzip -c > $BACKUP_MYSQL_DIR-performance_schema.sql.gz
mysqldump -q -u root -p<password> --skip-lock-tables -h localhost information_schema | gzip -c > $BACKUP_MYSQL_DIR-information_schema.sql.gz
mysqldump -q -u root -p<password> --events -h localhost mysql | gzip -c > $BACKUP_MYSQL_DIR-mysql.sql.gz
echo '[BACK UP New Items]'
ls /home/backups/mysql/ | grep $DATE_PREF
ls /home/backups/www/ | grep $DATE_PREF
ls /home/backups/git/ | grep $DATE_PREF
echo '[BACK UP End]'
end=`date +%s`
runtime=$((end-start))
echo 'Backup time =' $runtime 'sec(s)'
echo '========================================================='
Как видно — храню последние 7 копий.
Спасибо! Надеюсь было интересно!
P.S. В случае возникновения вопросов — буду рад помочь.
P.P.S. Дайте, инвайт, пожалуйста.
Автор: atamur
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/50168
Ссылки в тексте:
[1] хостинг: https://www.reg.ru/?rlink=reflink-717
[2] icepro: http://habrahabr.ru/users/icepro/
[3] Начинка: #1
[4] OS: #2
[5] Dev Environment: #3
[6] Резервное копирование: #4
[7] LinuxLive USB Creator: http://www.linuxliveusb.com/
[8] sysstat: http://packages.debian.org/ru/squeeze/sysstat
[9] Permanent link to How to configure sysstat/sar on Ubuntu/Debian: http://www.leonardoborda.com/blog/how-to-configure-sysstatsar-on-ubuntudebian/
[10] lynis: http://www.rootkit.nl/projects/lynis.html
[11] Установка rtorent+rutorrent на Debian/Ubuntu: http://blog.itradius.ru/?p=15
[12] Configuring exim4 in Ubuntu to use GMail for SMTP: http://www.manu-j.com/blog/wordpress-exim4-ubuntu-gmail-smtp/75/
[13] Настройка домашнего сервера на базе Debian: http://habrahabr.ru/post/48619/
[14] Установка и настройка Samba в Debian GNU/Linux и Ubuntu Linux: http://debiania.blogspot.com/2009/05/samba-debian-gnulinux-ubuntu-linux.html
[15] LAMP: #lamp
[16] nginx: #nginx
[17] Node.js: #node
[18] MongoDB: #mongo
[19] GIT: #git
[20] Java: #java
[21] Python: #python
[22] Ruby: #ruby
[23] .NET: #net
[24] Jenkins: #jenkins
[25] Configuring Xdebug for PHP development/Linux: http://docs.joomla.org/Configuring_Xdebug_for_PHP_development/Linux
[26] Remote Xdebug на PhpStorm: http://www.seocoder.org/2011/02/05/remote-xdebug-na-phpstorm/
[27] Установка и настройка Nginx. Nginx frontend + Apache backend.: http://cname.org.ua/2010/04/%D1%83%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-nginx-nginx-frontend-apache-backend-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2/
[28] Installing Node.js: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
[29] How To Fix «Server Refused Our Key» Error That Caused By RSA Public Key Generated By Puttygen: http://www.youtube.com/watch?v=Bmpj-WdXllQ
[30] Настройка сервера. Gitolite — хостинг git-репозиториев: http://klen.github.io/gitolite-setup-ru.html
[31] Собственный git-сервер с нуля : http://blog.publicfields.net/2010/09/git.html
[32] Setting up Gitweb on Debian: http://blog.gauner.org/blog/2010/02/03/setting-up-gitweb-on-debian/
[33] Writing your first Django app: https://docs.djangoproject.com/en/dev/intro/tutorial01/
[34] Getting Started with Rails: http://guides.rubyonrails.org/getting_started.html
[35] Redmine Settings: http://www.redmine.org/projects/redmine/wiki/RedmineSettings#Repositories
[36] Mono for Debian : http://mono-project.com/DistroPackages/Debian
[37] http://jenkins-php.org/: http://jenkins-php.org/
[38] http://phpmd.org/: http://phpmd.org/documentation/creating-a-ruleset.html
[39] http://pear.php.net/: http://pear.php.net/manual/en/package.php.php-codesniffer.annotated-ruleset.php
[40] Источник: http://habrahabr.ru/post/205120/
Нажмите здесь для печати.