2007年8月17日金曜日

CentOSへRailsのためにPostgreSQL

PostgreSQLのセットアップ

Ruby on RailsのDBとして、PostgreSQLを使いたいので、セットアップします。

参考ページ
Linuxで自宅サーバー
データベースサーバー構築(PostgreSQL)

■CentOSにインストールされているPostgreSQLを確認

yumコマンドで確認してみる
[root@mycentos ~]#Installed Packages
Name : postgresql
Arch : x86_64
Version: 7.4.17
Release: 1.RHEL4.1
Size : 7.8 M
Repo : installed
Summary: PostgreSQL client programs and libraries.


psqlコマンドでも確認してみる
[root@mycentos ~]# psql --version
psql (PostgreSQL) 7.4.17


7.4.17がインストールされているようです。
現在(2007年8月17日)時点で、8.2.4が最新なのでそれにバージョンアップを試みる。
最新ソースは日本PostgreSQLユーザ会から取得できます。


■とりあえず7.4.17のPostgreSQLをセットアップしてみる

PostgreSQLを起動します
[root@mycentos ~]# service postgresql start
Starting postgresql service: [ OK ]


自動起動も設定しておく
[root@mycentos ~]# chkconfig postgresql on


システム上のpostgresユーザのパスワードを設定
[root@mycentos ~]# passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.


PostgreSQL上のpostgresユーザのパスワードを設定
postgresユーザにスイッチする
[root@mycentos ~]# su - postgres
-bash-3.00$


psqlコマンドでPostgreSQLに接続
-bash-3.00$ psql template1
Welcome to psql 7.4.17, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit

template1=#


SQLでpostgresユーザのパスワードを設定する
;を忘れずにEnterするとパスワード設定完了
template1=# alter user postgres with password 'ひみつー';
ALTER USER


PostgreSQLから接続を切断
template1=# \q


PostgreSQL設定ファイルを編集して、リモートでpgAdminⅢを使って接続できるようにしてみる
まず、postgresql.confを編集し、TCP/IP経由でのデータベース接続許可する
viの使い方はviを使い倒そうで覚えました。
-bash-3.00$ vi /var/lib/pgsql/data/postgresql.conf


tcpip_socket = falseの部分をコメントアウトしてtrueにする
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------

# - Connection Settings -

#tcpip_socket = false
tcpip_socket = true


次、pg_hba.confを編集し、リモートでの接続を許可する
-bash-3.00$ vi /var/lib/pgsql/data/pg_hba.conf


ファイルの最後に以下を追加する。上から、ローカルからのアクセスは無条件に許可・内部からのアクセスは無条件に許可・上記以外からのアクセスはパスワード認証により許可
local all all trust
host all all 127.0.0.1 255.255.255.255 trust
host all all 0.0.0.0 0.0.0.0 password crypt


これでPostgreSQLの設定はひとまず完了
ルートユーザに戻り、PostgreSQLを再起動する
-bash-3.00$ exit
[root@mycentos ~]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]


リモートでpgAdminⅢを使って接続できたので、無事にセットアップできました。
pgAdminⅢの使い方は、GUIだし書かない。
あと、リモートでそのまま通信するのはセキュリティーとか不安なので、SSHを使ってポートフォアードなんてのを利用した。
PoderosaプラグインサイトのSSHのポートフォワーディングツールを使ってます。
あまりわかってないので詳しい話はできません。SSHポートフォワーディングによる接続を参考にしました。

■PostgreSQLをバージョンアップ

最新のPostgreSQLにバージョンアップします。7.4.17も少し動かしていたので、勉強もかねてバックアップをまず取ります。
コマンドは、pg_dumpall > ファイル名です
[root@mycentos ~]# su - postgres
-bash-3.00$ pg_dumpall > postgresBK


データが少ないから、すぐ終わった。できてるね。場所も覚えておこう。
-bash-3.00$ ls
backups data initdb.i18n postgresBK
-bash-3.00$ pwd
/var/lib/pgsql
-bash-3.00$ exit


PostgreSQLを止めます
[root@mycentos ~]# service postgresql stop
Stopping postgresql service: [ OK ]


