`
fuwa_jane
  • 浏览: 50083 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

小组开发环境搭建: apache+ftp+cvs+samba

阅读更多

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。http://www.chedong.com/tech/dev.html



内容摘要:本文主要介绍一些小组开发环境搭建中经常会遇到一些服务器服务设置,这些服务很多都是鉴于大部分的开发客户端仍然是Windows设置 的,每个服务都提供了简单的基本配置示范。包括:
IP管理(DHCP):服务器IP地址的管理和解析(结合SAMBA的WINS服务),开发客户端的IP管理;
WEB服务(APACHE):文档共享,CVS的WEB界面浏览,论坛工具等;
FTP服务(FTP):用于文件下载/共享;
版本控制(CVS):程序源代码和文档的版本控制;
文件共享(SAMBA):基于NETBIOS的文件共享,方便WINDOWS客户端的访问(比如一些工具的安装等);
数据库服务器(MYSQL):一些应用的后台数据库服务;
备份机制(wget + rsync):备份

很多设置是缺省按照在bash环境中,在tcsh环境中,有一些设置不太一致。

服务器规划如下:


硬件准备:至少要2台服务器
1.从理论上说,任何系统的崩溃只是时间问题,而且谁也不能保证开发者不犯错误;
2.解决以上问题的办法只有:备份,备份,备份……

操作系统准备

FreeBSD或GNU/Linux,系统安装时,本文的配置主要以在RedHat 8上运行为例。注意:安装时要将“开发工具”大类选上,后面的很多工具都需要使用GCC进行编译,有的应用脚本运行用到了perl。2台主服务器分别使用 IP地址192.168.0.200和192.168.0.201
语言环境缺省设置:

vi /etc/sysconfig/i18n


删除UTF-8相关设置:
LANG="en_US"
SUPPORTED="en_US:en"
SYSFONT="latarcyrheb-sun16"


GNU/Linux安装完后:经常有很多不必要的服务需要删除,但根据服务器的不同,要删除的服务也不一样:本来是想总结一个统一的脚本,后来发现是需要删除的服务比需要保留的服务多,而且缺省有那些服务和系统版本,安装的模式也相关。

这里我总结的了一个简单的方法来删除不必要的服务:

首先:备份原始服务设置:
#chkconfig --list > chkconfig.orig

生成删除脚本:把所有在LEVEL 3启动的服务过滤出来,并生成chkconfig service off 这样的命令
#chkconfig --list | grep 3:on | awk '{print "chkconfig "$1" off"}'
chkconfig kudzu off
chkconfig syslog off
chkconfig netfs off
chkconfig network off


chkconfig random off
chkconfig rawdevices off
chkconfig pcmcia off
chkconfig keytable off
chkconfig apmd off
chkconfig atd off
chkconfig gpm off
chkconfig autofs off
chkconfig iptables off
chkconfig isdn off
chkconfig sshd off
chkconfig portmap off
chkconfig nfslock off
chkconfig sendmail off
chkconfig rhnsd off
chkconfig crond off
chkconfig anacron off
chkconfig xfs off
chkconfig xinetd off


我们把需要保留的服务从这个列表中删除:
一般WEB服务器只留network sshd crond atd syslog

删掉相应的行以后就生成了不需要的服务删除脚本:
chkconfig kudzu off
chkconfig syslog off
chkconfig netfs off
chkconfig rawdevices off
chkconfig pcmcia off
chkconfig keytable off
chkconfig apmd off
chkconfig gpm off
chkconfig autofs off
chkconfig iptables off
chkconfig isdn off
chkconfig portmap off
chkconfig nfslock off
chkconfig sendmail off
chkconfig rhnsd off
chkconfig xfs off
chkconfig xinetd off


2台机器上都安装的服务:SSH FTP DHCP服务
SSH

基本的登陆服务,对于内部分开发来说一般用缺省的就可以了,但是建议将/etc/ssh/sshd_config中的:
PermitRootLogin yes改成PermitRootLogin no
FTP

建议用proftpd代替原有的ftp服务:http://www.proftpd.org/ 当然如果是vsftpd就不用换了
安装:tar zxf proftpd-version.tar.gz; cd proftpd-version/; ./configure; make; make install
缺省配置/usr/local/etc/proftpd.conf

ServerName "ProFTPD"

ServerType standalone

DefaultServer on
AllowOverwrite on

Port 21

Umask 022


UseReverseDNS off

MaxInstances 30


User apache

Group apache


1.不反相解析登陆机器的域名 UseReverseDNS off
2.使用了系统缺省的apache用户/组运行服务
3.使用AuthUserFile把一些虚拟用户映射成系统帐户是一种更安全的方式,可以把多个只需要FTP权限的开发者用虚拟帐号映射成一个系 统用户。这些虚拟用户的认证密码在ftpd.passwd中设置,从而实现了于系统认证的分离:
ftpasswd是一个perl脚本,下载即可使用: ftpasswd --passwd --name=test --uid=501 --gid=501 --home=/home/test --shell=/sbin/nologin --file=/etc/ftpd.passwd
然后在proftpd.conf配置中增加:DefaultRoot ~ 让用户只能在自己的目录下工作,不能通过cd ..转向更上级目录进行操作
AuthUserFile /etc/ftpd.passwd
DefaultRoot  ~

DHCP

为了更方便的管理在同一个局域网中开发者的IP地址和服务器的IP地址,最好将服务器安排在一定范围内的静态IP内(比如 192.168.0.200以上),将(192.168.0.10-200)范围内为开发机客户端提供动态IP。假设我们的主服务器 (192.168.0.200)和辅助开发服务器(192.168.0.201)使用静态IP,同时为网段内提供192.168.0.10-200动态 IP分配服务。DHCP服务在2台服务器上都安装,一个做主DHCP服务,用于给子网IP池提供70%的IP,另外一台做备份,拥有IP池的30%。在例 子中:200负责10-100,201负责110-150。缺省dhcpd没有安装的话,从安装盘上找到DHCP软件包安装或者从http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所 不同)。缺省配置文件位于/etc/dhcpd.conf

缺省配置:主服务器上
ddns-update-style none;
default-lease-time 120000; 
max-lease-time 920000; 
option subnet-mask 255.255.255.0; 
option broadcast-address 192.168.0.255; 
option netbios-name-servers 192.168.0.200;
option routers 192.168.0.1; 
option domain-name-servers 202.106.196.115,202.96.199.133; 
option domain-name "example.com"; 

subnet 192.168.0.0 netmask 255.255.255.0{
 range 192.168.0.10 192.168.0.100; 
}


说明:
缺省每个IP租期2天: default-lease-time 120000;
最长租期: max-lease-time 920000;
缺省子网掩码:option subnet-mask 255.255.255.0;
缺省广播地址:option broadcast-address 192.168.0.255;
让192.168.0.200上的samba服务启用WINS服务:用于内部域名解析
option netbios-name-servers 192.168.0.200;
缺省网关 option routers 192.168.0.1;
缺省域名服务器 option domain-name-servers 202.106.196.115,202.96.199.133;
缺省域名 option domain-name "example.com";

#一个缺省的子网设置:
subnet 192.168.0.0 netmask 255.255.255.0{
#为子网动态分配0.10-100的IP
range 192.168.0.10 192.168.0.100; 
}


辅DHCP服务器上唯一不同的地方是:为子网动态分配0.110-150的IP,主DHCP和附DHCP服务器的IP池不能相互重叠
subnet 192.168.0.0 netmask 255.255.255.0{ 
 range 192.168.0.110 192.168.0.150; 
}


注意:
如果主服务器是2块网卡并同时用作NAT服务,则外网IP是DHCP不能广播的,需要将外网IP地址屏蔽广播
加入:
subnet 202.102.34.102 netmask 255.255.255.255 {}

主服务器上的应用安装:

SAMBA服务:用于文件的共享和内部WINS解析

这里只做一个只读共享的简单配置,

[global]
 #别人会通过"网上邻居"看到WORKGROUP组里名为的Linux机器,注释是:My Samba Server
 workgroup = WORKGROUP
 netbios name = Linux
 server string = My Samba Server

 #日志设置
 log file = /var/log/samba/%m.log
 max log size = 50

 #安全设置
 security = share

 #用SAMBA的WINS服务支持,并且用/etc/hosts做内部域名解析
 wins support = yes
 name resolve order = hosts lmhosts wins bcast
 dns proxy = yes

[public]
 #一个共享设置
 comment = Public Stuff 
 path = /home/share
 public = yes
 guest ok = yes
 read only = yes
 writable = no
 printable = no
 
[docs]
 #一个需要密码验证的设置,密码通过#smbpasswd -a user password增加
 comment = Public Stuff
 security = user
 encrypt passwords = yes 
 smb passwd file = /etc/samba/smbpasswd 
 path = /home/docs
 public = yes
 guest ok = no
 read only = yes
 writable = no


在这里为了让大家能够在内部使用dev.example.com访问主服务器(192.168.0.200),我用DHCP设置主服务器 (192.168.0.200)同时也是是内部的WINS服务器,而在200的SAMBA服务中,启用了WINS支持,并设置WINS用可以利用DNS做 NETBIOS名称解析。这样如果DNS读取的是/etc/hosts文件中的设置的话,hosts文件就可以当作WINS域名配置文件了,在 /etc/hosts里设置了:
192.168.0.200 dev.example.com bbs.example.com dev bbs
192.168.0.201 bak.example.com backup
后,通过DHCP获得IP的内网客户端就可以直接通过: dev.example.com访问开发服务器了。

所有的机器名前缀我都使用了缩写:dev, bbs bak之类的,原因是samba的NMBD实际上是NETBIOS名称的解析,名称长度是16个字符(实际是15个)有限制的。因此,虽然 192.168.0.202 username.example.com虽然是一个合法的DNS名称解析,但由于username.example.com长度超过了16个字符,所以 通过SAMBA的WINS服务解析仍然无法找到。dev.chedong.com相当于\\dev.chedong.com\这样的一台机器。当初用 SAMBA的WINS解析在客户端总是ping不通testing.chedong.com这个问题困扰了我好一阵。

WEB服务:APACHE + php + resin

主要用作文件的WEB共享和一些应用的前端浏览(CVSWEB GNATSWEB PHPMYADMIN等),Apache,这里仍然使用了1.3,因为很多应用,比如PHP在2.0上运行还不是完整。

安装: http://httpd.apache.org下载最 新版本:

编译选项:这样可以让所有的模块都通过配置文件动态加载,方便后面其他应用模块的添加删除:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
更多安装说明可以参考: APACHE安装笔记

重复如下:
apache:
diff httpd.h httpd.h.orig
314c314
< #define HARD_SERVER_LIMIT 2560
---
> #define HARD_SERVER_LIMIT 256

./configure --prefix=/home/apache --enable-shared=max --enable-module=most


删除过多的注释:
grep -v "#" httpd.conf.default >httpd.conf

php + mysql

mysql: innodb效率和ORACLE差不多,一般应用用不上
./configure --prefix=/home/mysql --without-innodb  

./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars \
--with-mysql=/home/mysql \
--with-oci8=/home/oracle/product/8.1.7 \
--with-oracle=/home/oracle/product/8.1.7
make 
#make install

修改httpd.conf
<IfModule mod_dir.c>
DirectoryIndex index.html index.php index.php3
</IfModule>
在<IfModule mod_mime.c>中加入:
AddType application/x-httpd-php .php .php3

resin
./configure --with-apxs=/home/apache/bin/apxs
make
make install

修改httpd.conf
<IfModule mod_caucho.c>
CauchoConfigFile /home/resin/conf/resin.conf
</IfModule>


文档共享技巧:
1 对于文档的共享来说,autoindex模块非常有用,让APACHE自动索引目录缺省是按文件/目录名排序的,而且文件名40个字符以上部分是被截断 的,为了能显示完整的文件名,并且像资源管理器那样将目录排在前面,文件排在后面:
在<IfModule mod_autoindex.c>模块设置中:
#增加NameWidth选项,并且文件名长度是*(自动适应当前目录下最长文件名)
#增加FoldersFirst选项,让目录列在前面(类似于资源管理器)
#增加了ScanHTMLTitles用HTML文件的TITLE做文件的描述,并设置描述长度是*(自适应最长)
IndexOptions FancyIndexing +NameWidth=* FoldersFirst ScanHTMLTitles +DescriptionWidth=*

2 如果是CGI开发,如何让用户在自己的目录下能够发布CGI程序,比如:http://192.168.0.200/~chedong/cgi- bin/my_cgi:在
<IfModule mod_alias.c>模块设置中,添加正则表达式:
ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*) /home/$1/cgi-bin/$2
意思是匹配~user_name/cgi-bin/cgi_name自动映射到/home/user_name/cgi-bin/cgi-name脚本

3 如果允许所有目录可以自动索引浏览autoindex,需要将
<Directory "/home/apache/htdocs"> <===改成 <Directory "/">


版本控制:CVS

CVS缺省在服务器上几乎都安装好了,只要按照以下步骤初始化即可:

在/etc/profile里:
CVS库所在的主服务器设置:
export CVSROOT=/home/cvsroot
在其他开发服务器里设置:
export CVSROOT=:ext:$USER@192.168.0.200:/home/cvsroot
export CVS_RSH=ssh

然后在主服务器上cvs init初始化:

关于CVSWEB的设置,重复以下CVS常用命令手册中CVSWEB的内 容:

CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是个人感觉安装设置比较方便的:
http://www.spaghetti-code.de/software/linux/cvsweb/

下载解包:
tar zxf cvsweb.tgz
把配置文件cvsweb.conf放到安全的地方(比如和apache的配置放在同一个目录下),
修改:cvsweb.cgi让CGI找到配置文件:
$config = $ENV{'CVSWEB_CONFIG'} || '/path/to/apache/conf/cvsweb.conf';

转到/path/to/apache/conf下并修改cvsweb.conf:
修改CVSROOT路径设置:
%CVSROOT = (
'Development' => '/path/to/cvsroot', #<==修改指向本地的CVSROOT
);
缺省不显示已经删除的文档:
"hideattic" => "1",#<==缺省不显示已经删除的文档
在配置文件cvsweb.conf中还可以定制页头的描述信息,你可以修改$long_intro成你需要的文字

首先可以CVS进库里的就是以上系统的安装文档。

更多的关于CVS的扩展应用可以参考CVS常用命令手册CVSTRAC部分

多个服务之间的资源共享

一般可以通过链接解决,比如:

我希望匿名ftp共享的内容(比如在/var/ftp/pub目录下)都可以WEB发布,
ln -s /var/ftp/pub /home/apache/htdocs/pub

我希望/usr/share/doc里的文档大家可以通过WEB浏览:
ln -s /usr/share/doc /home/apache/htdocs/doc

我希望WEB发布的内容大家通过WINDOWS网络邻居也可以访问:假设/home/share是samba发布的只读共享路径
ln -s /home/apache/htdocs /home/share

服务的自动启动:
系统已经安装的服务一般可以通过setup的服务配置是否自动启动,否则就在/etc/rc.local里加一些启动脚本即可。
比如:

备份和日志统计

可以将以下脚本写在主服务器的ROOT的CRON里:
#time sync
0 5 * * 1 (/usr/bin/rdate -s YOUR_DATE_TIME_SERVER)

#backup cvsroot
5 3 * * * (cd /home; tar czf /home/backup/cvsroot.`date +\%w`.tgz cvsroot)

#backup apache
8 3 * * * (cd /home; tar czf /home/backup/apache.`date +\%w`.tgz apache)

#webalizer demo
3 5 * * * (/usr/local/bin/webalizer -c /home/apache/conf/webalizer.conf /home/apache/logs/`date -d yesterday +\
%w`/access_log)

#remove last week web log
3 4 * * * (find /home/apache/logs/ -name access_log -mtime +4 -exec rm -f {} ;)

这样,在/home/backup目录下会有按星期轮训的7个备份。然后通过在辅助服务器上设置CRON用wget的-m选项镜像主服务器上的 /home/backup目录或者用rsync做同步就可以了。后面的2条是关于使用webalzier做服务器的日志统计,APACHE的日志通过 cronolog进行了轮循。具体设置请参考:
注意:
在CRONTAB中 %需要转义\%,比如:tar czf /home/backup/apache.`date +\%w`.tgz apache
而命令行中需要转义的\; 在crontab 中不需要转义,比如:...-mtime +4 -exec rm -f {} ;

基于RSYNC的同步备份:

主服务器:设置启动rsync服务
/etc/rsyncd.conf 
hosts allow 192.168.0.*
[ftp]
path = /home/apache/htdocs
comment = docs need backup

备份服务器:每天6点同步一次数据
2 6 * * * (/usr/bin/rsync -au --delete rsync://192.168.0.200/ftp /home/apache/htdocs ) 

如何给用户设置缺省密码:
/home/apache/bin/htpasswd -bmn chedong 123
chedong:$apr1$5hoi./..$XlpyjZk6rw7R9D5QPo6V6/
-b don't prompt
-m md5
-n print to stout

TODO:
基于WIKI的文档共享:twiki
打印服务;
  • 大小: 11 KB
分享到:
评论

相关推荐

    安装NumPy教程-详细版

    附件是安装NumPy教程_详细版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    语音端点检测及其在Matlab中的实现.zip

    语音端点检测及其在Matlab中的实现.zip

    C#文档打印程序Demo

    使用C#完成一般文档的打印,带有页眉,页脚文档打印,表格打印,打印预览等

    DirectX修复工具-4-194985.zip

    directx修复工具 DirectX修复工具(DirectX repair)是系统DirectX组件修复工具,DirectX修复工具主要是用于检测当前系统的DirectX状态,若发现异常情况就可以马上进行修复,非常快捷,使用效果也非常好。

    Python手动实现人脸识别算法

    人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在0.6 以下都可以被认为是同一张脸 人脸识别的主要步骤 1 获得人脸图片 2 将人脸图片转为128D的矩阵(这个也就是人脸特征的一种数字化表现) 3 保存人脸128D的特征到文件中 4 获取其他人脸转为128D特征通过欧式距离算法与我们保存的特征对比,如果差距在0.6以下就说明两张脸差距比较小

    全国大学生信息安全竞赛知识问答-CISCN 题库.zip

    ciscn 全国大学生信息安全竞赛知识问答-CISCN 题库.zip

    JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译).zip

    JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)JAVA+SQL离散数学题库管理系统(源代码+LW+外文翻译)

    strcmp函数应用.zip

    strcmp函数应用.zip

    蓝桥杯单片机第十一届国赛设计题试做

    蓝桥杯单片机第十一届国赛设计题试做

    基于MATLAB的pca人脸识别.zip

    基于MATLAB的pca人脸识别.zip

    520.html

    520.html

    JAVA在线考试管理系统(源代码+LW+开题报告+外文翻译+英文文献+答辩PPT).zip

    JAVA在线考试管理系统(源代码+LW+开题报告+外文翻译+英文文献+答辩PPT)

    STR710的定时器编程C语言例子,开发环境为IAR EWARM。.zip

    STR710的定时器编程C语言例子,开发环境为IAR EWARM。.zip

    基于物品的协同过滤推荐算法(Python).zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    JAVA文件传输(lw+源代码).zip

    FTP(File Transfer Protocol)是文件传输协议的简称。 FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。 目前FTP服务器软件都为国外作品,例如Server_U、IIS,国内成熟的FTP服务器软件很少,有一些如(Crob FTP Server),但从功能上看来远不能和那些流行的服务器软件媲美。

    python项目源码-深度学习tensorflow的滚动轴承故障诊断方法源码(高分大作业).rar

    本项目基于深度学习TensorFlow框架,针对滚动轴承故障诊断方法进行研究。项目采用了卷积神经网络(CNN)对轴承振动信号进行特征提取和分类,实现了对滚动轴承不同故障类型的自动诊断。 在技术实现上,项目利用TensorFlow搭建了一个高效的CNN模型,通过多层卷积、池化操作以及全连接层,自动学习轴承振动信号中的故障特征。同时,采用交叉熵损失函数优化模型参数,提高故障识别率。此外,项目还集成了数据预处理、模型训练、测试评估等功能模块,方便用户快速上手并进行实验研究。 经过运行测试,该项目代码运行稳定,诊断效果良好,可广泛应用于滚动轴承故障诊断领域。对于计算机相关专业的在校学生、老师或企业员工来说,该项目是一份难得的高分大作业资源,同时也是小白学习和实际项目借鉴的优秀参考资料。请放心下载使用,为您的学习和工作提供帮助!

    超详细的SpringBoot框架入门教程 Spring Boot框架快速入门教程以大量示例讲解了Spring Boot在各类情境

    超详细的SpringBoot框架入门教程 Spring Boot框架快速入门教程以大量示例讲解了Spring Boot在各类情境中的应用,让大家可以跟着老师的思维和代码快速理解并掌握。适用于Java 开发人员,尤其是初学Spring Boot的人员和需要从传统 Spring 转向 Spring Boot 开发的技术人员。 下边是动力节点的SpringBoot教程非常适合初学入门,讲的非常详细,而且全程无废话!

    毕业设计[主机域名]ISPConfig 3.0.1.3_ispconfig3-codepub.zip

    毕业设计[主机域名]ISPConfig 3.0.1.3_ispconfig3-codepub.zip

    matlab开发-用交叉熵优化多变量宏观模型随机多极值优化.zip

    matlab开发-用交叉熵优化多变量宏观模型随机多极值优化.zip

    矩阵特征值的计算方法.zip

    矩阵特征值的计算方法.zip

Global site tag (gtag.js) - Google Analytics