Fork me on GitHub

The WebDevil

Enjoy development

OpenVZ on Ubuntu 8.10

March 1st, 2009

Только-что закончил эксперименты с OpenVZ на Ubuntu 8.10 (intrepid). Успешно.

Итак, задача: создать виртуальную (для начала одну) машину с Ubuntu 8.10, которая будет доступна в локальной сети. Хост-система – Ubuntu 8.10, выступает в роли роутера для локальной сети, имеет на себе DHCP-сервер. Настройки сети виртуальная машинка должна получать по DHCP, роутиться другим роутером (два провайдера). Задача осложняется тем, что из intrepid убрали поддержку виртуализации посредством OpenVZ и сделали упор на KVM. Так как имеем машинку на базе AMD Duron (900MHz) то приходится выкручиваться. Опыт, как говорится, бесценен.

Как мне это удалось…

LVM Rocks

March 1st, 2009

Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку – и последний год стал его использовать, так как постиг скрытую в нем мощь :)

Одним из примеров я и хочу поделиться.

git, gitosis, tailor, and bzr

December 9th, 2008

git

До общения с Oleganza я не видел у git каких-либо ярких преимуществ перед bzr.
И, наверное, не увидел бы, если бы не Олег.

Первое что было самым необычным – git полностью децентрализованый. И привычный svn-like workflow тут не работает. Надо было привыкать к branch-style.

Второе – это то, что команды с теми же названиями что и у svn имеют другой смысл.

Жутко понравилось что ветки git держит в себе, то есть не надо плодить по 3-4 папки для разных фичей.

gitosis

Также я задумался о совместной работе. github – это, конечно, хорошо, но у меня уже есть багтракер понимающий git. Отчего бы не попробовать git на своем сервере?

Был заведен юзерь git без пароля

sudo adduser --shell /bin/sh --gecos 'git version control' --disabled-password --home /home/git git

поставлен gitosis

sudo apt-get install gitosis

сделаны небольшие правки его сорсов (дело в том, что по умолчанию gitosis создает репо с маской 0750, мне же надо было с 0755 – чтоб www-data мог его читать):
правим

/var/lib/python-support/python2.5/gitosis-0.2-py2.5.egg/gitosis/repository.py

и заменяем 0750 на 0755.

Подробнее описано в блоге разработчика gitosis.

tailor and bzr

Когда все взлетело с git, решил попробовать отконвертировать при помощи утилиты tailor старые репо из bzr в git.
Конфиг получился примерно такой (замечания приветствуются):

[DEFAULT]
verbose = True

[project]
target = git:target
start-revision = INITIAL
root-directory = /home/dm/tmp/bzr2git
state-file = tailor.state
source = bzr:source
subdir = bzr2git.tmp

[bzr:source]
repository = /home/dm/bzr/BZR_PROJECT_HERE

[git:target]
repository = /home/dm/tmp/bzr2git/tmp/.git

и после запуска

tailor bzr2git.conf

в /home/dm/tmp/bzr2git/bzr2git.tmp появляется вполне живой git-репозитарий. Его я уже стягивал к себе и вливал в gitosis от себя.

Примечание

git не отслеживает пустые папки, и в процессе конвертации теряются “log”, “tmp”, etc… Чтоб отслеживал достаточно

mkdir log
touch log/.empty

5 new toolz

November 23rd, 2008

Получил эстафету от bsn и задумался, что же у меня появилось за последнее время. Скажу честно – не все полезное, но как бы там ни было…

  1. PSP – эта маленькая консоль помогает мне в те моменты когда становится совсем скучно и уныло. Спасибо Genn за то что подбил меня таки на ее покупку.
  2. Git – Женя уже описал все его вкусности которые зацепили и меня, так что повторяться не буду. Спасибо oleganza за пинок в нужную сторону.
  3. gitosis – весьма неплохое решение для хостинга git-репозиториев. Жаль нету такого для bzr.
  4. Navicat MySQL/PostgreSQL – по-моему, это две самых приятных софтины из всего что есть для быстрого и комфортного просмотра данных в БД. Да, могло быть и лучше – но я не нашел. ODBC и всякие подобные костыли меня не привлекают, хочется чистого и светлого…
  5. PostgreSQL – всерьез думаю переходить на эту СУРБД. Не то чтоб я упирался в какие-то косяки MySQL, но хочется попробовать что-то новое. Пока читаю книжку, копаюсь, пробую.

В связи с переходом на git был выброшен Versions.app – штука хорошая, но больно дорогая. А бэта проэкспайрилась. И пользуюсь svn я ну уж очень редко в последнее время.

PS: я не кому не навязываю написать свой список. Но если возникнет желание – вы знаете что делать ;)

DDoS

October 10th, 2008

Привалило мне сие несчастье некоторое время назад. Ничем не примечательный сайт, ДДоСят уже неделю. В процессе борьбы выросло небольшое детище на Ruby, именуемое Bananoid. От слова bann. И живет оно на Github’е. Пока оно меня спасает, но непростительно есть 50-100% CPU. Ну что ж, будем лечить.

