一直使用ShareLaTex的在线服务帮助老表写硕士论文,但是最近被墙的很厉害,比较苦恼. 权衡之下决定自己的服务器上部署一套,一劳永逸.
过程还是比较繁琐, 有几个坑在这里记录一下.
安装
参考:
https://github.com/sharelatex/sharelatex/wiki/Quick-Start-Guide
ShareLaTex使用docker方式做Distrabution,因此需要先配置好docker服务.
关于docker服务的安装和使用参考下面链接.
https://github.com/docker/docker-tutorial
笔者的Host是使用archlinux, 安装docker,并且配置成自动启动:
$ sudo pacman -Syu docker
$ sudo systemctl enable docker
$ sudo systemctl restart docker
接下来使用docker直接下载ShareLaTex的image.
$ sudo docker run -d \
-v ~/sharelatex_data:/var/lib/sharelatex \
-p 5000:80 \
--name=sharelatex \
sharelatex/sharelatex
默认的ShareLaTex只有最基本的包. 编译器只有pdfLaTex可用. 如果使用中文需要安装XeLaTex.
使用如下命令安装完整的TexLive
$ sudo docker exec sharelatex tlmgr option repository http://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet
$ sudo docker exec sharelatex tlmgr install scheme-full
官方的源非常慢, 这里使用中科大的源, 阿里的也很快,地址:
http://mirrors.aliyun.com/CTAN/systems/texlive/tlnet/
耐心等待下载安装完毕.
配置
如果按照官方指南里现在就创建好用户名和密码然后满心期待打开浏览器, 多半会失望的.
ShareLaTex的docker image默认的配置是需要Host机上的mongodb及redis服务.
如果没有安装, ShareLaTex服务是无法启动的.
需要安装:
$ sudo pacman -Syu redis mongodb
修改redis配置文件 /etc/redis.conf:
bind 0.0.0.0
protected-mode yes
修改mongodb配置文件
bind_ip = 0.0.0.0
注意, 如果服务器在公网上一定要在iptables里把27017访问关掉.
当然, 也可以使用密码保护mongodb和redis服务, 但是必须去配置Docker ShareLaTex的环境变量:
SHARELATEX_MONGO_URL: The URL of the Mongo database to use
SHARELATEX_REDIS_HOST: The host name of the Redis instance to use
SHARELATEX_REDIS_PORT: The port of the Redis instance to use
SHARELATEX_REDIS_PASS: The password to use when connecting to Redis (if applicable)
为了简单,这里不配置用户名和密码.
配置完毕,重启redis和mongodb服务:
$ sudo systemctl restart redis
$ sudo systemctl restart mongodb
到这里, ShareLaTex服务应该ready to go了.
执行
$ sudo docker restart sharelatex
重启sharelatex服务, 等待几秒钟时间后访问http://localhost:5000, 如果一切顺利,应该可以看到sharelatex首页了.
最后, 为ShareLaTex配置管理员用户:
访问 http://localhost:5000/launchpad
按照提示创建admin用户.
中文配置
ShareLatex 的docker img里默认是没有安装xfont及中文字体的, 导致就算安装了XeLaTex也无法渲染中文pdf. 这里必须安装所需的中文字体.
首选, 需要登录到ShareLatex的container的shell中.
执行:
[root@toptrade docker]# sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
062edc2d6e56 sharelatex/sharelatex "/sbin/my_init" 13 days ago Up About an hour 0.0.0.0:5000->80/tcp sharelatex
可以看到sharelatex 的container ID是 062edc2d6e56 .
再执行:
[root@toptrade docker]# sudo docker inspect -f {{.State.Pid}} 062edc2d6e56
2323
看到pid是2323, 最后使用这个id:
[root@toptrade docker]# sudo nsenter --target 2323 --mount --uts --ipc --net --pid
groups: cannot find name for group ID 19
root@062edc2d6e56:/#
现在已经使用root登录到了sharelatex 的shell了.
sharelatex container本身是debian based. 所以可以使用apt-get来安装xfont工具.
为了简单, 我们直接安装wqy字体, 让apt-get来安装所有依赖包:
root@062edc2d6e56:/# apt-cache search wqy
root@062edc2d6e56:/# apt-get install xfonts-wqy
最后, 安装windows字体:
拷贝win7中 C:\windows\fonts目录到host中. 打包成winfonts.tar.gz
在host的shell下执行, 将字体包拷贝到container中:
$ docker cp winfonts.tar.gz sharelatex:/root
然后切换到ShareLatex container中将winfonts.tar.gz解压, 并且拷贝到/usr/share/fonts/winfonts目录.
例如:
root@062edc2d6e56:/# cd ~
root@062edc2d6e56:/# tar zxvf winfonts.tar.gz
root@062edc2d6e56:/# mv winfonts /usr/share/fonts/
然后:
root@062edc2d6e56:/# cd /usr/share/fonts/winfonts
root@062edc2d6e56:/# mkfontscale
root@062edc2d6e56:/# mkfontdir
root@062edc2d6e56:/# fc-cache -fv
最后确认一下中文字体安装成功:
root@062edc2d6e56:/# fc-list :lang=zh-cn
测试
创建一个文档, 粘贴进去如下内容
\documentclass{ctexart}
\setCJKmainfont{Microsoft YaHei}
\setCJKsansfont{Microsoft YaHei}
\setCJKmonofont{SimSun}
\punctstyle{kaiming}
\begin{document}
\tableofcontents
\begin{abstract}
这是在文件的开头的介绍文字.本文的主要话题的简短说明。.
\end{abstract}
\section{ 前言 }
在该第一部分中的一些额外的元素可以被添加。巴贝尔包将采取的翻译服务.
\section{关于数学部分}
在本节中的一些数学会使用数学模型含中文字符显示。,
這是一個傳統的中國文字\end{document}