【编译打包】teamtalk 在CentOS 7 上的安装

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

(写在前面:teamtalk目前处于开源的早期,程序功能不完整或有bug 属正常现象,用于生产环境请慎重。本文介绍的是个人摸索出的简便安装方法,在本文限定的条件下,可以保证安装配置正确,使用win/安卓客户端连接正常,本人主业为运维而非开发,条件有限,除非安装问题,不接受程序bug反馈。)


teamtalk 是由蘑菇街开源的一款IM 软件,包含完整的服务端和各种客户端(windows,andriod,IOS等),相当给力,进群讨论,气氛也十分活跃。蓝狐兄弟低调的同时也十分客气。


由于官方没有提供rpm包,我这里暂且自作聪明,打了一个src.rpm 包。


官方对于权限分配没有做处理,几个脚本都是root编译root运行,编译和下载过程混乱,我于是重新实现了一套编译脚本和服务启动脚本,用于一站式安装,增加安全性,提高部署体验。


使用下面的办法,可以确保编译/安装成功。不喜欢编译的同学,可使用附件提供的二进制rpm安装包,请直接从第8步开始,请优先选择附件目录中日期较新的文件目录,新的文件通常包含bug修复和功能提升。


1、请确保系统为CentOS 7 最小安装并且禁用了selinux(由于gcc版本问题,官方推荐centos7),并且以root身份登录,将附件中的srpm目录中的文件下载到/root,本文假设所有服务都安装在同一台机器上。


2、建立基本的编译环境

1
yum  install  gcc gcc-c++  make  cmake libtool rpm-build redhat-rpm-config yum-utils -y


3、安装epel软件源 (centos官方仓库里没有的依赖包,通常这里都可以找到)

1
yum  install  epel-release -y


4、安装基本的环境依赖包

1
yum  install  mariadb-devel gtest-devel log4cxx-devel curl-devel apr-devel apr-util-devel libuuid-devel openssl-devel hiredis-devel  rsync  wget -y

5、安装teamtalk.XXXX.src.rpm (见附件)

1
rpm -ivh teamtalk.xxxx.src.rpm   # 会在/root目录下生成一个目录rpmbuild


6、检查和解决软件包依赖

1
2
cd  /root/rpmbuild/SPEC
yum-builddep teamtalk.spec

 

7、编译teamtalk (编译过程实际并不需要root权限)

1
rpmbuild -ba teamtalk.spec   #根据机器配置,耗时约5-10分钟不等

 

编译完成,会在/root/rpmbuild/RPMS/ 下生成一些后缀为rpm的软件包


8、使用下面的命令安装rpm包

1
2
3
4
5
cd  /root/rpmbuild/RPMS/x86_64/
rm  -rf teamtalk-debuginfo*     #我们不需要debug包
yum localinstall teamtalk-*.rpm -y 
yum  localinstall  /root/rpmbuild/RPMS/noarch/teamtalk-web *.rpm -y 
#teamtalk-web这个包依赖nginx和php-fpm,会通过yum一并安装


直接使用二进制rpm包的同学,请下载附件地址的RPMS目录中的文件到服务器的同一目录下,

比如/tmp/teamtalk/,以root身份安装

1
2
3
cd  /tmp/teamtalk
yum  install  epel-release -y
yum localinstall teamtalk-*.rpm -y


9、至此,teamtalk这块算是安装完成了,teamtalk 安装在/opt/teamtalk 目录下。

 

----------------------华丽的分界线-------------------------------------------


10、安装LNMP+redis环境

1
2
yum  install  epel-release -y  #如果前面你已经安装,这步可省略
yum  install  nginx mariadb-server php-mysql php-fpm php-xml php-gd php-pecl-zendopcache redis -y


11、mariadb的基本配置


/etc/my.cnf  参考配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[mysql]
port = 3306
socket =  /var/lib/mysql/mysql .sock
default-character- set  = utf8
 
[mysqld]
datadir =  /var/lib/mysql
socket =  /var/lib/mysql/mysql .sock
pid- file  /var/run/mariadb/mariadb .pid
symbolic-links = 0
character- set -server = utf8
 
 
innodb_buffer_pool_size = 1G
innodb_open_files = 65535
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
 
thread_handling = pool-of-threads
 
[mysqld_safe]
log-error =  /var/log/mariadb/mariadb .log
pid- file  /var/run/mariadb/mariadb .pid


如果你安装了teamtalk-web这个软件包的话,可以在/opt/teamtalk/www下看到一个teamtalk.sql文件,那就是teamtalk的数据库结构.

1
2
3
4
5
6
7
8
systemctl  enable  mariadb
systemctl start mariadb
mysql
mysql> create database teamtalk character  set  utf8;
mysql> use teamtalk;
mysql>  source  /opt/teamtalk/www/teamtalk .sql;
mysql> grant all on teamtalk.* to teamtalk@ 'localhost'  identified by  '123456' ;
mysql> flush privileges;


如果你使用了其他用户名和密码,请酌情修改下列文件中的对应配置:

