Boinc 后台服务搭建

Boinc 后台服务搭建

Posted by vxiaozhi on January 12, 2025

Boinc 后台服务搭建

源码编译安装部署

参考 Boinc Server搭建

用户和组

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 部署相比较源码安装方式会简单很多。

参考 Boinc Server 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/