古いPostgreSQLを削除します。yumでインストールしているので、yumでアンインストールする
[root@mycentos ~]# yum remove postgresql


途中で確認でとまるのでyを入力し、Enter。無事に削除できた。
Loading "fastestmirror" plugin
Setting up Remove Process
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package postgresql.x86_64 0:7.4.17-1.RHEL4.1 set to be erased
--> Running transaction check
Setting up repositories
update 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
     ・
     ・
     ・
Install 0 Package(s)
Update 0 Package(s)
Remove 2 Package(s)
Total download size: 0
Is this ok [y/N]: y
Downloading Packages:
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Removing : postgresql-server ######################### [1/2]
Removing : postgresql ######################### [2/2]

Removed: postgresql.x86_64 0:7.4.17-1.RHEL4.1
Dependency Removed: postgresql-server.x86_64 0:7.4.17-1.RHEL4.1
Complete!


postgresユーザを作成する。PostgreSQLのインストールはrootで行ってはいけないらしい
[root@mycentos postgresql-8.2.4]# groupadd postgres
[root@mycentos postgresql-8.2.4]# useradd -g postgres postgres
[root@mycentos postgresql-8.2.4]# passwd postgres
Changing password for user postgres.
New UNIX password:ひみつ
Retype new UNIX password:ひみつ
passwd: all authentication tokens updated successfully.


wgetコマンドで最新バージョンをダウンロード
[root@mycentos ~]# su - postgres
[postgres@mycentos ~]# wget ftp://ftp.jp.postgresql.org/source/v8.2.4/postgresql-8.2.4.tar.gz


ソースの解凍、そしてできたディレクトリに移動します。
[postgres@mycentos ~]# tar zxvf postgresql-8.2.4.tar.gz
     ・
     ・
     ・
[postgres@mycentos ~]# cd postgresql-8.2.4


PostgreSQLをビルドします。
[postgres@mycentos postgresql-8.2.4]# ./configure --prefix=/usr/local/pgsql
     ・
     ・
[postgres@mycentos postgresql-8.2.4]# make
     ・
     ・


なんとか成功。./configureのオプションはいろいろ調べてけど、シンプルにprefixだけにしました。良くわかってないけど。
あと、./configure時に、readlineライブラリが無いよ!て怒られて困ったけど(readlineパッケージはインストール済みやったもん。。)
調べたところreadline-develもいるらしい。なのでyum install readline-develをしました。

checkinstallを使ってRPM化します。checkinstallの導入
[postgres@mycentos postgresql-8.2.4]# checkinstall
     ・
     ・
Building file list...OKtar: /usr/src/redhat/SOURCES/postgresql-8.2.4.tgz: Cannot open: Permission denied
     ・
     ・


あらら、権限がない。んーじゃrootでやるしかないのか。
[postgres@mycentos postgresql-8.2.4]# exit
[root@mycentos ~]# cd /home/postgres/postgres-8.2.4
[root@mycentos postgresql-8.2.4]# checkinstall
     ・
     ・
     ・
**********************************************************************

Done. The new package has been saved to

/usr/src/redhat/RPMS/x86_64/postgresql-8.2.4-1.x86_64.rpm
You can install it in your system anytime using:

rpm -i postgresql-8.2.4-1.x86_64.rpm
**********************************************************************


とりあえずRPMの作成は成功。いけんのかね?
でまたしらべてみたら、インストールまではrootでもよぐねくねくね?BitArtsをみて続きをする。
rootのままパッケージをインストールする
[root@mycentos postgresql-8.2.4]# rpm -ivh /usr/src/redhat/RPMS/x86_64/postgresql-8.2.4-1.
x86_64.rpm
Preparing... ########################################### [100%]
1:postgresql ########################################### [100%]
[root@mycentos postgresql-8.2.4]#


あっさり。じゃー初期設定します。
データ保存用のディレクトリを作ります。
[root@mycentos postgresql-8.2.4]# cd /usr/local/pgsql
[root@mycentos pgsql]# mkdir data
[root@mycentos pgsql]# chown postgres:postgres data


