XiaBee's Studio.

Docker搭建Markdown共享编辑器

字数统计: 1.2k阅读时长: 5 min
2021/11/07

服务地址

前情提要

  • 腾讯云双十一特惠,一次买了个8M带宽、2核4G的云服务器……不拿它整点活可惜了

  • 目前的想法是搞个markdown共享编辑器、个人网盘啥的

搭建动机

主流的共享编辑器有很多,这里安利一个我个人比较喜欢的:HackmdCodimd

上述的链接需要翻墙,非常不方便,所以我想在自己的服务器里面也造一个……

前期准备

  • 一个VPS

  • 一个SSL证书(可选)

  • VPS中安装了dockerdocker-compose等服务

1
2
3
4
5
sudo apt install docker
sudo apt install docker.io
sudo apt install docker-compose
sudo service docker start
# 下载、启动docker等

部署方式

  • 官方推荐通过容器部署,这里也是介绍容器部署方式,同时添加nginx代理
  • 其他部署方式可以参考官方文档

编写yml文件

创建一个空目录,在该目录中创建docker-compose.yml

内容直接利用官方的:

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
version: "3"
services:
database:
image: postgres:11.6-alpine
environment:
- POSTGRES_USER=codimd
- POSTGRES_PASSWORD=change_password
- POSTGRES_DB=codimd
volumes:
- "database-data:/var/lib/postgresql/data"
restart: always
codimd:
image: hackmdio/hackmd:2.4.1
environment:
- CMD_DB_URL=postgres://codimd:change_password@database/codimd
- CMD_USECDN=false
depends_on:
- database
ports:
- "3000:3000"
volumes:
- upload-data:/home/hackmd/app/public/uploads
restart: always
volumes:
database-data: {}
upload-data: {}

此时通过docker-compose up -d启动容器,这个服务默认端口是3000。在浏览器输入你的域名和端口http://xxxx.xxx.xxx:3000就能看到这个编辑器了。

如果看不到的话记得检查一下云服务器厂商的防火墙关没关……

image.png

当然,这个是最基础的版本,我们可以继续优化一下。

添加Nginx代理

目录结构:

1
2
3
4
5
.
├── docker-compose.yml
└── proxy
└── conf.d
   └── hackmd.conf

docker-compose.yml中添加关于nginx相关内容,大致内容如下:

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
version: "3"
services:
database:
image: postgres:11.6-alpine
environment:
- POSTGRES_USER=codimd
- POSTGRES_PASSWORD=change_password
- POSTGRES_DB=codimd
volumes:
- "database-data:/var/lib/postgresql/data"
restart: always
codimd:
image: hackmdio/hackmd:latest
environment:
- CMD_DB_URL=postgres://codimd:change_password@database/codimd
- CMD_USECDN=false
depends_on:
- database
volumes:
- upload-data:/home/hackmd/app/public/uploads
restart: always

proxy:
image: nginx
restart: unless-stopped
expose:
- "80"
ports:
- 3000:80
# 修改端口
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d:ro
links:
- codimd:codimd
depends_on:
- codimd

volumes:
database-data: {}
upload-data: {}

同时配置hackmd.conf,作为nginx的配置文件,大致内容如下:

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
upstream @codimd {
server codimd:3000;
keepalive 300;
}

# for socket.io (http upgrade)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
server_name xxx.xxx.xx;

location / {
# set header for proxy protocol
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_pass http://@codimd;
}
}

然后再重新部署容器:

1
2
3
4
5
docker-compose down
# 删除上一个服务

docker-compose up -d
# 启动容器

此时我们的nginx代理已经开始运行了:

image.png

启用SSL(可选)

参考官方文档

注册SSL证书,并将目录放置到proxy目录中:

1
2
3
4
5
6
7
8
9
.
├── docker-compose.yml
└── proxy
├── conf.d
│   └── hackmd.conf
└── ssl_certs
├── cert.cer
├── cert.key
└── fullchain.cer

修改docker-compose.yml

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
version: "3"
services:
database:
image: postgres:11.6-alpine
environment:
- POSTGRES_USER=codimd
- POSTGRES_PASSWORD=change_password
- POSTGRES_DB=codimd
volumes:
- "database-data:/var/lib/postgresql/data"
restart: always
codimd:
image: hackmdio/hackmd:latest
environment:
- CMD_DB_URL=postgres://codimd:change_password@database/codimd
- CMD_USECDN=false
depends_on:
- database
volumes:
- upload-data:/home/hackmd/app/public/uploads
restart: always

proxy:
image: nginx
restart: unless-stopped
expose:
- "80"
ports:
- 3000:443
# 修改端口
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d:ro
- ./proxy/ssl_certs:/etc/nginx/ssl_certs:ro
links:
- codimd:codimd
depends_on:
- codimd

volumes:
database-data: {}
upload-data: {}

修改hackmd.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
# setup a upstream point to CodiMD server
upstream @codimd {
server codimd:3000;
keepalive 300;
}

# for socket.io (http upgrade)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name your.domain.name;
# enforce https
return 301 https://$server_name:443$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your.domain.name;

ssl_certificate /etc/nginx/ssl_certs/cert.cer;
ssl_certificate_key /etc/nginx/ssl_certs/cert.key;

location / {
proxy_http_version 1.1;

# set header for proxy protocol
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

# setup for image upload
client_max_body_size 8192m;

# adjust proxy buffer setting
proxy_buffers 8 32k;
proxy_buffer_size 32k;
proxy_busy_buffers_size 64k;

proxy_max_temp_file_size 8192m;

proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_pass http://@codimd;
}
}

然后重新构造容器:

1
2
3
4
5
6
7
8
docker-compose down
# 删除上一个服务

docker-compose up -d
# 部署容器

docker-compose restart
# 重启容器

此时已经可以https访问了:

image.png

一些BUG

证书相关

如果http能访问,但是https不能访问,可以检查一下证书路径是否设置正确、nginx监听端口是否正确等。多看docker-compose logs,看看具体报错

1
2
3
docker-compose logs
docker-compose logs --tail 10
docker-compose logs --tail 10 | grep proxy

代理相关

检查一下nginx的配置文件有没有写错……

之前我本人写的xxx.conf就有bug,一直登录不上

主页能访问,但是无法登陆

再次检查一下nginx的配置文件有没有写错……

如果完全不会写,可以直接抄这篇博客里面的,修改一个个人信息配置就行。

CATALOG
  1. 1. 服务地址
  2. 2. 前情提要
  3. 3. 搭建动机
  4. 4. 前期准备
  5. 5. 部署方式
    1. 5.1. 编写yml文件
    2. 5.2. 添加Nginx代理
    3. 5.3. 启用SSL(可选)
      1. 5.3.1. 注册SSL证书,并将目录放置到proxy目录中:
      2. 5.3.2. 修改docker-compose.yml:
      3. 5.3.3. 修改hackmd.conf
  6. 6. 一些BUG
    1. 6.1. 证书相关
    2. 6.2. 代理相关
    3. 6.3. 主页能访问,但是无法登陆