搭建CGWire

前言

国庆在家容易想些有的没的,
想着万一以后自己开了一个小型视效工作室,
该用什么来进行跟踪管理项目进度。

首先是想到的当然是诸如Shotgun, FTrack, CGTeamWork等这些项目管理平台。
但是价格上则让人却步,比如Shotgun收费标准是每人每月30刀。

这对于小型低成本工作室,也算是一笔不小的开销。
抱着能省则省的态度,在网上找到了开源免费的项目管理平台CGWire

CGWire介绍

文字不如视频直观,下面是官方的视频介绍,
可以说是麻雀虽小,该有的功能都有。

https://youtu.be/EH3RbmHykrE

CGWire搭建

接下来就是无趣的代码部分了。
我这里使用的是Ubuntu 16.04版本进行的测试。
来源:https://zou.cg-wire.com/#deploying-kitsu

安装软件依赖

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get install postgresql postgresql-client postgresql-server-dev-all
sudo apt-get install redis-server
sudo apt-get install python3 python3-pip
sudo apt-get install git
sudo apt-get install nginx
sudo apt-get install ffmpeg

获取资源

创建一个zou用户

1
2
3
sudo useradd --home /opt/zou zou
mkdir /opt/zou
chown zou: /opt/zou

安装zou和其依赖

1
2
3
4
5
6
sudo pip3 install virtualenv
cd /opt/zou
sudo virtualenv zouenv
. zouenv/bin/activate
sudo zouenv/bin/pip3 install zou
sudo chown -R zou:www-data .

创建存储预览的文件夹

1
2
sudo mkdir /opt/zou/previews
sudo chown -R zou:www-data /opt/zou

创建临时存储目录

1
2
sudo mkdir /opt/zou/tmp
sudo chown -R zou:www-data /opt/zou/tmp

安装Postgres数据库

在postgres中创建Zou数据库

1
2
sudo su -l postgres
psql -c 'create database zoudb;' -U postgres

为postgres用户设置密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 输入命令
psql

# 这里会进入postgres的交互模式
>>> psql (9.4.12)
>>> Type "help" for help.

# 输入下面命令进行密码创建
postgres=# \password postgres
Enter new password:
Enter it again:

# 设置完成密码,退出交互模式
\q

如果不想使用交互式创建密码,可以用下面的方式。
如果已经创建了密码,跳过此步骤。

1
psql -U postgres -d postgres -c "alter user postgres with password 'mysecretpassword';"

最后,创建数据库表。
这里需注意已经退出了psql交互模式,并在zou虚拟环境下。

1
2
# Run it in your bash console.
DB_PASSWORD=yourdbpassword zou init-db

准备键值存储

1
vim /etc/sysctl.conf

在这个文件末尾添加一行:

1
vm.overcommit_memory = 1

配置Gunicorn

需要通过Gunicorn运行该应用程序,
Gunicorn是将zou作为守护程序运行的WSGI服务器。

创建配置文件夹

1
sudo mkdir /etc/zou

创建Gunicorn配置文件
路径: /etc/zou/gunicorn.conf

1
2
3
4
accesslog = "/opt/zou/logs/gunicorn_access.log"
errorlog = "/opt/zou/logs/gunicorn_error.log"
workers = 3
worker_class = "gevent"

创建日志文件夹

1
2
sudo mkdir /opt/zou/logs
sudo chown zou: /opt/zou/logs

创建进程守护的配置文件
路径: /etc/systemd/system/zou.service

这里需要修改DB_PASSWORD和SECRET_KEY。
数据库的密码是之前设置的,而SECRET_KEY可以用pwgen来随机生成。

1
2
apt-get install pwgen
pwgen 16

生成后可以复制其中一个给到SECRET_KEY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Gunicorn instance to serve the Zou API
After=network.target

[Service]
User=zou
Group=www-data
WorkingDirectory=/opt/zou
# Append DB_USERNAME=username DB_HOST=server when default values aren't used
# ffmpeg must be in PATH
Environment="DB_PASSWORD=yourdbpassword"
Environment="SECRET_KEY=yourrandomsecretkey"
Environment="PATH=/opt/zou/zouenv/bin:/usr/bin"
Environment="PREVIEW_FOLDER=/opt/zou/previews"
ExecStart=/opt/zou/zouenv/bin/gunicorn -c /etc/zou/gunicorn.conf -b 127.0.0.1:5000 zou.app:app

[Install]
WantedBy=multi-user.target

创建事件流API服务器配置
路径: /etc/zou/gunicorn-events.conf

1
2
3
4
accesslog = "/opt/zou/logs/gunicorn_events_access.log"
errorlog = "/opt/zou/logs/gunicorn_events_error.log"
workers = 1
worker_class = "geventwebsocket.gunicorn.workers.GeventWebSocketWorker"

通过Systemd来守护事件流API服务进程
路径: /etc/systemd/system/zou-events.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Gunicorn instance to serve the Zou Events API
After=network.target

[Service]
User=zou
Group=www-data
WorkingDirectory=/opt/zou
# Append DB_USERNAME=username DB_HOST=server when default values aren't used
Environment="PATH=/opt/zou/zouenv/bin"
ExecStart=/opt/zou/zouenv/bin/gunicorn -c /etc/zou/gunicorn-events.conf -b 127.0.0.1:5001 zou.event_stream:app

[Install]
WantedBy=multi-user.target

配置Nginx

配置文件路径: /etc/nginx/sites-available/zou

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name server_domain_or_IP;

location /api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:5000/;
client_max_body_size 500M;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
send_timeout 600s;
}

location /socket.io {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://localhost:5001;
}
}

启用nginx

1
2
3
4
5
6
7
8
9
10
# 删除默认配置
sudo rm /etc/nginx/sites-enabled/default

# 创建文件链接
sudo ln -s /etc/nginx/sites-available/zou /etc/nginx/sites-enabled

# 重启nginx
sudo service zou start
sudo service zou-events start
sudo service nginx restart

更新所有包

更新zou软件包

1
2
3
cd /opt/zou
. zouenv/bin/activate
sudo zouenv/bin/pip3 install --upgrade zou

更新数据路架构

1
2
# 这里输入数据库的密码
DB_PASSWORD=yourdbpassword zou upgrade-db

重启zou服务

1
2
3
sudo chown -R zou:www-data .
sudo service zou restart
sudo service zou-events restart

部署Kitsu

1
2
3
4
5
cd /opt/
sudo git clone -b build https://github.com/cgwire/kitsu
cd kitsu
sudo git checkout build
sudo chown -R zou:www-data /opt/kitsu

部署完成后需要更新nginx的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name server_domain_or_IP;

location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass http://localhost:5000/;
}

location /socket.io {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://localhost:5001;
}

location / {
autoindex on;
root /opt/kitsu/dist;
try_files $uri $uri/ /index.html;

}
}

重启nginx服务

1
sudo service nginx restart

到这一步就可以访问自己的ip或者域名来使用cgwire了。
当然,在此之前需要一个管理员账户来登陆cgwire。

创建cgwire管理员账户

1
2
3
4
5
6
7
8
9
# 首先进入zou环境
cd /opt/zou
. zouenv/bin/activate

# 创建管理员账户 create_admin后的参数 为自己的登陆邮箱
DB_PASSWORD=yourdbpassword zou create_admin adminemail@yourstudio.com

# 初始化数据
DB_PASSWORD=yourdbpassword zou init-data

账户创建完成后,默认密码为default,第一次登陆后会强制让你修改密码。
最后请尽情的enjoy it。

(完)