postgresユーザになってから、データ初期化コマンド実行
[root@mycentos pgsql]# su - postgres
[postgres@mycentos ~]# /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.

fixing permissions on existing directory /usr/local/pgsql/data ... ok
     ・
     ・
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
or
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start


データ初期化は成功したようです。pg_hba.confの編集をわすれるなよ。っていわれてます。あとでね。
postgresユーザの.bash_profileファイルにPATHを設定します。
[postgres@mycentos ~]# vi .bash_profile


以下を追加しました。
export PATH=$PATH:/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
[postgres@mycentos ~]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
export PATH=$PATH:/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"

unset USERNAME


.bash_profileを反映します。再読込み。
[postgres@mycentos ~]# source ~postgres/.bash_profile


データベースができるかな。
[postgres@mycentos ~]# pg_ctl start
[postgres@mycentos ~]# createdb --encoding=UTF8
ERROR: database "postgres" already exists
STATEMENT: CREATE DATABASE postgres ENCODING 'UTF8';

createdb: database creation failed: ERROR: database "postgres" already exists

[postgres@mycentos ~]# psql
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

postgres=#
postgres=#\q
[postgres@mycentos ~]#


なんか既にありまっす。ていわれたので、そのまま接続。できた。

■じゃー8.2.4のPostgreSQLをセットアップしてみる

rootで、まず自動起動用スクリプトをコピーする
[root@mycentos ~]# cp /home/postgres/postgresql-8.2.4/contrib/start-scripts/linux /etc/rc.d/init.d/postgres


作成したファイルに実行権をつけ、自動起動も設定しておく。
[root@mycentos ~]# chmod 755 /etc/rc.d/init.d/postgres
[root@mycentos ~]# chkconfig postgres on


PostgreSQL上のpostgresユーザのパスワードを設定
postgresユーザにスイッチし、psqlコマンドでPostgreSQLに接続後、パスワード設定する(7.4.17とはちょっと違うからね)
[root@mycentos ~]# su - postgres
[postgres@mycentos ~]# psql template1
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

template1=# alter role postgres with password 'ひみつー';
template1=# \q


次は、postgresql.confを編集し、TCP/IP経由でのデータベース接続許可する(7.4.17とはちょっと違うからね)
viの使い方はviを使い倒そうで覚えました。
[postgres@mycentos ~]# vi /usr/local/pgsql/data/postgresql.conf


listen_addresses = '*'を追加する
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '*' # comma-separated list of addresses;
# defaults to 'localhost', '*' = all


次、pg_hba.confを編集し、リモートでの接続を許可する(7.4.17とはちょっと違うからね)
[postgres@mycentos ~]# vi /usr/local/pgsql/data/pg_hba.conf


ファイルの最後のとこを以下のように変更
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 password
# IPv6 local connections:
#host all all ::1/128 trust


ルートユーザに戻り、PostgreSQLを再起動する
[postgres@mycentos ~]# exit
[root@mycentos ~]# service postgres restart
service postgres restart
Restarting PostgreSQL: server stopped
ok


Autovacuumをお勧めします。とpgAdminⅢにいわれたので設定する
[root@mycentos ~]# su - postgres
[postgres@mycentos ~]# vi /usr/local/pgsql/data/postgresql.conf


stats_row_level = onにします
#---------------------------------------------------------------------------
# RUNTIME STATISTICS
#---------------------------------------------------------------------------

# - Query/Index Statistics Collector -

#stats_command_string = on
#update_process_title = on

#stats_start_collector = on # needed for block or row stats
# (change requires restart)
#stats_block_level = off
#stats_row_level = off
stats_row_level = on


autovacuum = onにします。
#---------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#---------------------------------------------------------------------------

#autovacuum = off # enable autovacuum subprocess?
autovacuum = on # 'on' requires stats_start_collector
# and stats_row_level to also be on


ルートユーザに戻り、PostgreSQLを再起動する。これでAutovacuumが有効になりました。
[postgres@mycentos ~]# exit
[root@mycentos ~]# service postgres restart
service postgres restart
Restarting PostgreSQL: server stopped
ok


