Správa linuxového serveru: Nasazení aplikace Redmine

Minulý díl se věnoval nasazení Ruby aplikací obecně. Tento díl vám vše ukáže na konkrétním příkladu, a sice na nasazení systému pro správu projektů Redmine.

Redmine

Redmine je svobodný (GNU GPLv2) správce projektů, systém pro sledování chyb (bug tracker), wiki, diskusní fórum, kalendář, vše integrováno v jednom komplexním balíčku. Integrace SCM je zde samozřejmostí. Lze jej použít pro usnadnění vývoje softwaru, ale také jako aplikaci pro správu projektů obecně, nikoliv nezbytně jen těch softwarových. Umí dobře zastoupit groupware nebo zastat funkci osobního managementu. Umí dokonce i generovat Ganttův diagram. Pokud byste měli zájem o osobní management dle oblíbené metodiky GTD, Redmine vám možná nebude úplně vyhovovat – v takovém případě se můžete podívat na jinou Ruby on Rails aplikaci – Tracks. Ale zpět k Redmine. Redmine je modulární, je tedy možné vytvářet moduly rozšiřující jeho funkčnost nebo použít některé z již vytvořených modulů.

Vývoj aplikace je spravován pomocí Redmine – chcete-li se tedy podívat na běžící instanci, stačí se podívat na web projektuDemo k vyzkoušení je pak k dispozici na subdoméně.

V tomto dílu seriálu předpokládám, že znáte obsah minulého dílu, kde najdete obecné informace o nasazování Ruby aplikací na server. Na tyto informace se budu odkazovat, resp. budu předpokládat, že je znáte. Stejně tak předpokládám, že distribucí, kterou na serveru používáte, je Debian v aktuální verzi (tj. Squeeze). V případě jiné distribuce si budete muset některé příkazy upravit.

Předesílám, že vzhledem k obsáhlosti je návod rozdělený na dva díly. Tento díl končí funkční testovací instancí Redmine, následující díl pak objasní produkční nasazení pomocí Thinu a Nginx.

Vytvoření uživatelského účtu a zprovoznění RVM

Jako první vytvořte uživatelský účet, pod kterým bude Redmine běžet:

adduser redmine

Poté se ujistěte, že máte k dispozici SCM nástroj Git, dále nástroj curl a nástroje pro kompilaci:

aptitude install git curl build-essential

Nyní získejte oprávnění uživatele Redmine. Jste-li root, můžete provést:

su redmine -
cd

Ujistěte se, že soubor .bashrc existuje v domovském adresáři:

touch ~/.bashrc

Náhledem do dokumentace se ujistěte, že následující příkaz pro instalaci RVM je správně (mohl se změnit), a proveďte jej:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Nyní byste měli mít k dispozici RVM nainstalované pod vaším redmine uživatelským účtem. RVM je třeba obvykle ještě „aktivovat“ nastavením příslušných systémových proměnných, což lze provést příkazem, který vám RVM po instalaci vypíše, spolu s řadou informací, které vám doporučuji projít si. Tento příkaz si raději také ověřte:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

RVM vám doporučí instalovat pro jednotlivé Ruby interprety i určité balíčky. Opět doporučuji řídit se instrukcemi, jež vám RVM po instalaci poskytne. Uvádím nicméně seznam balíčků, který jsem obdržel já na Debianu Squeeze:

aptitude install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

Tyto balíčky je třeba nainstalovat před samotnou instalací (resp. kompilací) Ruby interpretu (viz níže), jinak vám instalace dalších komponent bude dělat problémy. V takovém případě proveďte opětovnou rekompilaci interpretu poté, co balíčky nainstalujete.

Instalace Ruby interpretu a potřebných komponent

Potřebnou verzi Ruby a příslušných komponent naleznete v přehledové tabulce v oficiálním návodu pro instalaci Redmine. V době psaní článku byl potřebný Ruby interpret pro aktuální verzi Redmine (1.2.1) buď 1.8.6, nebo 1.8.7. Vyberte si tedy a nainstalujte příslušný interpret:

rvm install 1.8.7

Tuto verzi interpretu „aktivujte“ a nastavte jako výchozí:

rvm use 1.8.7 --default

Mezi další potřebné komponenty patří jednoznačně Ruby framework Ruby on Rails. Ten si ovšem Redmine tahá s sebou, pokud jej instalujete z oficiálního tarballu. Používáte-li verzi ze SCM, budete muset Ruby on Rails nainstalovat ručně. V opačném případě vám postačí nainstalovat Rack, i18n a RubyGems (viz níže):

gem install rack -v=1.1.1
gem install i18n -v=0.4.2

Nyní je třeba vyřešit problém s RubyGems, který musí odpovídat příslušné verzi Rails frameworku. Jestliže instalujete aktuální verzi (1.2.1), která vyžaduje Rails 2.3.11, pak nezapomeňte nainstalovat RubyGems verze nižší než 1.7.0:

rvm rubygems 1.6.0

V případě, že používáte starší Rails 2.3.5, musí být verze RubyGems nižší než 1.5.0.

Používáte-li Redmine ze SCM a nikoliv z oficiálního balíčku, nainstalujte Ruby on Rails v potřebné verzi. Potřebnou verzi zjistíte z přehledové tabulky, na kterou jsem vás odkázal výše. V době psaní článku to byla verze 2.3.11, kterou byste nainstalovali takto:

gem install rails -v=2.3.11

Nezapomeňte zohlednit problém s RubyGems popsaný výše a nainstalujte jeho správnou verzi, jinak při inicializaci databáze uvidíte jen chybové hlášky.

