[Baïkal]使用Baikal自建CalDAV+CardDAV 服务器
Baïkal Baikal    2022-05-01 22:08:40    2676    0    0
acme   Baïkal Baikal

    本次博文带来的是在Linux环境下自建CalDAV+CardDAV 服务器的教程,此次博文中采用的操作系统是Ubuntu Server,版本为20.4;Web服务器采用NginxBaïkal是一款基于于PHP开发的开源产品,可以在GitHub上查看;由于依赖于PHP运行环境,版本要求7,此次部署使用为7.4;数据库采用MySQL或者SQLite

    关于Baikal的介绍,直接复制官网的话语并且简单翻译一下:

    Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database.
    Baïkal是一个轻量级的CalDAV+CardDAV服务器。它提供了一个网页界面,可以轻松管理用户、地址簿和日历。它安装起来既快速又简单,其基础运行环境依赖于PHP,数据可以使用MySQL或SQLite。
    Baïkal allows to seamlessly access your contacts and calendars from every device. It is compatible with iOS, Mac OS X, DAVx5 on Android, Mozilla Thunderbird and every other CalDAV and CardDAV capable application. Protect your privacy by hosting calendars and contacts yourself - with Baïkal.
    Baïkal允许从每台设备无缝访问您的联系人和日历。它与iOS、Mac OS X、Android上的 DAVx5、Mozilla Thunderbird以及其他所有支持CalDAV和CardDAV协议的应用程序兼容。使用自建Baïkal服务来托管日历和联系人还可以保护您的隐私。

配置服务器

首先通过SSH登录服务器,新装服务器建议登录服务器以后更新一下所有的包
#更新
sudo apt-get update
sudo apt-get upgrade -y
在更新完所有的包以后建议重启一下服务器,重启命令root,如果为生产环境请勿随意重启
#重启命令 生产环境请勿随意重启
reboot
Ubuntu默认安装没有中文语言支持,如果要安装中文语言支持可以安装语言包,命令如下
#安装中文语言包
sudo apt-get install language-pack-zh-hans -y

安装完中文语言包支持以后,默认还是使用的英文环境,可以使用echo $LANG查看当前的语言

可以使用export命令更改为中文export LANG=zh_CN.UTF-8

当然,export命令仅针对当前会话有效,如果需要将该命令固化下来有多种方式,

例如更改系统环境变量,或者用户变量,可以将命令添加在在以下几个文件中的

一个或者多个:/etc/profile、/etc/enviroment、~/.profile、~/.env、~/.bashrc

更改时区后,使用date命令可以查看当前时间信息,建议将时区更改成上海

#删除默认
rm -rf /etc/localtime
#链接
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#查看时间日期
date​

安装所需的各项依赖和组件

#安装nginx
sudo apt-get install nginx -y
#安装php-fpm
sudo apt-get install php-fpm  -y
#由于当前使用php版本为7.4,如果使用其他版本,请注意组件包的版本更改
#安装php组件的sqlite和mysql支持,二者选其一或者两者皆安装,具体看使用哪一种数据库
sudo apt-get install php7.4-sqlite3 php7.4-mysql -y
#安装php-xml组件 必要
sudo apt-get install php7.4-xml -y

获取Baikal安装包,从GitHub上选择最新的release版本,当前版本0.9.2

#下载部署包
wget https://github.com/sabre-io/Baikal/releases/download/0.9.2/baikal-0.9.2.zip
#将下载的包移动到www目录,放在什么目录看自己需求,只需要权限以及nginx的配置好就行
mv baikal-0.9.2.zip /var/www/html/
#进到www目录
cd /var/www/html/
#由于文件是zip格式,下载一个解压软件用于解压
sudo apt-get install unzip -y
#解压zip文件
unzip baikal-0.9.2.zip
#变更该文件的所属用户和组,该项查看/etc/nginx/nginx.conf文件中配置的user
#或者使用ps -aux|grep nginx查看当前nginx是以什么用户运行的
chown -R  www-data:www-data baikal

配置Nginx

在配置nginx之前,如果要使用ssl,需要证书;如果是公网有域名,可以考虑采用Let’s Encrypt

如果是本地部署,可以采用自生成证书;

请注意,IOS同步功能必须要求ssl加密,所以建议配置。本篇的证书为自生成证书

#进入到nginx目录
cd /etc/nginx
#新建一个目录 这里准备用来存放证书 实际存放位置自选 nginx的相关配置关联即可
mkdir private_key
#进入到存放证书的目录
cd private_key
#首先新建私钥 这里我选择了rsa 秘钥长度2048
openssl genrsa -out  private.key 2048
#根据私钥生成公钥 公钥有效期我这里设置了3650天
openssl req -x509 -new -nodes -key private.key -days 36500 -out server.crt

生成公钥的时候会提示输入信息,看实际需求是否要填入,这些信息都会在公钥上显示

配置nginx,修改nginx的默认配置

vi /etc/nginx/nginx.conf

在配置文件中,有两行配置引入,这里建议更改这两行,不要使用*通配符,手动引入配置

/etc/nginx/sites-enabled目录下有一个默认的default配置,将第二行改成

include /etc/nginx/sites-enabled/default;

第一行改成include /etc/nginx/conf.d/baikal.conf;

 

修改/etc/nginx/sites-enabled/default对的内容,建议全部删除并放入以下内容

由于这一条include放置于引入的最后一条,并且是默认server,即表示如果前面的访问不匹配则返回403

403是无权访问的意思,建议这样配置,给服务器的访问做一条垫底的策略

server {
        #监听80端口 ipv4和v6的 返回403
        listen  80 default_server;
        listen [::]:80 default_server;
        return 403;
}