■バックアップデータを戻してみる

バックアップファイルをコピーしきて、リストアコマンドをたたく
[root@mycentos ~]# cd /var/lib/pgsql/
[root@mycentos ~]# cp postgresBK /home/postgres/postgresBK
[root@mycentos ~]# su - postgres
[postgres@mycentos ~]# psql -f postgresBK postgres
You are now connected to database "template1".
psql:postgresBK:11: ERROR: cannot delete from a view
HINT: You need an unconditional ON DELETE DO INSTEAD rule.
psql:postgresBK:13: NOTICE: SYSID can no longer be specified
CREATE ROLE
psql:postgresBK:20: ERROR: cannot delete from a view
HINT: You need an unconditional ON DELETE DO INSTEAD rule.
CREATE DATABASE
You are now connected to database "template1".
SET
SET
     ・
     ・
SET
CREATE TABLE
psql:postgresBK:131: NOTICE: CREATE TABLE will create implicit sequence "members_id_seq" for serial column "members.id"
CREATE TABLE
CREATE INDEX
psql:postgresBK:169: NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "members_pkey" for table "members"
ALTER TABLE
setval
--------
2
(1 row)

SET
COMMENT


大事なデータじゃないし、なんかわからんけどOKとする。
無事リモートでも接続できた。SSHでもできた。

CentOSにRailsをインストール

Railsをインストール。

Ruby、RubyGemsのインストールが無事に終わったので、Railsをいれます。

■gemsコマンドでRailsをインストール

Ruby、RubyGems入ってる。
[root@mycentos ~]# gem -v
0.9.4
[root@mycentos ~]# ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [x86_64-linux]


gemsコマンド実行
[root@mycentos ~]# gem install rails


あらら、エラーがでた。
Bulk updating Gem source index for: http://gems.rubyforge.org
ERROR: While executing gem ... (Gem::GemNotFoundException)
Could not find rails (> 0) in any repository


ちょっと調べたら、引数をつけないと駄目なようでした。再度コマンド
[root@mycentos ~]# gem install rails --include-dependencies


うまくいった。
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rails-1.2.3
Successfully installed rake-0.7.3
Successfully installed activesupport-1.4.2
Successfully installed activerecord-1.15.3
Successfully installed actionpack-1.13.3
Successfully installed actionmailer-1.3.3
Successfully installed actionwebservice-1.2.3
Installing ri documentation for rake-0.7.3...
Installing ri documentation for activesupport-1.4.2...
Installing ri documentation for activerecord-1.15.3...
Installing ri documentation for actionpack-1.13.3...
Installing ri documentation for actionmailer-1.3.3...
Installing ri documentation for actionwebservice-1.2.3...
Installing RDoc documentation for rake-0.7.3...
Installing RDoc documentation for activesupport-1.4.2...
Installing RDoc documentation for activerecord-1.15.3...
Installing RDoc documentation for actionpack-1.13.3...
Installing RDoc documentation for actionmailer-1.3.3...
Installing RDoc documentation for actionwebservice-1.2.3...
[root@mycentos ~]#


ブラウザで確認できるか簡単なWEBrickを起動してみる。
[root@mycentos ~]# mkdir raily
[root@mycentos ~]# cd raily
[root@mycentos raily]# rails hello
create
create app/controllers
      ・
      ・
      ・
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
[root@mycentos raily]# cd hello
[root@mycentos hello]# ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-08-16 16:42:37] INFO WEBrick 1.3.1
[2007-08-16 16:42:37] INFO ruby 1.8.6 (2007-03-13) [x86_64-linux]
[2007-08-16 16:42:37] INFO WEBrick::HTTPServer#start: pid=16006 port=3000




ポート3000にアクセスし、無事に見れました。ポートを変えたいときは引数を付けて起動する例えば、--port=3210
Ctrl+CでWEBrickを停止する。

[2007-08-16 16:43:30] INFO going to shutdown ...
[2007-08-16 16:43:30] INFO WEBrick::HTTPServer#start done.
[root@mycentos hello]#