Tím je instalace potřebných komponent hotová.

Zprovoznění databáze

Redmine umí pracovat s MySQL, PostgreSQL a SQLite. Sami zvažte, jakou databázi chcete na server nasadit (pokud vůbec nějakou). Mám zkušenost, že výchozí instalace MySQL na Debianu zabírá díky výchozímu použití InnoDB přes 100 MB RAM. Používáte-li virtuální stroj s malou RAM, můžete si pomoci vypnutím enginu InnoDB, a sice úpravou /etc/mysql/my.cnf, kam přidejte řádku s direktivou skip-innodb. PostgreSQL je ve výchozím nastavení paměťově šetrnější. Oba DBMS je však možné dodatečně vyladit a přidělit jim tolik paměti, kolik chcete nebo kolik máte k dispozici. Pro optimalizaci nastavení PostgreSQL doporučuji seriál Optimalizace PostgreSQL. Postgresu jsem se věnoval po stránce instalace a základů jeho správy i já v tomto seriálu (první díldruhý díl).

Osobně používám Redmine na Postgresu, avšak vzhledem k tomu, že oficiální dokumentace upřednostňuje MySQL, a také vzhledem k tomu, že MySQL jsem se v tomto seriálu věnoval spíše méně, v tomto návodu upřednostním MySQL. Ujistěte se tedy, že máte nainstalovaný MySQL server:

aptitude install mysql-server

Pokud jej budete instalovat takto z balíčku, budete vyzváni k zadání rootovského hesla pro MySQL. I když je možné ponechat heslo prázdné, rozhodně jej důrazně doporučuji nastavit.

Pro lepší a rychlejší interakci s databází MySQL je třeba nainstalovat příslušný Ruby balíček pro práci s MySQL. Ještě před tím, než se do jeho instalace pustíte, nainstalujte hlavičkové soubory MySQL klienta (bez toho se kompilace příslušného gemu nezdaří):

aptitude install libmysqlclient-dev

Poté jako uživatel redmine proveďte instalaci gemu MySQL:

gem install mysql

Chcete-li použít jiný databázový server, nahlédněte do instalační příručky Redmine, jsou tam podrobné informace, jak databázi nastavit.

Vytvoření databáze a databázového uživatele

Spusťte MySQL konzoli a přihlaste se jako root:

mysql -u root -p

Následně vytvořte databázi s kódováním UTF-8 a českým porovnáváním:

CREATE DATABASE `redmine` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;

Vytvořte uživatele s příslušným (pokud možno silným) heslem:

CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'heslo';

A konečně, přidělte uživateli všechna práva pro tuto databázi:

GRANT ALL PRIVILEGES ON  `redmine`.* TO  'redmine'@'localhost';

Instalace Redmine

Stáhněte si aktuální verzi Redmine a přeneste ji na server (nebo použijte textový prohlížeč Lynx či wget přímo na serveru). Balíček následně rozbalte a vstupte do nově vytvořeného adresáře s aplikací:

tar xvf redmine-1.2.1.tar.gz
cd redmine-1.2.1

Nyní je třeba Redmine propojit s vámi používanou databází. Vytvořte tedy konfigurační soubor config/database.yml s následujícím obsahem (kde samozřejmě upravíte název databáze, uživatelské jméno a heslo):

production:
  adapter: mysql
  database: redmine
  host: localhost
  port: 3306
  username: redmine
  password: heslo

Můžete také použít šablonu config/database.yml.example a tu upravit.

Nyní vygenerujte „session store secret“:

rake generate_session_store

A konečně, inicializujte databázi a nechte vytvořit příslušné tabulky v rámci databázové migrace:

RAILS_ENV=production rake db:migrate

Objeví-li se chyby, zkontrolujte práva k databázi. Následující krok sice není povinný, ale je důrazně doporučený, jelikož databázi naplní výchozími daty, jako jsou role, oprávnění apod. (bez tohoto kroku budete mít opravdu „holý“ Redmine):

RAILS_ENV=production rake redmine:load_default_data

V tuto chvíli můžete konečně ověřit funkčnost instalace Redmine spuštěním webového serveru Webrick:

ruby script/server webrick -e production

Server by se měl spustit na portu 3000 a konzolový výpis by měl vypadat takto:

=> Booting WEBrick
=> Rails 2.3.11 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-10-15 16:40:50] INFO  WEBrick 1.3.1
[2011-10-15 16:40:50] INFO  ruby 1.8.7 (2011-06-30) [i686-linux]
[2011-10-15 16:40:50] INFO  WEBrick::HTTPServer#start: pid=32709 port=3000

Webový server běží na všech přidělených IP adresách, takže můžete Redmine vyzkoušet, jestli se nezobrazí jen „bílá obrazovka smrti“. Pokud Redmine běží, server shoďte a postupujte dál. Pokud ne, všimněte si chybové hlášky a pokuste se problém vyřešit. Zejména si znovu projděte výše uvedené instrukce, zda jste provedli opravdu vše, zda databáze funguje apod.

Pokud byste se chtěli přihlásit, vězte, že výchozí uživatel je „admin“ a heslo je (překvapivě) také „admin“. Jako správcům vám, doufám, nemusím zdůrazňovat, abyste přinejmenším heslo urychleně změnili.

Tímto bych tento díl ukončil. Příště se budete moci dozvědět, jak nainstalovat Thin a Nginx a připravit je pro produkční nasazení Redmine na externí IP adrese.