1
2
/opt/teamtalk/www/application/config/database .php
/opt/teamtalk/db_proxy_server/dbproxyserver .conf


12、nginx+php-fpm的基本配置

1
2
3
4
systemctl  enable  nginx
systemctl  enable  php-fpm
systemctl start nginx
systemctl start php-fpm


修改/etc/nginx/nginx.conf 文件:

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
user nginx;
worker_processes auto;
error_log  /var/log/nginx/error .log;
pid  /run/nginx .pid;
 
events {
         use epoll;
         worker_connections 1024;
}
 
http {
         log_format  main   '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"' ;
 
         access_log   /var/log/nginx/access .log  main;
 
         sendfile                on;
         tcp_nopush              on;
         tcp_nodelay             on;
         server_tokens           off;
         keepalive_timeout       30;
         types_hash_max_size     2048;
 
         gzip  on;
         gzip_min_length 1k;
         gzip_disable       "MSIE [1-6]\." ;
         gzip_types       text /plain  application /x-javascript  text /css  application /xml ;
         
         include          /etc/nginx/mime .types;
         default_type      application /octet-stream ;
 
         server {
                 listen                  80 ;
                 server_name             localhost ;
                 index                   index.html index.htm index.php ;
                 root                     /opt/teamtalk/www  ;
 
                 location ~ \.php($|/) {
                         fastcgi_pass   127.0.0.1:9000;
                         fastcgi_index  index.php;
                         fastcgi_split_path_info ^(.+\.php)(.*)$;
                         fastcgi_param   PATH_INFO $fastcgi_path_info;
                         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                         include        fastcgi_params;
                 }
 
                 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 7d;}
 
                 location ~ .*\.(js|css)?$ { expires 12h; }
 
                 if  (!-e $request_filename) {
                         rewrite ^/(.*)$  /index .php/$1 last;
                         break ;
                 }
         }
}

php-fpm可无需配置,默认监听在127.0.0.1:9000,直接启动服务就好了。

如果想使用unix socket,请修改配置文件/etc/php-fpm.d/www.conf,并重启服务,不详述。


修改nginx配置后需要重启nginx

1
systemctl restart nginx

至此,你应该至少应该能够通过浏览器登录web管理后台了,默认用户名和密码均是admin,后台功能并不完整,因为有一个配置文件需要配置后端的服务,后面会讲到,详见:/opt/teamtalk/www/application/config/config.php


14、配置redis

redis也可以不需配置,直接启动就好。

1
2
systemctl  enable  redis
systemctl start redis


15、配置teamtalk

执行下面的命令,查找配置需要修改的地方

1
find  /opt/teamtalk  - type  f -iname  "*conf*"  | xargs  grep  -n --color CHANGEME

将搜索到的文件中的CHANGEME 字眼改为你的服务器本地实际IP,理论上也可以写域名,但不要填127.0.0.1 。


16、开启teamtalk服务

teamtalk 的服务端分的很细,好多个不同的模块,rpm安装过程中会自动创建一个用户teamtalk,由于root身份过于安全敏感,我做了一些限制,需要使用普通用户teamtalk登陆来运行服务。


通用的启动方法是这样的,比如:file_server

1
2
cd  /opt/teamtalk/file_server
.. /daeml  file_server

服务启动后会在当前目录生成一个文件server.pid,里面是进程号


关闭服务的话就是杀进程号 

1
2
  cd  /opt/teamtalk/file_server
kill  ` cat  server.pid`


官方带有两个脚本。restart.sh 和monitor.sh,我进行了些许改造,但是效果不是很好,依然保留。

另外我自己重新实现了一套启动脚本。位于/usr/bin/teamtalk,使用方法如下:

1
2
3
4
su  - teamtalk
teamtalk start file_server
teamtalk stop file_server
teamtalk restart file_server


下列服务都可以通过命令直接 start/stop/restart。

1
2
3
4
5
6
7
8
teamtalk start db_proxy_server
teamtalk start file_server
teamtalk start msfs
teamtalk start http_msg_server
teamtalk start login_server
teamtalk start route_server
teamtalk start push_server
teamtalk start msg_server


利用系统的rc.local脚本,实现teamtalk相关服务开机启动

1
2
3
chmod  u+x  /etc/rc .d /rc . local
sed  -i  '/requiretty$/{s/^/#/g}'  /etc/sudoers
echo  "sudo -u teamtalk /usr/bin/teamtalk  start xxx_server"  >>  /etc/rc . local


17、根据我的理解,简单介绍一下模块的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
msg_server:消息服务器,用户登录成功后,就和指定的消息服务器交互。端口8000,需对外开放
 
login_server :登录服务器,负责身份验证,负责给登录成功的客户端分配msg_server。
这个服务监听在两个端口,一个是tcp端口8100,用于和后端的服务器交互,另一个是http端口8080,需对外开放
 
route_server:消息转发,不同msg_server上用户交互需要中转站来转发消息。端口8200
 
http_msg_server:主要提供对外的web api,端口8400
 
