Устанавливаем локальный Rails on Ruby для OpenStreetMap

Возможно кому то еще пригодится странная конструкция из несколько софтинок, позволяющая наносить на карту свои объекты и затем показывать с веб-сервера.
В условиях когда интернет слабый или его вообще нет (по разным причинам) локальная реализация может пригодится.
Кому то просто захочется поставить рельсовый сервер для обучения.
Моя задача простирается чуть далее, редактировать, складывать результаты на локальный сервер и с него показывать для внутренних нужд.
Установка Rails on Ruby это только начало пути.

STEP 1
Ставим ubuntu-12.04.3-server-i386. (Здесь и далее версии файлов с точностью до точки)
English – Enter
Install Ubuntu Server – Enter
Language – English – Enter
Country, territory or area – United States – Enter
Detect keyboard layout – No – Enter
Country od origin for the keyboard – English(US) –Enter
Keyboard layout – English(US) – Enter
Hostname – Ubuntu – Continue
Full name for the new user – OSM-USER – Continue
Username for your account – osm – Continue
Choose a password for the new user – password –Continue
Re-enter password to verify – password –Continue
Encrypt your home directory – No – Enter
Select your time zone – Select from worldwide list – Enter
Partitioning method – use entire disk – Enter
Select disk to partition – SCSI3 (0,0,0) – XXX GB ATA HARDDISK – Enter
Write the changes to disk – Yes – Enter
HTTP proxy information (blank for none) - - Continue
How do you want to manage upgrades on this system – No automatic updates – Enter
Choose software to install – Ничего не выбираем – Continue
Install the GRUB boot loader to the master boot record – Yes – Enter
Installation complete – remove CD-ROM – Continue
STEP 2 Небольшие настройки ( SSH, Putty)
Сервер загрузился, логинимся пользователем osm (мы его определили при инсталляции) с паролем password (тоже при инсталляции завели).

$ sudo apt-get install ssh

Как минимум стоит поправить номер порта в конфигурации sshd:

$ sudo vi /etc/ssh/sshd_config

любой отличный от дефолтного 22.
и перезапускаем sshd:

$ sudo service ssh restart
$ ifconfig 

(если адрес выделен динамически то стоит его посмотреть и записать, если статический то тогда до настроить сетевое окружение в файле /etc/network/interfaces)
Скачиваем из инета putty на свою любимую виндовую машину и указываем в настройках адрес удаленной машины, порт и протокол SSH).
Почему putty? Он позволит копировать и переносить длинные установочные команды из текста приведенного ниже. (в винде «Копировать» в командной строке putty просто нажать правую клавишу мышки)
Еще немного системных настроек
Выставим timezone

$ sudo dpkg-reconfigure tzdata

Установим время-дату (MMDDHHmmYYYY):

$ sudo date 101111102013 	

STEP 3 Собственно установка Ruby on Rials и локального OpenStreetMap сервера
(Установка написана по материалам с GiHub)
Минимальная конфигурация представляет bundle из следующих продуктов:
• Ruby 1.9.3
• RubyGems 1.3.1+
• Postgres 8.3+
• ImageMagick
• Bundler
Указанная конфигурация может быть установлена на Ubuntu следующими командами:

$ sudo apt-get install ruby1.9.1 libruby1.9.1 ruby1.9.1-dev ri1.9.1 libmagickwand-dev libxml2-dev libxslt1-dev apache2 apache2-threaded-dev build-essential git-core postgresql postgresql-contrib libpq-dev postgresql-server-dev-all libsasl2-dev
$ sudo gem1.9.1 install bundle 