Хочу особо поблагодарить Критика, Devil’a и Andrew за помощь в бою.

just for fun

September 25th, 2008

Textmate, Pastie and Adium 1.3

September 3rd, 2008

Есть у редактора TextMate замечательная фича – можно выделить текст и при помощи нехитрой комбо отправить его прямо на pastie.textmate.org, а при этом получить ссылку на этот код в clipboard или другое приложение.

И все было чудесно, TextMate выпущен давно… А Adium обновился. Вместе с обновлением сменилось и API, и теперь эта комбо не может выполниться при запущеном Adium.

Искал я долго… но нашел. Идем в репозитарий бандлов для TextMate, а точнее сразу сюда.
Понадобится два файла – get_destinations.scpt и paste_to_destinations.scpt. Это AppleScript’ы, которые передают бандлу списки окон, и они же вставляют в доступные приложения ссылку на pastie.
Этими файлами заменяем существующие в

/Applications/TextMate.app/Contents/SharedSupport/Bundles/TextMate.tmbundle/Support

и да будет щастье.

UPDATED
А лучше класть бандлы в ~/Library/Application Support/TextMate/Bundles.

Multilingual site on Rails

August 29th, 2008

Задавался давно уже вопросом о том, как сделать многоязычный сайт на рельсах. Сначала нехватало знаний, потом времени.
Недавно понадобилось таки реализовать такой сайт. Сразу скажу, получилось.
Read the rest of this entry »

Server moving adventures

August 7th, 2008

Второй день занимаюсь переездом содержимого одного сервера на другой. Другой – VPS под FreeBSD (привет, ДЦ Воля).

В общем, это последний раз когда я до оплаты сказал что он неплох. Теперь только реальные сервера. Ну и может VDS под Linux… В общем, именно эта реализация ужасна. Меня мало интересует как и что – факт налицо.
Приключения только начались…

В PowerDNS есть пара плюшек, которые я раньше не замечал. Одну из них – записи “URL” я сегодня попробовал, настроил и остался вполне доволен.

Что же такое URL-запись? Это фича PowerDNS, при помощи которой можно делать редирект домена на заданный URL.
Например, запись выглядит как

some.domain.com URL http://other.domain.com/some_domain_com

На самом деле в поле со значением записи может быть ссылка куда угодно.
В конфиге сервера нужно указать

...
fancy-records=yes
urlredirector=77.120.99.180
...

Когда приходит запрос к DNS’у для домена some.domain.com отдается 77.120.99.180, указанный в конфиге, как если бы это была обычная “А”-запись.
Браузер отрезолвив имя идет на http://some.domain.com. На этом адресе висит http-сервер (я повесил lighttpd), у которого скрипт лезет в БД и для указанного домена ищет соответствующую ему URL-запись и редиректит браузер туда. Все просто и тривиально.

Для lighttpd у меня конфиг дополнился такими строками:

$SERVER["socket"] == "77.120.99.180:80" {
    $HTTP["host"] =~ "(.*)" {
        magnet.attract-raw-url-to = ("/var/www/lighttpd/pdns-url-redirector.lua")
    }
}

То есть все что приходит незамедлительно обрабатывается упомянутым lua-скриптом. Почему lua? С ним работает mod_magnet, и мне было интересно написать этот скриптик. Вот он:

require "luasql.mysql"
env = assert (luasql.mysql())
con = assert (env:connect("dnsdb", "dns_user", "dns_pass_for_readonly_records_table", "localhost"))
domain = lighty.request["Host"]

mysql_replacements = {
  ["\0"] = "\\0",
  ["\n"] = "\\n",
  ["\r"] = "\\r",
  ["\'"] = "\\'",
  ["\""] = "\\\"",
  ["\026"] = "\\Z",
  ["\b"] = "\\b",
  ["\t"] = "\\t",
}

function fixsql (s)
  return (string.gsub (tostring (s), "[%z\n\r\'\"\026\b\t]",
    function (str)
        return mysql_replacements [str] or str
    end ))
end -- fixsql

cur = assert (con:execute( string.format("SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'", fixsql(domain) ) ) )
result = cur:fetch()
if result then
    redirect_to = string.format("%s", result)
else
    redirect_to = "http://daemons.org.ua/"
end

cur:close()
con:close()
env:close()

--lighty.content = { string.format("SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'", fixsql(domain) )  }
--lighty.header["Content-Type"] = "text/plain"
--return 200

lighty.header["Location"] = redirect_to
return 301

Комментарий начинается с “–”. Закоментарены строки для отладки скрипта.
Для соединения с мускулем из lua доставил пакет liblua5.1-sql-mysql-2.

Скрипт писал долго, но это было интересно. И небесполезно =)


UPD: во избежание DoS/DDoS атаки на мускуль возможны два варианта апгрейда метода:
1. По крону раз в 5 минут генерить sqlite-БД состоящую из одной таблицы из двух полей – domain, target
2. Раз в 5 минут генерить сам скрипт с вынесенными в него в виде хеша записями. Тогда скрипт вообще никуда подглядывать не будет.