关于seafile12+seadoc1.0的,不能编辑的问题

因为用官方的.env文件安装总是不成功,seafile的docker每次都有问题,总是不能访问,没有办法我用portainer自己一个容器一个容器的输入变量,然后用nginx proxy manage做了反代,现在创建资料库,同步资料库,创建seadoc文件也没有问题,创建资料库也没有问题,但是一打开seadoc文件之后就会显示 “服务器断开连接。正在重新连接...”,说一下我的情况
我的nginx proxy manage访问地址是https://xxx.zzz.top:2493,是把nginx proxy manage的容器内部4443端口映射到2493端口,我的seadoc的访问地址是https://seadoc.zzz.top:2493,我在seafile里面设置的SEADOC_SERVER_URL变量地址是https://seadoc.zzz.top:2493/sdoc-server。
新建seadoc文件可以,点击可以打开,但是打开之后就变成了 “服务器断开连接。正在重新连接...”,没有办法编辑,不知道什么情况,于是我把https://seadoc.zzz.top:2493/sdoc-server/,
复制到浏览器直接打开,显示 Welcome to sdoc-server. The current version is 1.0.3,如果复制网址https://seadoc.zzz.top:4443/sdoc-server,把后面的 / 去掉就是不能打开,然后浏览器地址栏网址会变成,https://seadoc.zzz.top:4443/sdoc-server/,端口变了,变成了nginx proxy manage容器的内部端口,所以我估计是每次打开是是原来的端口,但是打开之后不知道怎么就把端口跳转了,所以造成打开之后就不能编辑,一直是服务器断开了,请问这是什么原因造成了,应该怎么解决

为避免跨域请求问题,被Seafile集成的Seadoc没有自己的域名和端口;Seadoc必须使用Seafile的域名和端口再加Seadoc路径去访问。

要重点检查Seafile 内置 Nginx 中 sdoc 访问的日志,通过日志来定位这个信息。

上面的描述看起来有点乱,从错误的描述看应该是实际访问的 URL 和容器内 Nginx 接收到的 URL 不一致导致的。

要确保 访问的 URL、环境设置的URL(含 yml 文件)和 Seafile 内置的 Nginx 接收到的 URL 保持一致

我在文件夹里面Nginx的日志里面也没有找到相关的信息,请问日志看哪个文件,是看、seafile-data/logs/var-log/nginx里面的文件吗?我在这个里面所有的日志文件都看了,也没有看到有关seadcoc的错误信息

用官方的candy代理访问是这样的,但是我用官方的env文件安装不成功,死活无法访问,没有办法只能自己一个容器一个容器的在网页界面下配置之后可以访问,自己用的Nginx proxy manage做的反代,这个我就不知道怎么让seadoc用seafile的域名+端口在添加seadoc的路径去访问了

Nginx 的 log 中应该有 seadoc.access.log 这个日志文件,如果没有需要检查 seafile 容器中 nginx/conf/seafile.nginx.conf 关于 seadoc 的配置内容。可以参考以下的对照

location /sdoc-server/ {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
            return 204;
        }
        proxy_pass         http://seadoc:80/;
        proxy_redirect     off;
        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-Host  $server_name;
        proxy_set_header   X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
        access_log      /var/log/nginx/seadoc.access.log seafileformat;
        error_log       /var/log/nginx/seadoc.error.log;
    }

    location /socket.io {
        proxy_pass http://seadoc:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_redirect off;
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }

更详细的可以参考 docker-seafile-12.06 - 虚拟的现实 - 虚拟的现实

我也弄了很久,现在sdoc能用了,但知识库还是不能用。
我是docker桌面版本,你参考一下我的配置:
这是在内网中的容器,映射seafile的180端口出来,
然后外网上还有一个nginx服务器反向代理180端口。

env配置

COMPOSE_FILE='seafile-server.yml,seadoc.yml'
COMPOSE_PATH_SEPARATOR=','


SEAFILE_IMAGE=docker.seafile.top/seafileltd/seafile-pro-mc:12.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_MEMCACHED_IMAGE=memcached:1.6.29
SEAFILE_ELASTICSEARCH_IMAGE=elasticsearch:8.15.0
#SEAFILE_CADDY_IMAGE=lucaslorentz/caddy-docker-proxy:2.9

SEAFILE_VOLUME=/D/docker/seafile/seafile-data
SEAFILE_MYSQL_VOLUME=/D/docker/seafile/seafile-mysql/db
SEAFILE_ELASTICSEARCH_VOLUME=/D/docker/seafile/seafile-elasticsearch/data
#SEAFILE_CADDY_VOLUME=/D/docker/seafile/seafile-caddy

