Ubuntu Linux 服务器

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

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

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

安装 apt-get 包

运行:

sudo apt-get install python3-pip 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数据库,因为服务器现在是单线程的。

在服务器上重置数据库

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。

故障排除

If you get strange behavior, such as random changes each time the page reloads, it might be caused by another oTree instance that didn’t shut down. Try stopping oTree and reload again.

与其他oTree用户共享服务器

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

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

  • 在home目录下创建一个virtualenv
  • 创建一个不同的Postgres数据库,如之前所述,并将此设置在DATABASE_URL环境变量中。

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

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