用自己的服务器搭建nextcloud网盘方案

背景

最近换了服务器,准备再搭建一下网盘用于以后的使用。
以前用的cloudreve,功能比较简单,由于用得少,渐渐停用了。
这次尝试了nextcloud和seafile。
这次搭建网盘花费了不少时间,因为总是不太顺利。这可能和我对docker不够熟悉有关,另外网盘的搭建教程多少有点不完善。
单单是搭建LNMP环境找合适的dockerfile和yml文件就很不容易。要找到适合自己的只能一步一步学习探索。幸运的是最后终于写出了适合自己的php8.0的dockerfile文件,并且可以正常使用。该文件也已经附在文章当中。希望对你有用。
虽然nextcloud用户比较多,但自己去搭建网盘服务的毕竟是少数。所以有很多问题找不到答案。
因此我把我的搭建过程写下来,给后来的人一些参考,少走一些弯路。不过需要说明的是,本片文章是我对探索出来可用的配置做一个记录,方便今后直接使用。内容比较简单,因此不适合新手当作教程用,因为可能会遇到其他问题不知道怎么解决。这篇文章供有一定基础的人参考,作用在于提供一个核心配置和一点思路。
seafile直接使用官方的方法搭建成功了。但是再启用https的时候又坑,虽然官方说新版本已经解决,但实际上并没有。并且官方给的解决办法不起作用。
seafile整体功能还可以,不过它会创建很多数据库,还有不少服务,再加上界面我也不太喜欢,所以就没用。
nextcloud功能很丰富,界面比较喜欢,不过用了很多方法去搭建,只有一种能完全成功的运行,并且还不确定如果让我再搭建一次还能不能成功。其他的都会有部分功能不正常。已经查明的原因有:

  1. 权限设置不符合程序要求,
  2. nginx配置设置不完善。
    还有些也不知道具体原因,感觉程序日志不完善。
    下面是我安装nextcloud安装方式中的两种方案,一个是使用官方的应用镜像,一个是自己搭好LNMP环境用单文件脚本装的。
    两种方式都是用到docker-compose工具。
    第一种方案所有功能可以正常使用,但是不确定是否可以复现。
    第二种方案基本功能可以正常使用,但是有写功能不能正常加载,目前不清楚原因。

利用官方镜像安装

docker-compose使用的yml文件:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-config:/etc/mysql
      - mysql-log:/var/log/mysql
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
      # sort_buffer_size : 524288 #220920add no use
  cache:
    image: redis
    restart: unless-stopped
    expose:
     - "6379"
    volumes:
     - ./cache:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令
  app:
    image: nextcloud:fpm
    restart: unless-stopped
    expose:
     - "9000"
    volumes:
     - ./app/html:/var/www/html
     - ./app/data:/var/www/html/data
     - ./app/config:/var/www/html/config
     - ./app/custom_apps:/var/www/html/custom_apps
    links:
    # links将容器与当前容器链接起来,以使得当前容器可以访问目标容器expose的端口
    # 格式为 容器的原名:映射到当前容器中的名称
     - mysql:mysql
     - cache:cache
    depends_on:
    # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
     - mysql
     - cache
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      #- "php:php"
      - app:app
    volumes:
      - nginx-config:/etc/nginx
      - nginx-log:/var/log/nginx
      - nginx-html:/usr/share/nginx/html    
      - ./app/html:/var/www/html
      - ./proxy/conf.d:/etc/nginx/conf.d:ro
      - ./proxy/ssl_certs:/etc/nginx/ssl_certs:ro
    depends_on:
     - app
volumes:
  mysql-config:
  mysql-log:
  mysql-data:
  nginx-html:
  php-config:
  nginx-config:
  nginx-log:

搭建LNMP环境后再安装Nextcloud