В двух местах выскочили предупреждения lib not found но это в разделе документация для ri (предположим что не страшно).
Скачаем repository в нашу домашнюю директорию ( $ cd ~/:wink:
Содержимое сравнительно большое (~150MB), запускаем:

$ git clone https://github.com/openstreetmap/openstreetmap-website.git

Устанавливаем Ruby gems
Мы воспользуемся набором инструментом bundle Bundler для создания среды rubygems необходимой для нашего проекта.

$ cd openstreetmap-website
$ sudo bundle install

Настраиваем приложения
Нам необходимо создать конфигурационный файл config/application.yml скопировав его с example template. В файле содержаться различные конфигурационные опции.

$ cp config/example.application.yml config/application.yml

Вы можете уточнить параметры настроек изменив их в файле config/application.yml.
Настройка параметров Базы Данных
The Rails Port использует три базы данных - одна для разработки, одна для тестирования и одна для «боевой» эксплуатации. Конфигурационные настройки хранятся в файле config/database.yml, который мы тоже скопируем с файла примера (example template).

$ cp config/example.database.yml config/database.yml

PostgreSQL сконфигурирован, по умолчанию, устанавливать локальные соединения не требующие имени пользователя и пароля. Это хорошо для этапа разработки.
Если Вам потребуется изменить эти настройки то Вы сможете это проделать изменив параметры файла config/database.yml и поправить инструкции приведенные ниже по тексту.
Настройка параметров аккаунта в PostgreSQL
Нам необходимо создать PostgreSQL role (то есть пользовательский аккаунт) for your current user, и для этого потребуются права superuser чтобы мы смогли создавать базы данных.

osm@TS: $ sudo -u postgres –i
postgres@TS: createuser -s <username>
postgres@TS: exit

Создаем базы данных
Вначале установим Javascript runtime, в явном виде его нет, потому ставим nodejs который установит нам необходимый пакет.

$ sudo apt-get install nodejs

Для создания баз данных для разработки, тестирования и эксплуатации исполняем (в оригинале было $ sudo bundle exec rake db:create, однако завершается эта команда с ошибкой. В гугле куча советов, но почему то в моем случае эффекта не дало, потому следующая кривизна):

osm@ubuntu:~/openstreetmap-website$ sudo -u postgres –i
postgres@ubuntu:~$ createdb -E UTF8 -O osm osm
postgres@ubuntu:~$ createdb -E UTF8 -O osm osm_test
postgres@ubuntu:~$ createdb -E UTF8 -O osm openstreetmap
postgres@ubuntu:~$ exit

Ставим PostgreSQL Btree-gist Extension

$ psql -d openstreetmap -c "CREATE EXTENSION btree_gist"

Компилим PostgreSQL Functions

$ cd db/functions
$ make libpgosm.so
$ cd ../..
$ psql -d openstreetmap -c "CREATE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '`pwd`/db/functions/libpgosm', 'maptile_for_point' LANGUAGE C STRICT"
$ psql -d openstreetmap -c "CREATE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '`pwd`/db/functions/libpgosm', 'tile_for_point' LANGUAGE C STRICT"
$ psql -d openstreetmap -c "CREATE FUNCTION xid_to_int4(xid) RETURNS int4 AS '`pwd`/db/functions/libpgosm', 'xid_to_int4' LANGUAGE C STRICT"

Устанавливаем структуру Баз (Database structure)
Чтобы создать все таблицы, индексы и пр. запускам:

$ bundle exec rake db:migrate RAILS_ENV=development

(вместо оригинального bundle exec rake db:migrate)
Теперь можно запустить тесты, чтобы быть уверенным что в целом все хорошо:

$ bundle exec rake test

Тест занимает несколько минут и output parser может сказать о нескольких ошибках типа “Attribute lat redefined.” Их можно игнорировать.
Собственно можно запустить сервер

$ bundle exec rails server

Теперь с помощью броузера можно посмотреть результат своей работы по адресу http://localhost:3000/
То что Вы увидите в броузере это карта с внешнего tile сервера. Однако сделан первый шаг – у нас есть локальный рельсовый сервер.
To be continied….

Полагаю, что данной статье место всё же в нашей википедии, чем на форуме. Так же явно нехватает введения где было бы сказано о чём идёт речь в данной инструкции :wink:

Ее еще рано в вики помещать.
Хотелось бы пообсуждать, чтобы еще кто то попробовал.
Есть проблемы при установке, возможно что кто то предложит пути решения.

Задавать вопросы и отвечать на них, на форуме немного проще.

Achechet, я думаю человек, которые разворачивали рэйлз порт локально, можно пересчитать по пальцам одной руки, причем во всем мире. Это все-таки не ГИС.

Благодаря проекту OpenStreetMaps я познакомился с Ruby on Rails.
Это довольно интересный фреймворк сам по себе.
Как утверждает инет его используют многие разработчики для сложных корпоративных приложений.
На установленном bundle я уже начал процесс освоения фреймворка.
Может быть кто то еще захочет сделать подобное.

Achechet в конце лучше будет сделать скриншоты то что увидется на localhost, возможно даже если есть желание снять видео по использованию (в1080р желательно) : ) . Дабы тем кто будет пользоваться или просто кому любопытно, не пришлось ставить. Так же отдельно желательно указать что инструкция для Unix like , для Windows не подходит или может в будущем.

На localhost все идентично картинке на openstreetmap.org в том числе и настройки и встроенный редактор.
Установка начинается с инсталляции системы, как Вы заметили.
Причем конкретной системы с конкретной версией дистрибутива.

Из под винды можно использовать виртуальную машину и в ней инсталлировать.

Интересно, на шаред хостинге с рельсами и пгскл 8.4 поднять можно (консоли нет, постгис отутсвует)?

Если в шелл хостинг пускает и позволит права супер пользователя, то наверное да.
Там если посмотреть то сплошные sudo.
И какой линух на хостинге? Можно конкретный заказать?
В конце концов у хостера можно попросить что развернул.
Ruby on Rails это же фреймворк для разработки именно веб приложений.

