Countly统计平台部署踩坑记录

Countly统计平台部署踩坑记录

项目需要一个自托管的统计平台,选了Countly。部署过程踩了不少坑,记录一下。

环境准备

Countly依赖MongoDB和Node.js,对系统配置有一定要求。

服务器配置建议

规模 CPU 内存 磁盘
测试环境 2核 4GB 50GB
中等流量 4核 8GB 200GB SSD
高流量 8核+ 16GB+ 1TB+ SSD

坑1:SELinux冲突

Countly和SELinux有冲突,会导致服务启动失败。建议直接关闭:

1
2
3
4
5
# 临时关闭
sudo setenforce 0

# 永久关闭
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

MongoDB安装

Countly需要MongoDB 6.0,安装过程还算顺利。

1
2
3
4
5
6
7
8
9
10
11
12
# 配置YUM仓库
sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo <<EOF
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-6.0.asc
EOF

# 安装
sudo yum install -y mongodb-org

数据目录配置

1
2
3
4
5
# 创建数据目录
sudo mkdir -p /data/db/mongo
sudo mkdir -p /data/log/mongodb
sudo chown -R mongod:mongod /data/db/
sudo chown -R mongod:mongod /data/log/

配置文件 /etc/mongod.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
storage:
dbPath: /data/db/mongo
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 2

systemLog:
destination: file
logAppend: true
path: /data/log/mongodb/mongod.log

net:
port: 27017
bindIp: 127.0.0.1

启动并设置开机自启:

1
2
sudo systemctl start mongod
sudo systemctl enable mongod

Node.js安装

Countly需要Node.js 18.x:

1
2
3
4
5
6
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs

# 验证
node --version
npm --version

坑2:npm镜像慢

国内访问npm官方源很慢,建议换淘宝镜像:

1
npm config set registry https://registry.npmmirror.com

Countly安装

下载源码

1
2
3
4
5
6
7
8
sudo mkdir -p /data/software
cd /data/software

# 下载最新版本
sudo wget https://github.com/Countly/countly-server/releases/download/23.11.15/countly-server-23.11.15.zip
sudo unzip countly-server-23.11.15.zip
sudo mv countly-server-23.11.15 countly
cd countly

修改安装脚本

坑3:Node.js重复安装

Countly安装脚本会尝试安装Node.js,但我们已经装过了,需要跳过:

1
sudo vim bin/countly.install_rhel.sh

注释掉Node.js安装部分:

1
2
3
# 找到并注释以下行
#install nodejs
#sudo dnf module install -y nodejs:18/common

运行安装

1
2
3
sudo su -
cd /data/software/countly/bin
bash countly.install.sh

安装过程会自动:

  1. 检查系统依赖
  2. 安装Nginx
  3. 安装Node.js依赖
  4. 配置Countly服务
  5. 初始化数据库

npm安装比较耗时,耐心等待。

坑4:argon2报错

安装过程中可能会遇到这个错误:

1
symbol lookup error: argon2.node: undefined symbol: argon2_ctx

解决方案

1
2
3
4
5
6
7
8
9
cd /data/software/countly
sudo rm -rf node_modules

# 修改package.json,将argon2版本改为*
sudo vim package.json
# "argon2": "*"

sudo npm install
countly restart

服务管理

Countly装好后有一些常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看状态
countly status

# 重启
countly restart

# 停止
countly stop

# 查看版本
countly version

# 如果命令不可用,先执行
bash bin/scripts/detect.init.sh

日志查看

1
2
3
4
5
6
7
8
# API日志
sudo tail -n 500 /data/software/countly/log/countly-api.log

# Dashboard日志
sudo tail -n 500 /data/software/countly/log/countly-dashboard.log

# 实时监控
sudo tail -f /data/software/countly/log/countly-api.log

检查HTTP访问

1
2
3
4
5
# Dashboard进程(应返回网页内容)
wget -O- 127.0.0.1:6001

# API进程(应返回400 Bad Request)
wget -O- 127.0.0.1:3001/i

创建管理员

1
countly add_user admin yourpassword

Nginx配置

Countly使用Nginx做反向代理,配置文件在 /etc/nginx/conf.d/countly.conf

SSL配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 443 ssl http2;
server_name stats.yourdomain.com;

ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

location / {
proxy_pass http://127.0.0.1:6001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

SDK集成示例

Cocos Creator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const Countly = require('countly-sdk-cocos2d-x');

Countly.init({
app_key: 'YOUR_APP_KEY',
url: 'https://stats.yourdomain.com',
debug: false
});

Countly.begin_session();

// 记录事件
Countly.add_event({
key: 'level_complete',
count: 1,
segmentation: {
level: 1,
score: 1000
}
});

iOS

1
2
3
4
5
6
#import "Countly.h"

CountlyConfig *config = [[CountlyConfig alloc] init];
config.appKey = @"YOUR_APP_KEY";
config.host = @"https://stats.yourdomain.com";
[[Countly sharedInstance] startWithConfig:config];

Android

1
2
3
4
5
6
import ly.count.android.sdk.Countly;

Countly.sharedInstance()
.init(this, "https://stats.yourdomain.com", "YOUR_APP_KEY");

Countly.sharedInstance().onStart(this);

数据库备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

BACKUP_DIR="/backup/countly"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# 备份MongoDB
mongodump --out $BACKUP_DIR/$DATE

# 压缩
cd $BACKUP_DIR
tar -czf $DATE.tar.gz $DATE
rm -rf $DATE

# 保留最近7天
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

echo "Backup completed: $DATE.tar.gz"

坑5:日志文件过大

Countly日志如果不清理会占满磁盘,配置logrotate:

1
2
3
4
5
6
7
8
9
10
11
sudo tee /etc/logrotate.d/countly <<EOF
/data/software/countly/log/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 root root
}
EOF

总结

Countly部署整体还算顺利,主要注意这几个坑:

  1. SELinux要关闭,否则服务起不来
  2. npm换国内镜像,不然安装慢死
  3. argon2报错时删除node_modules重新装
  4. 记得配置日志轮转,防止磁盘占满
  5. 定期备份MongoDB数据

自托管统计平台数据隐私性好,但需要自己运维。如果数据量不大,Countly社区版完全够用。