在AppFog上部署ownCloud 5

AppFog真不是个省心的PaaS,相比OpenShift麻烦多了,在OpenShift上部署ownCloud可以看玛格姐的博文。。。好吧,看在提供DNS A记录,然后又在新加坡有节点,我就忍了AppFog了。下面讲一下我部署的过程,有点tricky,不是很专业的样子……AppFog和PHP老鸟请放过我。下面我开始讲了,如果要喷,请轻喷。

下载并修改ownCloud 5.0

  1. 去ownCloud.org下载最新稳定版本,解压
  2. 删掉里面apps下的firstrunwizard,这个愚蠢的应用会一直提示要你下载客户端之类的,关闭按钮疑似失灵了。所以直接删掉,不然世界不会清净的!
  3. 用你最喜欢的编辑器(比如Kate)打开libs/setup.php这个文件,下面要修改它了。初次登录ownCloud的时候会调用setup设置数据库balabala的,但是AppFog奇葩地不能获取一个长期有效的MySQL地址、端口等信息,只能通过PHP函数获取,所以要稍微修改一下这个文件,让它自动填写正确的mysql数据库信息。

(关于修改ownCloud代码的操作,可以看我新一篇的博文《使用autoconfig.php快速部署ownCloud到AppFog》,不需要这么麻烦来改setup.php)找到并注释掉下面这几行,这样就可以在数据库信息设置处保持空白而不报错了。

			if(empty($options['dbuser'])) {
				$error[] = $l->t("%s enter the database username.", array($dbprettyname));
			}
			if(empty($options['dbname'])) {
				$error[] = $l->t("%s enter the database name.", array($dbprettyname));
			}
			if(substr_count($options['dbname'], '.') >= 1) {
				$error[] = $l->t("%s you may not use dots in the database name", array($dbprettyname));
			}
			if($dbtype != 'oci' && empty($options['dbhost'])) {
				$error[] = $l->t("%s set the database host.", array($dbprettyname));
			}

怎么注释?在这几行前面加上/*后面加上*/来注释……类似于C/C++的注释方法。然后找到下面这几行

//(这几行不要删!)
			//write the config file
			OC_Config::setValue('datadirectory', $datadir);
			OC_Config::setValue('dbtype', $dbtype);
			OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
			if($dbtype == 'mysql') {

把紧跟着的下面这几行删掉。

//这些都删掉
				$dbuser = $options['dbuser'];
				$dbpass = $options['dbpass'];
				$dbname = $options['dbname'];
				$dbhost = $options['dbhost'];

然后添加下面这几行。

				$services_json = json_decode(getenv("VCAP_SERVICES"),true);
				$mysql_config = $services_json["mysql-5.1"][0]["credentials"];
				$dbuser = $mysql_config["username"];
				$dbpass = $mysql_config["password"];
				$dbname = $mysql_config["name"];
				$dbhost = $mysql_config["host"].':'.$mysql_config["port"];

这样setup就会自动把AppFog的MySQL这个service正确的信息复制到config.php这个文件中了。

修改工作还没完呢!!!config/config.sample.php复制一份为config.php(当然还是在config文件夹下),编辑config.php文件。把”apps_paths” => array(下面几行修改成如下所示。

	array(
		'path'=> OC::$SERVERROOT."/apps",
		'url' => '/apps',
		'writable' => true,
	),

这样可以避免去找/var/www/owncloud/apps这个根本不存在的、而且没有写入权限的文件夹。至此,修改完成了(如有纰漏,还请指正)。下面开始部署!

部署到AppFog

没有appfog账号跑过来弹棉花啊?自己去注册一个,然后安装好CLI工具!打开终端,cd进入owncloud文件夹,输入

af push

按照提示一步步下去,记住要Create a service bound to this app!service类型选择mysql!如果忘记了,那就用af创建一个mysql service然后bind到你的这个app上!Infrastructure建议选择Asia Pacific(Singapore),理由=速度快+无墙。Memeory那里建议分配512M,Instance一个就好了。中间问你要不要保存manifest记得回答Y!这样以后在这个目录下执行af update就不用带app名了~~

等吧,耐心的等待,时间视网络情况而定。有时候可能会有500内部服务器错误,那就等几分钟后用

af update

重新部署一下。这里push和update的区别在于push是deploy到一个新建的app中,update是更新一个已经创建了的app!

一定要看到Starting Applicatioin….[OK]才表示成功,如果只出现push [OK]而没有staging、starting的过程,那么可以用

af restart $YOURAPPNAME

手动重启app,如果连push…[OK]这个提示都没有就需要重新af update上传。

完毕后

好了?打开应用地址,填写管理账户的用户名和密码,下面的数据库默认选择的是MySQL,不用填写mysql的任何东西(填了也是白填,都会被修改过的setup.php忽视的……),点击确定。不出意外的话就会进入到ownCloud的「文件」界面了。

ownCloud 5.0设计得很棒了!速度很快,支持drag & drop,大量的AJAX运用实在是让人爽翻天了!

ownCloud 5.0自带的应用主要有「文件」、「音乐」、「联系人」、「日历」、「相片」等。至于用来取代Google Reader的「News」目前在6.0 alpha中,感兴趣的可以去owncloud的git仓库抓trunk然后按照本文的修改办法修改之后部署。

P.S. ownCloud发展其实出乎我的意料,我一直以为这个又会是一个半吊子产品,而且最后会胎死腹中。结果这家伙居然顽强地活下来了,而且活得还不错,听说去年年底还获得了250万美金的投资!现在是无比期待6.0正式版的到来了!

3 responses to “在AppFog上部署ownCloud 5”

  1. 一树小草 avatar

    想问一个问题,Appfog不是没有持久化存储么?要是 重启 / 升级 Owncloud的话那些存在里面的数据不会丢失么?

    1. librehat avatar

      只要app重启就会丢失数据。所以如果要升级/重启ownCloud的话,必须提前把数据(主要备份data文件夹)download下来,然后push的时候把数据重新push回去,MySQL数据库的数据倒是不会丢失。升级的话config.php里面应该还要设置installed为true!
      AppFog上给出的永久存储的「临时解决办法」是挂载Amazon S3,AppFog自己的持久化存储已经在开发中了,不知道什么时候会出来就是。

  2. […] 上一篇文章讲了一个非常笨的办法(去修改setup.php),本文讲一个「正常」一点的办法部署ownCloud到AppFog,下载ownCloud这一步就不要我再啰嗦了吧? […]