SEAFILE_MYSQL_DB_HOST=db
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=88888888
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=88888888
SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db

TIME_ZONE=Asia/Shanghai

JWT_PRIVATE_KEY=IG1R4XNNsA5KfuHykKZtxq2H8h94NOgx1Zp60Muf

SEAFILE_SERVER_HOSTNAME=doc.8888.com
SEAFILE_SERVER_PROTOCOL=https

INIT_SEAFILE_ADMIN_EMAIL=8888@gmail.com
INIT_SEAFILE_ADMIN_PASSWORD=asecret
INIT_S3_STORAGE_BACKEND_CONFIG=false
INIT_S3_COMMIT_BUCKET=<your-commit-objects>
INIT_S3_FS_BUCKET=<your-fs-objects>
INIT_S3_BLOCK_BUCKET=<your-block-objects>
INIT_S3_KEY_ID=<your-key-id>
INIT_S3_SECRET_KEY=<your-secret-key>
INIT_S3_USE_V4_SIGNATURE=true
INIT_S3_AWS_REGION=us-east-1
INIT_S3_HOST=s3.us-east-1.amazonaws.com
INIT_S3_USE_HTTPS=true

CollaboraOffice_IMAGE=collabora/code:latest
Collabora_VOLUME=/D/docker/seafile/collabora

ENABLE_SEADOC=true
SEADOC_IMAGE=docker.seafile.top/seafileltd/sdoc-server:1.0-latest
SEADOC_SERVER_URL=https://doc.8888.com/sdoc-server
SEADOC_SERVER_LETSENCRYPT=true
SEADOC_MYSQL_DB_NAME=seahub_db
SEADOC_VOLUME=/D/docker/seafile/seadoc-data

NOTIFICATION_SERVER_IMAGE=seafileltd/notification-server:12.0-latest
NOTIFICATION_SERVER_VOLUME=/D/docker/seafile/notification-data

seafile容器中的nginx配置

# -*- mode: nginx -*-
# Auto generated at 12/20/2024 17:16:33
server {
listen 80;
server_name doc.8888.com;

    client_max_body_size 10m;

    location / {
        proxy_pass http://127.0.0.1:8000/;
        proxy_read_timeout 310s;
        proxy_set_header Host $host;
        proxy_set_header Forwarded "for=$remote_addr;proto=$scheme";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Connection "";
        proxy_http_version 1.1;

        client_max_body_size 0;
        access_log      /var/log/nginx/seahub.access.log seafileformat;
        error_log       /var/log/nginx/seahub.error.log;
    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 0;
        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_request_buffering off;

        access_log      /var/log/nginx/seafhttp.access.log seafileformat;
        error_log       /var/log/nginx/seafhttp.error.log;
    }

    location /notification/ping {
        proxy_pass http://127.0.0.1:8083/ping;
        access_log      /var/log/nginx/notification.access.log seafileformat;
        error_log       /var/log/nginx/notification.error.log;
    }

    location /notification {
        proxy_pass http://127.0.0.1:8083/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        access_log      /var/log/nginx/notification.access.log seafileformat;
        error_log       /var/log/nginx/notification.error.log;
    }

    location /webdav {
        rewrite ^/webdav$ /webdav/ permanent;
    }
    location /webdav/ {
        proxy_pass         http://127.0.0.1:8080/webdav/;
        proxy_set_header   Host $host;
		#proxy_set_header   X-Forwarded-Proto https;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_read_timeout  1200s;
        client_max_body_size 0;

        access_log      /var/log/nginx/seafdav.access.log seafileformat;
        error_log       /var/log/nginx/seafdav.error.log;
    }
    location /:dir_browser {
        # Logo of WebDAV
        proxy_pass         http://127.0.0.1:8080/:dir_browser;
    }

    location /media {
        root /opt/seafile/seafile-server-latest/seahub;
    }


	location /sdoc-server/ {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
            return 204;
        }
        proxy_pass         http://sdoc-server:7070/;
        proxy_redirect     off;
        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-Host  $server_name;
        proxy_set_header   X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
		
		access_log      /var/log/nginx/sdoc-server.access.log;
        error_log       /var/log/nginx/sdoc-server.error.log;
    }
    location /socket.io {
        proxy_pass http://sdoc-server:7070;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_redirect off;
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
		
		access_log      /var/log/nginx/socket-io.access.log;
        error_log       /var/log/nginx/socket-io.error.log;
    }
	location /seadoc-converter {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
            return 204;
        }

        proxy_pass         http://sdoc-server:8888;
        proxy_redirect     off;
        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-Host  $server_name;
        proxy_set_header   X-Forwarded-Proto $scheme;

        client_max_body_size 100m;

        access_log      /var/log/nginx/seadoc-converter.access.log;
        error_log       /var/log/nginx/seadoc-converter.error.log;
    }

}

