Ploneインストール [Plone3.3]

インストール

poppler-utilsのインストール

poppler-utils を事前にシステムにインストールしておくことで、PDF の本文を検索対象に含めることができる。yum 等でインストールする。

yum install poppler-utils

Unified Installerでのインストール

http://plone.org/ よりダウンロードしインストールする。ここではバージョン 3.3.2 を Standalone で利用する。

# tar zxvf Plone-3.3.2-UnifiedInstaller.tgz
# cd Plone-3.3.2-UnifiedInstaller
# ./install.sh standalone

デフォルトでは /usr/local/Plone にインストールされ、/usr/local/Plone/zinstance に Plone のインスタンスが作成される。後でインスタンスのみ追加できるよう、上で生成されたファイルは残しておく。インスタンスを追加する場合は、次のようにする。

# ./install.sh --instance=zinstance2 standalone

Pythonのデフォルトエンコーディングの設定

Zope は文字コードを UTF-8 で扱うため、Python のデフォルトエンコーディングを UTF-8 とする。/usr/local/Plone/Python-2.4/lib/python2.4/site-packages/sitecustomize.py ファイルを作成し以下のように記述すればよい。

import sys
sys.setdefaultencoding("utf-8")

python-ldapのインストール

Python で LDAP を利用するには python-ldap2.3.9 モジュールをインストールする必要がある。インストールは解凍後、開発用ソースディレクトリに python-ldap という名前で格納する。ダウンロードは http://pypi.python.org/pypi/python-ldap/2.3.9 より行える。

# tar zxvf python-ldap-2.3.9.tar.gz
# mv python-ldap-2.3.9 /usr/local/Plone/zinstance/src/python-ldap

次にインスタンス内の buildout.cfg を設定する。

  eggs =
      Plone
       :
+     python-ldap

  develop =
       :
+     src/python-ldap

  [versions]
     :
+ python-ldap = 2.3.9

最後に設定を反映する。

# bin/buildout

インストールには openldap-devel と openssl-devel を組み込んでおく必要がある。インストールされていない場合は先に yum 等でインストールすればよい。

# yum install openldap-devel openssl-devel

起動確認

Plone が起動することを確認する。

# cd /usr/local/Plone/instance
# bin/plonectl start

http://ホスト名:8080/ にアクセスして Plone のページが表示されればインストール成功である。Plone の停止は次のコマンドを実行する。

# bin/plonectl stop

全体の管理者の設定

インストールすると admin ユーザが生成される。パスワード等は /usr/local/Plone/instance/adminPassword.txt に書かれているのでこれを変更する。ZMI(http://ホスト名:8080/manage)にアクセスしこのユーザでログインし、/acl_users/users で新しいユーザを追加する。

User ID: admtest
Login name: admtest
Password: ****
Confirm password: ****

次に /acl_users/roles で追加したユーザに Manager ロールを与える。最後にデフォルトで作成されていた admin ユーザを /acl_users/users から削除する。

Ploneサイトの追加

ZMI(http://ホスト名:8080/manage)にアクセスし全体の管理者でログインする。右上のドロップダウンリストより Plone Site を追加する。

Id : web1
Title : WEB1

 

PloneHotfix20110720の適用

セキュリティパッチをあてておく。http://pypi.python.org/pypi/Products.PloneHotfix20110720/1.1 よりダウンロードする。

# unzip Products.PloneHotfix20110720-1.1.zip
# mv Products.PloneHotfix20110720-1.1 /usr/local/Plone/zinstance/src/Products.PloneHotfix20110720

次にインスタンス内の buildout.cfg を設定する。

  eggs =
      Plone
       :
+     Products.PloneHotfix20110720

  develop =
       :
+     src/Products.PloneHotfix20110720

最後に設定を反映する。

# bin/buildout
# bin/plonectl stop; bin/plonectl start;

ZopeJapanesePakLiteの適用

日本語のファイル名のファイルをダウンロードする際に、ASCIIに変換されたIDとなってしまう点を、元のファイル名のままダウンロードできるようにするパッチをあてておく。

ZopeJapanesePakLite-0.1.1.tar.gz icon_downlord.gif

インストール

ZopeJapanesePakLite-0.1.1-20071120.tar.gz を開発用ソースディレクトリに格納する。

mv ZopeJapanesePakLite-0.1.1.tar.gz /usr/local/Plone/instance/src/

次にインスタンス内の buildout.cfg を設定する。

  [productdistros]
   :
  urls =
        :
+     src/ZopeJapanesePakLite-0.1.1.tar.gz

最後に設定を反映する。

# bin/buildout
# bin/plonectl stop; bin/plonectl start

 

設定ファイルの編集

設定ファイルを変更後は、設定反映後再起動すれば利用できる。

# bin/buildout
# bin/plonectl stop; bin/plonectl start

HTTP起動ポートの設定

Zope インスタンス内の buildout.cfg で設定する。

http-address = 9081

Z-Serverのスレッド数を変更する

インスタンス内の buildout.cfg に以下の項目を指定する。

  [instance]
      :

+ zope-conf-additional=
      zserver-threads 7

 

その他

$PLONE_INSTANCE : /usr/local/Plone/zinstance (Plone のインスタンス)

自動起動

起動スクリプトを /etc/init.d/plone として次のように作成し、パーミッションを適宜設定する。

#!/bin/sh
# Startup script for Plone
#
# chkconfig: - 80 20
# description: Zope, a web application server
#
# config: $instance/buildout.cfg
# config: $instance/parts/instance/etc/zope.conf

# Source function library.
. /etc/init.d/functions

RETVAL=0
plonectl="/usr/local/Plone/zinstance/bin/plonectl"
prog="plone"

start() {
        output=`$plonectl start`
        # the return status of plonectl is not reliable, we need to parse
        # its output via substring match
        if echo $output | grep -q "started"; then
            # success
            action $"Starting $prog:  " /bin/true
            touch /var/lock/subsys/$prog
            RETVAL=0
        else
            # failed
            action $"Starting $prog:  " /bin/false
            RETVAL=1
        fi
        return $RETVAL
}

stop() {
        output=`$plonectl stop`
        # the return status of plonectl is not reliable, we need to parse
        # its output via substring match
        if echo $output | grep -q "stopped"; then
            # success
            action $"Stopping $prog:  " /bin/true
            rm -f /var/lock/subsys/$prog
            RETVAL=0
        else
            # failed
            action $"Stopping $prog:  " /bin/false
            RETVAL=1
        fi
        return $RETVAL
}

restart() {
	stop
	start
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
	$plonectl status
	;;
  restart)
	restart
	;;
  condrestart)
	[ -e /var/lock/subsys/$prog ] && restart
	;;
  *)
	echo $"Usage: $0 {start|stop|status|restart|condrestart}"
	RETVAL=1