搭建LNMP环境使用的yml:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /home/mysql-config:/etc/mysql
      - /home/mysql-log:/var/log/mysql
      - /home/mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
  php:
    hostname: php
    restart: always
    image: php:8.0
    container_name: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - "9000:9000"
    links:
      - mysql:mysql
    volumes:
      - /home/nginx-html:/var/www/html
      - /home/php-workspace:/workspace
      - /home/php-config:/usr/local/etc
    depends_on:
        # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
        - mysql
        - redis      
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      - "php:php"
    volumes:
      - /home/nginx-config:/etc/nginx
      - /home/nginx-log:/var/log/nginx
      - /home/nginx-html:/usr/share/nginx/html
      # - /home/nginx-config/conf.d:/etc/nginx/conf.d:ro
      # - /home/nginx-config/ssl_certs:/etc/nginx/ssl_certs:ro      
    depends_on:
     - php
  redis:
    image: redis
    restart: unless-stopped
    expose:
      - "6379"
    volumes:
      - /home/redis:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令

php的dockerfile:
此文件放入上面yml文件的同级目录的php文件夹下。


FROM php:8.0-fpm
#docker中php扩展安装方式
#1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装
#2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展
#3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装
#redis扩展 仓库地址 https://pecl.php.net/package/redis
ENV PHPREDIS_VERSION 5.3.4
#memcached扩展 仓库地址 https://pecl.php.net/package/memcached
ENV MEMCACHED_VERSION 3.1.5
#mongodb扩展 https://pecl.php.net/package/mongodb
ENV MONGODB_VERSION 1.11.1
# 设置时间
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' <!--autointro-->

误删docker映射文件夹

使用lsof命令查看已经被删除的dc1目录

lsof | grep dc1

报了很多如下错误
lsof: no pwd entry for UID 201
加上-w参数

[root@host dc1]# lsof -w | grep dc1
rsyslogd      958                               root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958                               root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     967 in:imjour             root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     967 in:imjour             root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     973 rs:main               root  mem       REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
rsyslogd      958     973 rs:main               root   13r      REG              253,1   8388608   19328181 /var/log/journal/20200914151302543507749550121287/system@648eeedc1a184078a509085b963bf9c5-0000000000000001-0005eb62d7d08cb7.journal
bash      1513232                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153 1515352 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1515153 1515353 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112 1518233 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1518112 1518234 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311 1525413 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
docker-co 1525311 1525415 docker-co             root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
lsof      1537283                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
grep      1537284                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)
lsof      1537285                               root  cwd       DIR              253,1         6    6274715 /var/lib/docker/volumes/dc1 (deleted)

[root@host dc1]# cd /proc/1513232/fd
[root@host fd]# ll
total 0
lrwx------ 1 root root 64 Dec  3 15:35 0 -<!--autointro-->

基于docker搭建kodcloud与“Mixed Content”问题解决

221021

布置好后直接用https访问,但一直卡在环境检查部分

按下F2才发现有很多错误
其中一个错误很关键

Mixed Content: The page at 'https://cloud.weiyoun.com/' was loaded over HTTPS, but requested an insecure stylesheet 'http://kodcloud/static/style/dist/main.css'. This request has been blocked; the content must be served over HTTPS.

很明显这是在https条件下访问了http的css资源所以被阻止了。
为了顺利安装,我把防火墙的1111端口开放然后用http访问进入正常的界面。

然后修改配置文件`config/config.php
将【大概在95行代码】:

if(!defined('HOST')){ define('HOST',rtrim(get_host(),'/').'/');} 修改为: if(!defined(‘HOST’)){ define(‘HOST’,’https://你的域名/‘);}
后https可以正常访问了。
![[Pasted image 20221021144104.png]]

整体感觉kodbox这款网盘不错,功能比较丰富,同时速度很快并且资源占用少,搭建问题也少。

搭建使用traefik

1. 创建文件夹和文件

mkdir ~/traefik
cd ~/traefik
mkdir -p data/configurations
touch docker-compose.yml
touch data/traefik.yml
touch data/acme.json
touch data/configurations/dynamic.yml
chmod 600 data/acme.json

2. 配置 docker-compose.yml

文件路径为 ~/traefik/docker-compose.yml

version: '3.7'
services:
traefik:
image: traefik:v2.4
container_name: traefik
restart: always
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
# 如果宿主机是标准 linux 系统,可以设置一下localtime
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro # 映射静态配置文件
- ./data/acme.json:/acme.json # 映射证书文件,SSL 证书申请成功后,就会存在这个文件中
- ./data/configurations:/configurations # 映射动态配置文件
networks:
- traefik
labels:
# 下面这些标签,可以帮助 traefik 正确处理该服务
- 'traefik.enable=true'
- 'traefik.docker.network=traefik' # 指定 docker network
# 指定服务入口为 websecure,websecure 会在静态配置文件traefik.yml中定义
- 'traefik.http.routers.traefik-secure.entrypoints=websecure'
# 定义访问域名,需要做 DNS 解析
- 'traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain.com`)'
- 'traefik.http.routers.traefik-secure.middlewares=user-auth@file'
- 'traefik.http.routers.traefik-secure.service=api@internal'
networks:
traefik:
external: true

