辣鸡 php, 慢的要死

前言

搭建一个的私有网盘是一个强迫症该干的事, 之前一直在有 nextcloud, 因为没有找到其他成熟的开源相关项目, 用了一阵发现上传几张图片, 分享给别人开的时候, 速度非常慢甚至导致 cpu 一直飙升, 后来基本就不怎么用了.

最近在搜索有没有 golang 写的网盘项目时, 无意间看到cozy-drive这个开源项目, 这是一个 node 写的app, 但是最近他们改用 golang 重写了服务代码

地址在这里: https://github.com/cozy/cozy-stack

稍微看了下文档, 虽然比不上 nextcloud 功能多样, 但是需要的基本功能基本都有(只想传一下文件分享给别人看), 还有一些基于oauth认证做的一些第三方应用, 最重要的是基于 golang 开发的,相比 php 还是更快更稳定的, 未来很有潜力

此开源项目不支持中文语言, 不过官方组织了大家一起翻译, 之后应该会支持的.

翻译地址: https://www.transifex.com/cozy/cozy-authentication/

配置安装

这项目折腾了我一上午才搞定, 主要卡在证书上, 这个稍后再说

老规矩, 基于docker安装, 方便易用

 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
version: "3"
services:
  couchdb:
    image: couchdb
    container_name: couchdb
    expose:
      - "5984"
    volumes:
      - ./couchdb-data:/opt/couchdb/data #数据挂载到宿主机
    networks:
      - web
    restart: always
  cozy:
    image: moritzheiber/cozy-stack
    container_name: cozy
    volumes:
      - ./cozy-storage:/cozy/storage #数据挂载到宿主机
      - ./cozy.yml:/cozy/.cozy/cozy.yml
    networks:
      - web
    links:
      - couchdb:couchdb #依赖couchdb服务
    depends_on:
      - couchdb
    restart: always
    expose:
      - "8080"
    command: cozy-stack serve --allow-root --config /cozy/.cozy/cozy.yml

networks:
  web:
    external: true

cozy 使用的是couchdb作为数据库, 在 docker 配置任何数据库时, 都要把数据卷挂载在宿主机, 不然一旦重新构建容器, 数据就都没了, 保证容器是无状态的.

我的cozy.yml 配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
host: 0.0.0.0
port: 8080

subdomains: nested

admin:
  host: localhost
  port: 6060

registries:
  default:
    - https://apps-registry.cozycloud.cc/

fs:
  url: file://localhost/cozy/storage

couchdb:
  url: http://couchdb:5984/


log:
  level: info
  syslog: false

各种配置项的意思还是去看官方例子吧 :https://github.com/cozy/cozy-stack/blob/master/cozy.example.yaml

一切搞好之后,docker-compose up -d启动即可.

一般情况下到这里就结束了, 不过上面的配置只是创建了cozy-stack服务, 需要新建一个实例才算完成.

首先进入cozy-stack服务的容器

1
docker exec -it cozy sh

执行创建实例命令, 参数自行替换

1
cozy-stack instances add --apps home,drive,phtots,settings,store --passphrase 你的密码 "你的域名(不能是ip)"

稍微等待一会, 提示创建完成后, 访问你的域名然后输入你刚才设置的密码就搞定了

后记

创建实例之后, 发现服务全部是home.example.com这种子域名的形式,你在创建实例的时候安装了多少 app 就有多少个子域名, 我用的 traefik 作为网关的,申请Let's Encrypt 的泛域名只能域名商支持 dns 解析才行

最后去研究traefik文档, 曲线救国给每个子域名都申请了证书

配置HostRegexp 正则去匹配域名到指定服务

1
HostRegexp:{subdomain:.+}.example.com