首先给必须给Webfaction 打个广告。
Webfaction一直是我非常乐于使用的一个网络服务租用提供商。在5、6年前大多数VPS服务的价格还比较高的时候,他们就以非常出色的性价比和高水平的服务吸引了我。即使在今天遍地都是云服务商的情形下,Webfaction提供的产品的竞争力仍然是超群的。我们现在的这个nodebb的论坛也是部署在他们的服务器上的,另外我们也有内部测试Odoo服务器部署在它上面。对于开发者学习和小公司的内部使用都非常合适。
喜欢他们的理由有几点:
价格超值,却很低调
他们的最基本的套餐是:$10/month, 100GB SSD storage, 1GB RAM, 1TB bandwidth
以这样的价格获得这样的配置看起来已经很不错了,但是相信仍然有不少云服务商能提供同样的offer。但是,Webfaction的低调在于这个1GRAM是指由你所启动的进程所占用的内存,对于诸如系统进程,公用的服务比如Apache, Nginx, 甚至数据库比如Mysql, PostgreSql等等占用的内存是不算在这1GRAM里的。我们公司内部部署的Odoo测试服务器尽然在他的服务器上只使用了不到200M的内存,因为巨消耗内存的数据库服务器消耗的内存算他的 ;-)。而如果你只是用它跑个PHP网页,那就是消耗 0内存
服务超赞
他们对ticket的反应重来没有超过1小时的,通常是1刻钟左右就有人在处理了。而且大多服务于你的人都是网络Geek,他们也很愿意跟你交流,跟他们还真能学几招。
当然Webfaction 对于某些没有root,sudo 就完全不能生存的人来说是不适合的。因为Webfaction真的没有root权限,但是我们真的可以在没有root权限下做所有的事情,它也可以让你学会如何安全的部署软件。
本文就来介绍一下Webfaction上使用其共享的数据库服务来部署Odoo需要注意的一些问题。
使用Webfaction共享数据库服务来运行Odoo
需要注意的是,用这种方式来直接运行Odoo会出错运行不起来。(假设你的数据库的用户是erp_db_user, 你就会看到下面的出错信息:)
OperationalError: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "erp_db_user", database "postgres", SSL on
FATAL: no pg_hba.conf entry for host "127.0.0.1", user "erp_db_user", database "postgres", SSL off
原因是Odoo在系统中有两个地方需要访问系统数据库:postgres, 而在Webfaction中创建的数据库用户只能访问其所拥有的(own)的数据库。
一个地方需要访问到postgres系统数据库的地方是, 当我们初次访问Odoo的时候,Odoo会检查是否已经有数据库了,需不需要创建一个新的,如果有多个数据库,需不需要将几个数据库显示出来。如果你安装Odoo只启用一个数据库,那就用下面小修改一下就可以了:
diff --git a/odoo/service/db.py b/odoo/service/db.py
index d6ff8d1..f0727f0 100644
--- a/odoo/service/db.py
+++ b/odoo/service/db.py
@@ -75,6 +75,8 @@ def _initialize_db(id, db_name, demo, lang, user_password, login='admin', countr
_logger.exception('CREATE DATABASE failed:')
def _create_empty_database(name):
+ # hack to run odoo with shared pgsql data service on webfaction
+ raise DatabaseExists("database %r already exists!" % (name,))
db = odoo.sql_db.db_connect('postgres')
with closing(db.cursor()) as cr:
chosen_template = odoo.tools.config['db_template']
@@ -317,6 +319,8 @@ def exp_db_exist(db_name):
return bool(odoo.sql_db.db_connect(db_name))
def list_dbs(force=False):
+ # hack to run odoo with shared pgsql data service on webfaction
+ return ['Your_DB_NAME']
if not odoo.tools.config['list_db'] and not force:
raise odoo.exceptions.AccessDenied()
chosen_template = odoo.tools.config['db_template']
另一个地方需要访问到系统数据库postgres的地方是Odoo的bus模块, 这个模块是利用PostgreSQL的消息通知功能来实现Odoo内的实时消息通知的功能。如果我们并不常用这个功能,就可以做下面的修改:
index 4665925..7efb723 100644
--- a/addons/bus/models/bus.py
+++ b/addons/bus/models/bus.py
@@ -182,7 +182,9 @@ class ImDispatch(object):
# disabled in prefork mode
return
else:
- # threaded mode
+ # hack to run odoo with shared pgsql data service on webfaction
+ return
self.Event = threading.Event
t = threading.Thread(name="%s.Bus" % __name__, target=self.run)
t.daemon = True
经过这两处的小修改后,Odoo就可以使用Webfaction提供的共享数据库了。当然代价是:你不能使用Odoo的/database/manager 在前端的页面上对数据库进行管理(创建/删除/备份/恢复等,当然这些事情完全可以在服务器端完成), 你的消息通知不是实时的,刷新页面才能看得到。
当然如果不想将就,完全可以在Webfaction通过其控制面板建立自己私有的PostgreSQL数据库即可。