创建 docker-compose.yml 内需要的 network

docker network create traefik

3. 修改静态配置文件

文件路径为 ~/traefik/data/traefik.yml

api:
  dashboard: true
entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure
  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
        - nofloc@file
      tls:
        certResolver: lets-encr
pilot:
  dashboard: false
providers:
  docker:
    endpoint: 'unix:///var/run/docker.sock'
    exposedByDefault: false
  file:
    filename: /configurations/dynamic.yml # 动态配置文件位置
certificatesResolvers:
  lets-encr:
    acme:
      #caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      storage: acme.json
      email: xxxxxx
      httpChallenge:
        entryPoint: web

4. 修改动态配置文件

文件路径为 ~/traefik/data/configurations/dynamic.yml

# Dynamic configuration
http:
middlewares:
nofloc:
headers:
customResponseHeaders:
Permissions-Policy: 'interest-cohort=()'
secureHeaders:
headers:
sslRedirect: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
# UserName : admin
# Password : qwer1234
user-auth:
basicAuth:
# users 选项是认证用户的列表
# 使用 echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
# 来创建 user:password 键值对
users:
- 'admin:$apr1$tm53ra6x$FntXd6jcvxYM/YH0P2hcc1'
tls:
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12

5. 解析域名

在 docker-compose.yml 中,我们指定了使用 traefik.yourdomain.com 作为访问域名。因此,我们需要将 traefik.yourdomain.com 解析至 traefik 服务入口 IP 地址。

frp点对点内网穿透

点对点内网穿透

这个示例将会演示一种不通过服务器中转流量的方式来访问内网服务。

frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

  1. frps.ini 内容如下,需要额外配置监听一个 UDP 端口用于支持该类型的客户端:

    [common]
    bind_port = 7000
    bind_udp_port = 7000
  2. 在需要暴露到外网的机器上部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh]
    type = xtcp
    # 只有 sk 一致的用户才能访问到此服务
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22
  3. 在想要访问内网服务的机器上也部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh_visitor]
    type = xtcp
    # xtcp 的访问者
    role = visitor
    # 要访问的 xtcp 代理的名字
    server_name = p2p_ssh
    sk = abcdefg
    # 绑定本地端口用于访问 ssh 服务
    bind_addr = 127.0.0.1
    bind_port = 6000
  4. 通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@127.0.0.1

windows docker安装frpc

windows-docker安装frpc

新建`\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2\frpc-docker-compose.yml
内容如下:

version: "3.7"
services:
  frpc:
    image: snowdreamtech/frpc
    container_name: frpc
    hostname: frpc
    ports:
    #   - "7500:7500"
    #   # - 7400:7400
      - 7000:7000
    #   - 8888:8888
    volumes:
      - frpc:/etc/frp
volumes:
  frpc:

新建`\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2_frpc_data\frpc.ini
写入

[common]
# server_addr = 127.0.0.1
server_addr = 服务器ip或域名
server_port = 7000
# 认证token,客户端需要和此对应
token=1267823123 #与服务器一致
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

运行


(base) PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2<!--autointro-->

windows安装docker

安装WSL