esac

exit $REVAL

作成後は

/sbin/chkconfig --add plone

でzopeを起動スクリプトとして追加し、

/usr/sbin/ntsysv

で起動時に自動起動されるようにする。以降の起動・停止等は

/sbin/service plone [start | stop | restart | status | condrestart]

で行える。

ログのローテーション

Zope のログは $PLONE_INSTANCE/var/log/ 内に、instance-Z2.log(アクセスログ)、instance.log(エラー情報等)が出力されるがローテーションはされない。そこで logrotate を用いてログのローテーションを行う。/etc/logrotate.d/plone に以下を記述すればよい。

$PLONE_INSTANCE/var/log/instance-Z2.log $PLONE_INSTANCE/var/log/instance.log {
    weekly                 <- 毎週ログローテーション
    rotate 20              <- ローテーション回数
    create 600 plone plone <- パーミッション、ユーザ名、グループ名
    missingok              <- ログファイルが存在しなくてもエラーを出さない
    notifempty             <- ログファイルが空ならローテーションしない
    compress               <- ローテーションされたログをgzipで圧縮
    sharedscripts          <- 複数指定したログファイルに対してpostrotateを実行
    postrotate             <- ログローテーション後に実行するコマンド
        /bin/kill -USR2 $(cat $PLONE_INSTANCE/var/instance.pid)
    endscript
}

ZODB の自動 Pack

ZODB の Pack は Control_Panel/Database/main より行うことができるが、手動で行う必要があるため、これを cron で自動実行するように設定する。これは、wget 等で管理者パスワードを BASIC 認証に渡すこともできるが、管理者パスワードを記述するのにはセキュリティ上好ましくない。そのため、以下のように設定する。

スクリプトの作成

Zope のルートの zope_management_scripts フォルダ内(独自に作成)に、zope_pack という名前のスクリプトを作成する。days パラメータにより、何日前までの undo データを残すかを設定すればよい。

try:
    context.aq_parent.Control_Panel.Database.manage_pack(days=7)
    return 'OK'
except:
    return 'NG'

ZODB の Pack には Manager 権限が必要なので、Proxy タブより Proxy Roles として Manager を選択する。

Proxy Roles : Manager

これにより、このスクリプトにアクセスするユーザが Manager でなくても、スクリプトに書かれた Pack を実行できる。

セキュリティの設定

この状態では、ログインしなくても実行できるため、スクリプトの Security タブよりセキュリティ設定を次のように設定し、Manager 権限でのみ実行できるようにする。

Manager : Change Python Scripts のみOFF, 他全てON
その他Acquire?を含め : 全てOFF

Change Python Scripts を OFF にすることで、Manager でもこのスクリプトの変更を禁止する。変更が必要な場合は、改めてこのパーミッションを ON とすればよい。これは、Proxy Roles の設定で Manager を設定しているため、スクリプトの改ざんにより悪用されることを防ぐためである。

ユーザの作成

Zope のルートの acl_users/users で Anonymous として update 用のユーザを設定する。Anonymous とするには、このユーザに acl_users/roles でどのロールも与えなければよい。このユーザを用いることで、たとえこのパスワードが漏れたとしても Zope の設定変更等は行えない。

ユーザ名 : zope_conf_user

ローカルロールの設定

さらに、スクリプトの Security タブより、上記ユーザに local role として、Manager 権限を与える。

User  : zope_conf_user
Roles : Manager

このようにすることで、このユーザは、Pack の実行を除き何もできない。

自動実行

最後に root の cron で wget 等を動かし、スクリプトにアクセスして Pack を実行させればよい。

15 2 * * 0 wget --no-proxy --http-user="zope_conf_user" --http-passwd="XXX"
   --delete-after http://localhost:9380/zope_management_scripts/zope_pack