push_server: 消息群发,端口8500
 
file_server:文件中转站,临时存储,端口8600
 
msfs:小文件永久存储,聊天的图片、表情等,端口8700,需对外开放
 
db_proxy_server:数据库中间件,后端为存储层,mysql和redis, 端口10600
 
lnmp:后台管理系统,企业架构,用户添加删除等,端口80


18、防火墙问题

示例防火墙如下,请逐条执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/sbin/iptables  -P INPUT ACCEPT
/sbin/iptables  -P OUTPUT ACCEPT
 
/sbin/iptables  -F
/sbin/iptables  -X
/sbin/iptables  -Z
 
/sbin/iptables  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables  -A INPUT -i lo -j ACCEPT
/sbin/iptables  -A INPUT -p icmp -j ACCEPT
/sbin/iptables  -A INPUT -s 10.0.0.0 /8  -p tcp --dport 22 -j ACCEPT
/sbin/iptables  -A INPUT -s 172.16.0.0 /12  -p tcp --dport 22 -j ACCEPT
/sbin/iptables  -A INPUT -s 192.168.0.0 /16  -p tcp --dport 22 -j ACCEPT
 
/sbin/iptables  -A INPUT -p tcp --dport 80 -m comment --comment  "web"  -j ACCEPT
/sbin/iptables  -A INPUT -p tcp --dport 8000 -m comment --comment  "msg_server"  -j ACCEPT
/sbin/iptables  -A INPUT -p tcp --dport 8080 -m comment --comment  "login_server"  -j ACCEPT
/sbin/iptables  -A INPUT -p tcp --dport 8700 -m comment --comment  "msfs"  -j ACCEPT
 
/sbin/iptables  -P INPUT DROP

如果是测试环境的话,为了方便调试,可以关闭防火墙。

1
systemctl stop firewalld


19、登录后台,新建用户,并使用客户端登录

客户端指定的登录服务器地址为 http://IP:8080/msg_server


wKiom1Wl-TGiZvnZAAB9-v0R1CQ383.jpg


20、其他说明 (未完待续,保持更新) 


----------------------华丽的分界线-------------------------------------------

FAQ

Q1、折腾出错,想重新玩起,怎么办?

1
2
yum remove teamtalk -y
rm   -rf  /opt/teamtalk/ *

不用回到解放前,只需重新安装rpm包即可,请分别执行第8/第15/第16步


Q2、我想使用高版本的rpm包,怎么办?

1
rpm -Uvh teamtalk-*


Q3、我是开发人员,我要一边改代码,一边测试?

首先,你得安装好teamtalk,请从第1步开始逐步进行,直至完成。

如果你是c++开发人员,请进入/root/rpmbuild/teamtalk/ 目录,那里是一个完整的编译环境,以msfs为例,修改代码,然后重新编译,将新生成的二进制文件msfs覆盖/opt/teamtalk/msfs/msfs 。

1
2
3
4
5
6
7
cd  /root/rpmbuild/BUILD/teamtalk/server/src/msfs
#此处省略修改代码内容
cmake .
make
cp  msfs  /opt/teamtalk/msfs/msfs
make  clean
teamtalk restart msfs

如果你是php开发人员,请直接修改/opt/teamtalk/www 里的内容,php属解释性语言,无需多讲。


注:本文不代表官方。











本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/1672859,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
Linux 网络安全 数据安全/隐私保护
如何在 VM 虚拟机中安装 CentOS Linux 9 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 CentOS Linux 9 操作系统保姆级教程(附链接)
156 0
|
2月前
|
关系型数据库 MySQL Linux
centos7.0环境下安装MySql_8.0.12
centos7.0环境下安装MySql_8.0.12
|
1月前
|
存储 JavaScript Linux
Linux环境下安装nmp(Centos环境)保姆级教学 一步到位
Linux环境下安装nmp(Centos环境)保姆级教学 一步到位
|
2月前
|
关系型数据库 MySQL Linux
CentOS7环境下安装MySQL5.6
CentOS7环境下安装MySQL5.6
196 0
|
1天前
|
存储 Linux 网络安全
centos7使用yum网络安装
这些是使用Yum进行网络安装的基本步骤。根据你的需求,你可以重复步骤3和4来安装其他软件包。请注意,执行Yum操作需要root或具有sudo权限的用户。
12 1
|
7天前
|
关系型数据库 MySQL Linux
centos7安装mysql-带网盘安装包
centos7安装mysql-带网盘安装包
41 2
|
14天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
24 0
|
14天前
|
分布式计算 Hadoop Java
centos 部署Hadoop-3.0-高性能集群(一)安装
centos 部署Hadoop-3.0-高性能集群(一)安装
15 0
|
14天前
|
关系型数据库 MySQL Linux
CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解
CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解
68 0
|
20天前
|
IDE Linux 开发工具
CentOS7.4+REDHAWK2.3.1安装教程——折腾篇
CentOS7.4+REDHAWK2.3.1安装教程——折腾篇
19 0