Boinc 后台服务搭建
源码编译安装部署
用户和组
BOINC server programs 运行需要两个不同的用户账号:
- Web账号: 即Apache http服务需要的账号, 调度程序、文件上传以及Web程序使用该账号运行 (不同Linux发行版该账号可能不同,如 Fedora 叫:’apache’; Debian 叫 ‘www-data’).
- 项目账号: 其它程序的运行,主要是任务管理程序, 该账号不建议用root, 可以用一个已经存在的用户账号或者新建一个账号,如 boincadm。
创建用户
1
2
3
useradd -m {username}
mkdir -pv /home/{username}
chown {username}:{username} /home/{username}
默认情况下, apache Web 服务器用户创建的目录不是所有人都可写的。这会导致问题:例如,当文件上传处理程序在上传层次结构中创建一个目录时,在 Fedora 上它归 (apache, apache) 所有,文件删除程序(以 boincadm 身份运行)将无法删除那里的文件。 因此需要将 web账号添加到 boincadm 组中。
1
$ usermod -a -G boincadm apache
给boincadm账号添加sudo权限
1
sudo visudo
In this file you have to add another line after the line for notroot. You can use this:
1
{username} ALL=(ALL) ALL
MySQL
1
2
3
mysql -u root -p
CREATE USER 'boincadm'@'localhost' IDENTIFIED BY 'foobar';
GRANT ALL ON *.* TO 'boincadm'@'localhost';
安装及配置Apache 和 PHP
1
apt-get install apache2 php libapache2-mod-php
编译 boinc-server
所谓的server 其实是 一个cgi调度程序及一堆工具。
1
2
3
4
5
6
7
cd ~
git clone https://github.com/BOINC/boinc.git boinc-src
cd ~/boinc-src
./_autosetup
./configure --disable-client --disable-manager --prefix=/usr/local/boinc/
make
make install
编译安装完成后的目录结构如下:
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
27
28
29
30
31
32
33
34
35
36
37
38
$ tree -d /usr/local/boinc/
/usr/local/boinc/
├── include
│ └── boinc
├── lib
│ └── pkgconfig
├── libexec
│ ├── boinc-apps-examples
│ └── boinc-server-maker
│ ├── lib
│ ├── sched
│ ├── tools
│ └── vda
├── share
│ └── boinc-server-maker
│ ├── db
│ └── html
│ ├── inc
│ │ ├── password_compat
│ │ ├── random_compat
│ │ └── ReCaptcha
│ │ └── RequestMethod
│ ├── languages
│ │ └── translations
│ ├── ops
│ │ ├── ffmail
│ │ ├── mass_email
│ │ └── remind_email
│ └── user
│ └── img
│ └── flags
└── usr
└── share
└── boinc-server-maker
└── py
└── Boinc
其中,核心调度程序cgi 及tools 均在 /usr/local/boinc/libexec/boinc-server-maker/ 目录下:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
$ tree /usr/local/boinc/libexec/boinc-server-maker/
/usr/local/boinc/libexec/boinc-server-maker/
├── lib
│ ├── crypt_prog
│ └── parse_test
├── sched
│ ├── adjust_user_priority
│ ├── antique_file_deleter
│ ├── assimilator.py
│ ├── census
│ ├── cgi
│ ├── cleanlogs.sh
│ ├── credit_test
│ ├── db_dump
│ ├── db_dump_spec.xml
│ ├── db_purge
│ ├── delete_file
│ ├── feeder
│ ├── file_deleter
│ ├── file_upload_handler
│ ├── get_file
│ ├── makelog.sh
│ ├── make_work
│ ├── message_handler
│ ├── put_file
│ ├── pymw_assimilator.py
│ ├── run_in_ops
│ ├── sample_assimilator
│ ├── sample_bitwise_validator
│ ├── sample_dummy_assimilator
│ ├── sample_substr_validator
│ ├── sample_trivial_validator
│ ├── sample_work_generator
│ ├── sched_driver
│ ├── script_assimilator
│ ├── script_validator
│ ├── show_shmem
│ ├── single_job_assimilator
│ ├── size_regulator
│ ├── start
│ ├── status
│ ├── stop
│ ├── transitioner
│ ├── transitioner_catchup.php
│ ├── trickle_credit
│ ├── trickle_deadline
│ ├── trickle_echo
│ ├── update_stats
│ └── wu_check
├── tools
│ ├── appmgr
│ ├── boinc_submit
│ ├── cancel_jobs
│ ├── create_work
│ ├── dbcheck_files_exist
│ ├── dir_hier_move
│ ├── dir_hier_path
│ ├── grep_logs
│ ├── gui_urls.xml
│ ├── make_project
│ ├── manage_privileges
│ ├── parse_config
│ ├── project.xml
│ ├── query_job
│ ├── remote_submit_test
│ ├── run_in_ops
│ ├── sample_assimilate.py
│ ├── sign_executable
│ ├── stage_file
│ ├── stage_file_native
│ ├── submit_batch
│ ├── submit_buda
│ ├── submit_job
│ ├── update_versions
│ ├── upgrade
│ ├── vote_monitor
│ └── xadd
└── vda
├── ssim
├── vda
└── vdad
创建项目
After installation the BOINC software, you should run the make_project script to create the project.
docker-compose部署
docker 部署相比较源码安装方式会简单很多。
1
2
3
4
git clone https://github.com/marius311/boinc-server-docker.git
cd boinc-server-docker
docker-compose pull
docker-compose up -d
执行 docker-compose up 前, 确定 .env 中 的URL_BASE 设置正常
1
2
3
4
5
# the URL the server thinks its at
URL_BASE=http://127.0.0.1
# 该字段设置为空,则默认创建一个App为空的项目,否则创建一个支持 docker-app 的项目。
TAG=
最佳实践
上述两种方式均有一定的不足:
- 源代码安装方式:需要安装 Apache + PHP环境, boinc 对PHP版本有一定要求,如果默认的PHP版本不满足要求,更换版本可能比较麻烦。
- docker-compose安装方式:1、很多时候使用已有的Mysql即可,不想在docker-compose中集成。2、 makeproject其实只需要运行一次,但集成在docker-compose每次启动均会运行,担心会导致副作用,例如可能把已有的project删除掉。
所以最佳的方式是将上面的两种搭建方案相结合,这里给出两种方案。
方案1:
- 自己搭建MySQL服务器
- 源码编译boinc,使用里面的工具,如make_project python工具等【这一步可以直接使用docker镜像 boinc/server_makeproject:latest-defaultargs 代替】。
- docker镜像只用 docker-compose中的apache,免去自己搭建apache + PHP 的麻烦。
方案2:
- 源码编译boinc,使用里面的工具,如make_project python工具等【这一步可以直接使用docker镜像 boinc/server_makeproject:latest-defaultargs 代替】。
- docker镜像只用 docker-compose中的apache、mysql,免去自己搭建apache + PHP 的麻烦。
方案2相较于方案1,省去了自己搭建MySQL服务器的麻烦,因为 boinc-server 对MySQL版本有要求,所以使用docker镜像更方便。
基于已有的项目搭建服务器
实际在工作中更多的基于已有项目搭建boinc服务器。而不是重新创建项目。
例如: 我们已经使用 ./bin/make_project 创建了一个名为boinc-app-server 的项目,并且已在本地跑通。现在要将该项目部署到测试环境、正式环境中去。
假设使用上述方案2提供服务。那么需要做的工作流程如下:
拉取项目代码到本地
1
2
3
4
5
6
7
8
sudo mkdir /data/home/boinc-app-server
sudo chown -R lighthouse /data/home/boinc-app-server/
git clone https://github.com/myname/boinc-app-server.git /data/home/boinc-app-server
cd /data/home/boinc-app-server
mkdir -p boinc_app_project/download boinc_app_project/upload
touch boinc_app_project/.built_boinc_app
sudo chmod -R 777 boinc_app_project
配置
假设我们的域名为: test-app.test.com
项目配置 主要包括 . env 以及 config.xml html/user/schedulers.txt 三个文件。
确保域名配置正确。其它配置项保持默认即可,也可自定义。
.env
1
2
# the URL the server thinks its ats
URL_BASE=https://test-app.test.com
boinc_app_project/html/user/schedulers.txt
1
2
<!-- <scheduler>https://test-app.test.com/boinc_app_cgi/cgi</scheduler> -->
<link rel="boinc_scheduler" href="https://test-app.test.com/boinc_app_cgi/cgi">
config.xml
1
2
3
<upload_url>http://test-app.test.com/boinc_app_cgi/file_upload_handler</upload_url>
<download_url>http://test-app.test.com/boinc_app/download</download_url>
<master_url>http://test-app.test.com/boinc_app/</master_url>
如果需要修改db 配置,修改如下字段即可:
1
2
3
4
<db_user>boincadm</db_user>
<db_name>boinc_app</db_name>
<db_passwd>boinc_app@xxx</db_passwd>
<db_host>mysql</db_host>
DB初始化
先启动服务
1
2
docker-compose pull
docker-compose up -d
创建db账号及权限:
1
2
3
4
5
6
7
docker-compose exec -it mysql bash
mysql -u root
CREATE USER 'boincadm'@'%' IDENTIFIED BY 'boinc_app@xxx';
GRANT ALL PRIVILEGES ON *.* TO 'boincadm'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
初始化DB表:
1
2
3
4
5
6
7
8
9
10
11
12
cd /data/home/boinc-app-server/
export PROJECT_ROOT=/home/boincadm/project
docker run -it --rm --network=container:boinc-app-server-mysql-1 -v $PWD/boinc_app_project:$PROJECT_ROOT \
-e PROJECT_ROOT=$PROJECT_ROOT -w $PROJECT_ROOT \
boinc/server_makeproject:latest-defaultargs bash
PYTHONPATH=/usr/local/boinc/py python -c """if 1:
from Boinc import database, configxml
database.create_database(srcdir='/usr/local/boinc',
config=configxml.ConfigFile(filename='$PROJECT_ROOT/config.xml').read().config,
drop_first=False)
"""
继续完成最后的初始化:
1
2
3
4
5
6
docker-compose exec -it apache bash
cd html/ops && ./db_schemaversion.php > ${PROJECT_ROOT}/db_revision
./bin/xadd
yes | ./bin/update_versions
启动服务
1
2
3
4
docker-compose down
docker-compose up -d
./bin/stop
./bin/start
也可以执行以下命令将 start 命令的执行添加到 crontab, 默认会每5分钟执行一次。
1
crontab {project}.cronjob
至此,部署完毕, 可通过如下链接打开项目主页:
https://test-app.test.com/boinc_app/