Ubuntu Linux 服务器

我们一般推荐入门者将oTree部署至Heroku (参见 这里 ),或者使用自己的个人电脑作为临时服务器(参见 这里)。

然而,你可能更想将oTree运行在一个适当的Linux服务器上。原因可能包括:

  • 你的实验室没有网络
  • 你想要完全控制服务器的配置
  • 你想要更好的性能(局域网服务器有更低的延迟)

安装 apt-get 包

运行:

sudo apt-get install python3-pip redis-server git

创建一个virtualenv

使用virtualenv的最佳实践是:

python3 -m venv venv_otree

为在每次打开shell时激活此venv,将此放到你的 .bashrc.profile 中:

source ~/venv_otree/bin/activate

一旦你的virtualenv被激活,你会看见 (venv_otree) 显示在命令行的开头。

数据库 (Postgres)

你可以使用Postgres作为你的生产环境数据库。安装Postgres 与 psycopg2,创建一个新数据库并设置 DATABASE_URL 环境变量,例如设为 postgres://postgres@localhost/django_db

然而,原则上oTree 3.0+在生产环境中应当可使用默认的SQLite数据库,因为服务器现在是单线程的。

安装 Redis

如果你如之前所建议的通过 apt-get 安装了 redis-server ,Redis会运行在端口6379上。你可以使用 redis-cli ping 进行测试,输出应当是 PONG.

然后将下面这一行加到与你设置 DATABASE_URL 同样的地方:

export REDIS_URL=redis://localhost:6379

在服务器上重置数据库

cd 到包含oTree项目的文件夹。安装依赖并重置数据库:

pip3 install -r requirements.txt
otree resetdb

运行服务器

测试生产服务器

在你的项目文件夹,运行:

otree prodserver 8000

然后在浏览器中导航至你的服务器的IP/主机名并以 :8000 结尾。

如果你没有使用反向代理如Nginx 或 Apache,你可能想直接将oTree运行在80端口上。这需要超级管理员权限,所以要使用sudo,但需添加一下额外的参数来保存环境变量如 PATH, DATABASE_URL, 等等:

sudo -E env "PATH=$PATH" otree prodserver 80

再打开你的浏览器;这一次,你无需在URL后添加 :80 ,因为这是HTTP默认的端口。

区别于 devserver, prodserver 不会在你的文件改变时自动重启。

设置其余的环境变量

将下面这些添加到与你设置 DATABASE_URL 相同的位置:

export OTREE_ADMIN_PASSWORD=my_password
#export OTREE_PRODUCTION=1 # uncomment this line to enable production mode
export OTREE_AUTH_LEVEL=DEMO

(可选) 进程控制系统

一旦服务器如上正常工作,使用如Supervisord 或 Circus这样的进程管理系统是一个好的实践。这会自动重启你的进程无论它是如何崩溃的,并在你登出时保持运行,等等。

Circus

安装 Circus,然后在你的项目文件夹创建一个 circus.ini ,内容如下:

[watcher:webapp]
cmd = otree
args = prodserver 80
use_sockets = True
copy_env = True

然后运行:

sudo -E env "PATH=$PATH" circusd circus.ini

如果它工作正常,你可以将其作为守护进程启动:

sudo -E env "PATH=$PATH" circusd --daemon circus.ini --log-output=circus-logs.txt

要停止circus,运行:

circusctl stop

(可选) Apache, Nginx, 等等

你不能使用Apache 或 Nginx作为你的首选web服务器,因为oTree必须使用ASGI服务器运行。然而,你仍可以使用Apache/Nginx作为反向代理,出于下面这些原因:

  • 你试图优化静态文件的速度(尽管oTree使用了Whitenoise,已经相当高效率了)
  • 你需要在同一台服务器上部署其他网站
  • 你需要类似SSL或代理缓存的特性

如果你设置了反向代理,确保其不仅代理了HTTP通信还代理了websocket。

故障排除

如果你遇到了奇怪的程序行为,如每次页面重载时会随机变化,这可能是另一个未被关闭的oTree实例导致的。试着停止oTree并再一次重载。并请确保没有在两个oTree实例间共享Postgres 或 Redis数据库。

与其他oTree用户共享服务器

你可以与其他oTree用户共享服务器;你只需确保代码与数据库保持隔离,这样就不会相互冲突。

在服务器上你应当为每一个使用oTree的人创建一个不同的Unix用户。然后每个人应当按照上面所描述的同样的步骤操作,但是在某些情况下应当使用不同的名字以避免冲突:

  • 在home目录下创建一个virtualenv
  • 创建一个不同的Postgres数据库,如之前所述,并将此设置在DATABASE_URL环境变量中。
  • 每位用户需要使用自己的Redis数据库。

一旦完成这些步骤,第二位用户就可以将代码推送至服务器,并运行 otree resetdb.

如果不需要多人同时运行实验,那么每位用户可以轮流将服务器运行在80端口上,使用 otree prodserver 80 命令。然而,如果多人需要同时运行实验,那么你需要将服务器运行在不同的端口上,例如 8000, 8001, 等等.