seafile-server.yml配置:

services:
  db:
    image: ${SEAFILE_DB_IMAGE:-mariadb:10.11}
    container_name: seafile-mysql
    restart: always
    ports:
      - "33306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:?Variable is not set or empty}
      - MYSQL_LOG_CONSOLE=true
      - MARIADB_AUTO_UPGRADE=1
    volumes:
      - "${SEAFILE_MYSQL_VOLUME:-/opt/seafile-mysql/db}:/var/lib/mysql"
    networks:
      - seafile-net
    healthcheck:
      test:
        [
          "CMD",
          "/usr/local/bin/healthcheck.sh",
          "--connect",
          "--mariadbupgrade",
          "--innodb_initialized",
        ]
      interval: 20s
      start_period: 30s
      timeout: 5s
      retries: 10

  memcached:
    image: ${SEAFILE_MEMCACHED_IMAGE:-memcached:1.6.29}
    container_name: seafile-memcached
    restart: always
    entrypoint: memcached -m 256
    networks:
      - seafile-net

  elasticsearch:
    image: ${SEAFILE_ELASTICSEARCH_IMAGE:-elasticsearch:8.15.0}
    container_name: seafile-elasticsearch
    restart: always
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - "xpack.security.enabled=false"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 4g
    volumes:
      - "${SEAFILE_ELASTICSEARCH_VOLUME:-/opt/seafile-elasticsearch/data}:/usr/share/elasticsearch/data"
    networks:
      - seafile-net

  seafile:
    image: ${SEAFILE_IMAGE:-seafileltd/seafile-pro-mc:12.0-latest}
    container_name: seafile
    restart: always
    ports:
      - "180:80"
    volumes:
      - ${SEAFILE_VOLUME:-/opt/seafile-data}:/shared
    environment:
      - DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}
      - DB_PORT=${SEAFILE_MYSQL_DB_PORT:-3306}
      - DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}
      - DB_ROOT_PASSWD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-}
      - DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}
      - SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db}
      - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db}
      - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}
      - TIME_ZONE=${TIME_ZONE:-Etc/UTC}
      - INIT_SEAFILE_ADMIN_EMAIL=${INIT_SEAFILE_ADMIN_EMAIL:-me@example.com}
      - INIT_SEAFILE_ADMIN_PASSWORD=${INIT_SEAFILE_ADMIN_PASSWORD:-asecret}
      - SEAFILE_SERVER_HOSTNAME=${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
      - SEAFILE_SERVER_PROTOCOL=${SEAFILE_SERVER_PROTOCOL:-http}
      - SITE_ROOT=${SITE_ROOT:-/}
      - NON_ROOT=${NON_ROOT:-false}
      - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
      - SEAFILE_LOG_TO_STDOUT=${SEAFILE_LOG_TO_STDOUT:-false}
      - ENABLE_SEADOC=${ENABLE_SEADOC:-false}
      - SEADOC_SERVER_URL=${SEADOC_SERVER_URL:-http://example.example.com/sdoc-server}
      - INIT_S3_STORAGE_BACKEND_CONFIG=${INIT_S3_STORAGE_BACKEND_CONFIG:-false}
      - INIT_S3_COMMIT_BUCKET=${INIT_S3_COMMIT_BUCKET:-}
      - INIT_S3_FS_BUCKET=${INIT_S3_FS_BUCKET:-}
      - INIT_S3_BLOCK_BUCKET=${INIT_S3_BLOCK_BUCKET:-}
      - INIT_S3_KEY_ID=${INIT_S3_KEY_ID:-}
      - INIT_S3_SECRET_KEY=${INIT_S3_SECRET_KEY:-}
      - INIT_S3_USE_V4_SIGNATURE=${INIT_S3_USE_V4_SIGNATURE:-true}
      - INIT_S3_AWS_REGION=${INIT_S3_AWS_REGION:-us-east-1}
      - INIT_S3_HOST=${INIT_S3_HOST:-us-east-1}
      - INIT_S3_USE_HTTPS=${INIT_S3_USE_HTTPS:-true}
    labels:
      #caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
      #caddy.reverse_proxy: "{{upstreams 80}}"
      com.centurylinklabs.watchtower.enable: 'true' # keep the up to date
    depends_on:
      - db
      - memcached
      - elasticsearch
    networks:
      - seafile-net
 
  collabora:
    image: ${CollaboraOffice_IMAGE:-collabora/code:latest}
    container_name: seafile-collabora
    environment:
      - domain=doc\\\.8888\\\.com
      - username=rainsun
      - password=Ogj8U0AOd8Er62mP
    ports:
      - "9980:9980"
    restart: always
    volumes:
      - ${Collabora_VOLUME:-/D/docker/seafile/collabora}:/etc/onlyoffice/documentserver
    cap_add:
      - MKNOD 
    networks:
      - seafile-net
    labels:
      com.centurylinklabs.watchtower.enable: 'true' # keep the up to date

networks:
  seafile-net:
    name: seafile-net

seadoc.yml配置:

services:
  seadoc:
    image: ${SEADOC_IMAGE:-seafileltd/sdoc-server:1.0-latest}
    container_name: sdoc-server
    volumes:
      - ${SEADOC_VOLUME:-/opt/seadoc-data/}:/shared
    # ports:
    #   - "80:80"
    environment:
      - DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}
      - DB_PORT=${SEAFILE_MYSQL_DB_PORT:-3306}
      - DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}
      - DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}
      - DB_NAME=${SEADOC_MYSQL_DB_NAME:-seahub_db}
      - TIME_ZONE=${TIME_ZONE:-Etc/UTC}
      - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
      - NON_ROOT=${NON_ROOT:-false}
      - SEAHUB_SERVICE_URL=${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
    labels:
      #caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
      #caddy.@ws.0_header: "Connection *Upgrade*"
      #caddy.@ws.1_header: "Upgrade websocket"
      #caddy.0_reverse_proxy: "@ws {{upstreams 80}}"
      #caddy.1_handle_path: "/socket.io/*"
      #caddy.1_handle_path.0_rewrite: "* /socket.io{uri}"
      #caddy.1_handle_path.1_reverse_proxy: "{{upstreams 80}}"
      #caddy.2_handle_path: "/sdoc-server/*"
      #caddy.2_handle_path.0_rewrite: "* {uri}"
      #caddy.2_handle_path.1_reverse_proxy: "{{upstreams 80}}"
      com.centurylinklabs.watchtower.enable: 'true' # keep the up to date
    depends_on:
      - db
    networks:
      - seafile-net

networks:
  seafile-net:
    name: seafile-net

我的里面确实是没有这一段,我来添加一下看看。
我感觉可能我不是用命令安装的,我是用portainer在UI界面安装的,虽然网络也是选了,但是界面上显示的网络不对,但是后面获取的ip地址这几个容器又是在一个网络下面,就比如那个搜索的docker,我如果就用默认的按个访问方式,就是连接不上不能搜索,没办法我把搜索那个容器的端口映射出来,改了seafile的配置,把访问地址指向了映射出来的端口和主机IP,搜索才能用。

好的,谢谢,我不是用代码安装的,有些设置确实是不一样,我来按照这个改一改,研究一下看看

加了代码之后是可以打开了,也可以自动保存了,但是打开的时候会不停的断开连接,已连接,大概弹个五六次不弹出来就可以自动保存了,如下图,打开seadoc文件和知识库都是同样的情况,还不知道问题出在哪里
跳动

浏览器打开开发者工具,看看浏览器执行报错;再与Seafile的nginx日志对比分析

这是浏览器 里面的报错,我是个业余爱好者,这个看不懂,也不知道什么原因造成,麻烦帮忙看一下,我的nginx的seadoc的错误日志时空的,其他的所有日志都看了,也没有发现那里有问题。

这是nginx里面seadoc的日志

sdoc.yml 的配置文件中增加 端口(不要注释掉)
# ports:
# - "80:80"改为

ports:
  - "7070:80"

我本来就带了端口的,用的不是7070,用的是他英文手册里面推荐的端口,搞不好了是,算了,这个功能基本上也不大会去用,就这样吧

这个配置确实有点麻烦,看浏览器中的错误信息应该是 socket 连接出错了。我曾经遇到类似的错误,大概是某个服务启动异常造成链接不上。把所有服务重新关掉 restart 一下就正常使用了。