先安装WSL,管理员运行`wsl –install

(base) PS C:\Users\weiyo> wsl --install
正在安装: 虚拟机平台
已安装 虚拟机平台。
正在安装: 适用于 Linux 的 Windows 子系统
已安装 适用于 Linux 的 Windows 子系统。
正在下载: WSL 内核
正在安装: WSL 内核
已安装 WSL 内核。
正在下载: GUI 应用支持
[======                    10.6%                           ]

(base) PS C:\Users\weiyo<!--autointro-->

docker因为无法创建文件夹映射导致启动失败解决

[root@iZ8vbajg9wo8iwynfb1lgeZ dc_wagtail]# docker-compose up
Creating wagtail ... error
ERROR: for wagtail  Cannot create container for service wagtail: open /var/lib/docker/volumes/dc_wagtail_wagtailpython/_data: no such file or directory
ERROR: for wagtail  Cannot create container for service wagtail: open /var/lib/docker/volumes/dc_wagtail_wagtailpython/_data: no such file or directory
ERROR: Encountered errors while bringing up the project.

对于我来说出现这种错误一般是因为测试过程中第一次生成了映射文件夹,但是第二次测试前给它改名字了,想让容器重新生成,但结果是容器无法从新生成。
又发现虽然自己把主机实际文件夹名称改了,但是docker内部volume记录名称仍然存在,这就导致找不到该文件夹了。
使用
docker volume ls列出映射的文件夹
使用
`docker volume rm

Compose常用命令

Compose常用命令

Compose常用命令
docker-compose -h                           # 查看帮助
docker-compose up                           # 启动所有docker-compose服务
docker-compose up -d                        # 启动所有docker-compose服务并后台运行
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id         # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                      		# 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     		# 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     	# 查看容器输出日志
docker-compose config     					# 检查配置
docker-compose config -q  					# 检查配置,有问题才有输出
docker-compose restart   					# 重启服务
docker-compose start     					# 启动服务
docker-compose stop      					# 停止服务

docker查看所有镜像:

docker images

docker删除所有镜像:

#删除tag为none的镜像
docker image prune
#删除指定ID的镜像
docker rmi ed9c93747fe1
#删除全部镜像
docker rmi -f $(docker images -qa)

docker关闭、删除所有容器:

docker stop $(docker ps -a -q)
docker rm $(docker ps -aq)

docker-compose命令使用

docker-compose -f docker-compose-org3.yaml up -d

重新启动docker服务

service docker restart

进入docker容器

docker exec -it [CONTAINERID] /bin/bash

查看docker运行中项目日志

docker logs -f  容器ID
docker logs -f -t --tail 100 容器ID

查看docker-compose运行日志

docker-compose  logs -f
#or
docker-compose  logs

docker 启动配置文件路径

vim /lib/systemd/system/docker.service

进入docker容器内

docker exec -it 89693c83bae9 /bin/bash

注意:如果报错OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused “exec: “/bin/bash”: stat /bin/bash: no such file or directory”: unknown使用如下命令:

docker exec -it 1e33b26152e1 bash #or docker exec -it 1e33b26152e1 sh<!–autointro–>

centos8 安装docker

最近换了服务器,安装了最新的centos8。为了方便使用,避免各种环境相互干扰,准备使用docker来搭建自己的各种应用。记录安装docker的过程如下。

  1. 查看是否已经安装docker的某些版本
    yum repolist

如有,则移除:

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  1. 安装需求工具:
    
    sudo yum install -y yum-utils

$ sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo


遇到报错:

Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist


修改了```/etc/yum.repos.d/CentOS-epel.repo```文件:
将```failovermethod=priority```注释掉,变成如下:

[epel]
name=Extra Packages for Enterprise Linux 8 – $basearch
baseurl=http://mirrors.cloud.aliyuncs.com/epel/8/Everything/$basearch

220913comment

failovermethod=priority

enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8


修改后重新运行命令,成功后进行下一步。
3. 安装docker

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin


这一步会让确认是否下载,核对指纹。确认即可。

Importing GPG key 0x621E9F35:
Userid : "Docker Release (CE rpm) docker@docker.com