Я пробовал на Gentoo так весь исплевался.

Step1 просто убил, на взлёте, но это к слову.

Ничего сложного я не помню в установке и разворачивании API сервера под R/R, делал это несколько раз для разных нужд. Одна из инсталяций до сих работает на нужды гидрологов, топологов и прочих -ологов, которые в два отдела совместно работают над одной базой, данные из которой никогда не попадут в ОСМ. Сам формат хранения данных и совместной работы пришёлся им по вкусу и JOSM+RR-API заменили им дорогой проприеритарный инструмент создания геоданных. Вот только там полная заморозка версий всех инструментов, компонентов и форматов данных, навсегда.

Основная проблема у меня была в поддержании апи-сервера в рабочем и актуальном состоянии одновременно. Либо одно, либо другое. Проблема заключается больше в самой идеологии ОСМ в целом: могут вноситься любые изменения в сам API, без какой либо поддержки со стороны инструментов. Как минимум я помню три версии API v 0.6, которые на практике имеют кардинальные отличия, ломающие всю работу API сервера. Вначале в угоду redaction-геноциду изменили поведение версий объектов и стали появляться объекты с дырами в истории и нулевыми версиями и т.д., от которых API сервер стало просто тошнить. При попытке обновить его, возникла проблема с тем, что не всё в текущей версии фреймворка RR его устраивает и нужны новые рельсы, после обновления рельс, оказалось что не все компонеты фреймворка вообще работают на новых рельсах. Вторая проблема вылезла, когда в новом апи появились ченжсеты с действиями удаления, но без самих данных, на них стал падать уже осмосис, а новый осмосис, который не падал на новых osc, не работал со старым API сервером и опять вся цепочка зависимостей.

Мне вообще не понятно, как существует и как реализуется обновление всей текущей инфраструктуры OSM, учитывая, что большая часть базовых инструментов получает нужный функционал, при критически важных изменениях в API, без смены версии самого API, только спустя очень продолжительное время, исчисляемое иногда месяцами.

Max Vasilev, предположительно - вот так берут и пилят, подгоняют одно под другое на тестовом сервере. В одной дружественной конторе такую ситуацию называли “техническая олигархия”, когда некая внутренняя система была написана и собрана из частей настолько странно, что работать с ней отказывались все, кроме ее непосредственных авторов, а руководство боялось их как-то прижать или уволить, чтобы не остаться без работающей системы.
Именно потому я и советовал в параллельной теме благополучно забить на OSM API и прочее, а собрать ровно то же самое, но из средств, которые не завязаны между собой намертво, взаимозаменяемы и протестированы многими тысячами пользователей, а не десятками энтузиастов. (В огород QGIS я тоже могу камень кинуть - там тоже периодически что-то ломается, но QGIS - один из десятков продуктов с нужным функционалом, а не один из трех.)

Значит, мимо. Договорится с хостером значит поменять пакет услуг, и чую, это уже будет VPS.

дубль

Чтобы не заморачиваться с sudo и bundle, здесь лучше сразу ставить rbenv, rbenv-build (либо rvm), и с ним ruby со всем бандлом к себе в хоум.
Не кажый хостинг позволит подгрузить btree_gist в postgresql.

По идее, можно сделать образ для vagrant, с провижном на puppet/chef. Или есть уже у кого?

Achechet, большое спасибо за статью! Только начинаю разбираться с темой ГИС. Поставили сервер по этой статье http://switch2osm.org/serving-tiles/manually-building-a-tile-server-12-04/, залили данные в базу, но не понятно как создавать и редактировать свои слои. Выясняется, что нужен еще rails сервер, а Apache тогда получается не нужен? Сейчас же он выводит карту в браузер.

Одна только проблема, так таковых слоёв в ОСМ нет.
Рельсы отдают тайлы, а Апач старницу разметки, чтобы пользователь видел эти тайлы.

Нам нужно чтоб можно было слои скрывать/показывать при нажатии на галочки. В openlayers можно настроить разные источники для разных слоев. Если каждый слой хранить отдельно, получится ведь?

wonderful-fungi, получится, только использовать осм для создания своих слоев - это пожалуй слишком сложно и муторно.
Вам слой векторный или растровый нужен?

чуть по проще, для прочтения интересно

Создание простейшего HTTP-сервиса для публикации векторных данных
http://gis-lab.info/qa/http-publish-vector.html

Основы работы динамических TMS-сервисов
http://gis-lab.info/qa/dynamic-tms.html

Просто если нужны векторные данные, то ОСМ для этого прохо приспособлен. Даже наверное фильтры в JOSM не помогут.
А вот растровые данные это легко, нужны только правильно составленные стили для рендеринга.