Ubuntu Linux 服务器¶
We typically recommend newcomers to oTree to deploy to Heroku (see instructions here).
然而,你可能更想将oTree运行在一个适当的Linux服务器上。原因可能包括:
- 你的实验室没有网络
- 你想要完全控制服务器的配置
- 你想要更好的性能(局域网服务器有更低的延迟)
创建一个virtualenv¶
使用virtualenv的最佳实践是:
python3 -m venv venv_otree
为在每次打开shell时激活此venv,将此放到你的 .bashrc
或 .profile
中:
source ~/venv_otree/bin/activate
一旦你的virtualenv被激活,你会看见 (venv_otree)
显示在命令行的开头。
数据库 (Postgres)¶
安装Postgres 与 psycopg2,创建一个新数据库并设置 DATABASE_URL
环境变量,例如设为 postgres://postgres@localhost/django_db
运行服务器¶
测试生产服务器¶
在你的项目文件夹,运行:
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用户共享服务器¶
你可以与其他oTree用户共享服务器;你只需确保代码与数据库保持隔离,这样就不会相互冲突。
在服务器上你应当为每一个使用oTree的人创建一个不同的Unix用户。然后每个人应当按照上面所描述的同样的步骤操作,但是在某些情况下应当使用不同的名字以避免冲突:
- 在home目录下创建一个virtualenv
- 创建一个不同的Postgres数据库,如之前所述,并将此设置在DATABASE_URL环境变量中。
一旦完成这些步骤,第二位用户就可以将代码推送至服务器,并运行 otree resetdb
。
如果不需要多人同时运行实验,那么每位用户可以轮流将服务器运行在80端口上,使用 otree prodserver 80
命令。然而,如果多人需要同时运行实验,那么你需要将服务器运行在不同的端口上,例如 8000
,8001
,等等。