server {
        #监听443端口 ipv4和v6的 返回403
        listen  443 ssl default_server;
        listen  [::]:443 ssl default_server;
        #配置证书 这里是前面自生成的,如果使用其他证书配置实际地址
        ssl_certificate /etc/nginx/private_key/server.crt;
        ssl_certificate_key /etc/nginx/private_key/private.key;
        return 403;
}

新建vi /etc/nginx/conf.d/baikal.conf文件并写入以下内容

server {
    #监听ipv4的80端口
    listen       80;
    #服务器的名称 即表示使用该域名访问的时候才会匹配
    server_name  baikal.acme-me.cc;
    #重定向 将http流量引到https
    rewrite ^/(.*) https://baikal.acme-me.cc/$1 permanent;
}
server {
    #监听443 并启用ssl
    listen       443 ssl;
    #配置服务器名称 表示响应请求这个域名
    server_name  baikal.acme-me.cc;
    #配置证书 根据实际的证书配置
    ssl_certificate /etc/nginx/private_key/server.crt;
	ssl_certificate_key /etc/nginx/private_key/private.key;

    #根路径 这里配置baikal实际存放的路径
    root  /var/www/html/baikal/html;
    #配置网站的首页 后续配置为官方内容
    index index.php;

    rewrite ^/.well-known/caldav /dav.php redirect;
    rewrite ^/.well-known/carddav /dav.php redirect;

    charset utf-8;

    location ~ /(\.ht|Core|Specific|config) {
        deny all;
        return 404;
    }

    location ~ ^(.+\.php)(.*)$ {
        try_files $fastcgi_script_name =404;
        include        /etc/nginx/fastcgi_params;
        fastcgi_split_path_info  ^(.+\.php)(.*)$;
        #这条官方的手册中是unix:/var/run/php-fpm/php-fpm.sock;实际有问题的
        #应该是unix:/var/run/php/php-fpm.sock,由于用的是php7.4的组件
        #所以我这里用的7.4
        fastcgi_pass   unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
    }
}

配置完成以后采用nginx -t命令检测一下nginx的配置是否存在问题

#nginx配置检测命令
nginx -t

当前表示nginx的相关配置不存在问题,

则可以使用nginx -s reload重启,该命令称为nginx优雅的重启

#nginx重启命令
nginx -s reload

此时就可以通过浏览器访问网站看是否进入初始化了初始化界面,如果没有报错,

使用MySQL则向下进入安装MySQL的教程,使用SQLite直接调过MySQL安装章节

 

 

配置MySQL

数据库采用MySQL则需要去官网下载,由于是Ubuntu系统,下载MySQL APT Repository

#从官网下载apt仓库,具体版本以官方实际版本为主
wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb

 

#安装mysql仓库
sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb​

安装过程中选择默认的即可

安装完成后更新源并且安装mysql

#更新源
sudo apt-get update
#安装mysql server,会一并安装默认组件
sudo apt-get install mysql-community-server -y

在安装向导中中输入root的密码然后确定

确认root密码并确定

对于弹出的提示选择继续

选择密码的加密方式,建议选择上面的这行,行的加密方式并且加密更安全;

如果数据库有和旧系统对接的可能这种方式会导致数据库连接失败,

这时候可以选择第二种老版本的加密方式,然后等待数据库安装完成

如果使用mysql作为数据库,要建立一个库,首先登录数据库

#mysql客户端参数 -u 用户名 -p密码 密码不建议直接输入放空会提示输入
#还有-u 数据库地址,默认localhost可以不输 -P 数据库端,默认3306可以不输
mysql -uroot -p

创建数据库,这里数据库名称db_baikal

#创建一个数据库 数据库名称自定义
create database db_baikal;
#创建用户并配置密码 建议新建用户 不要使用root账户,权限过高
create user baikaluser identified by 'password';
#将用于baikal的数据给新建的用户授权
grant all on db_baikal.* to baikaluser;
#使用刚刚新建的数据库
#如果首次使用在网页上选择的MySQL则不需要后续步骤
#只有当baikal初始化使用的SQLite,后续更换数据库,这种时候才需要手动初始化数据库
use db_baikal;
#初始化数据库
source /var/www/html/baikal/Core/Resources/Db/MySQL/db.sql

配置Baikal

进入设置向导,时区根据实际情况配置,email可以留空,设置管理员的密码进入下一步

如果使用SQLite,这里点击Save Changes即可;

如果使用MySQL,则勾上下面的使用MySQL的钩子并填入相关参数

host表示服务器地址,如果是本地填入localhost即可,如果是其他的填入ip地址;

默认端口3306可以省略,如果改了端口,例如3307,则写localhost:3307;

数据库名称是前面新建的填入;

用户名和密码也建议采用建立的,不建议使用root账户连接数据库

初始化完成点击开始使用

输入设置向导中设置的密码进入系统后台

下图则是默认管理视图的Dashboard。

由于现在系统中没有账户,如果需要使用,则要新建一个用户,选择用户和资源设置

添加一个用户

填入相关信息:用户名、显示名称、邮箱、密码以及确认密码

用户添加完成后,可以看到新建的用户信息

有了用户,使用该用户在网页上访问dav.php进入用户页面

可以看到这就是用户默认路径

如果要进行同步,客户端就可以使用相对应的地址进行同步了

通讯录的同步地址是https://域名/dav.php/addressbooks/用户名

https://baikal.acme-me.cc/dav.php/addressbooks/admin

日历同步地址是https://域名/dav.php/calendars/用户名

https://baikal.acme-me.cc/dav.php/calendars/admin

 

--------------------------------------------------------------------------------------------------------------------------------

更新于2022-05-03。

B站发了视频教程,可以参考一下视频教程

Pre: Vaultwarden Docker部署

Next: EwoMail安装使用

2676
Table of content