istoreos部署nextcloud

捣鼓

istoreos软路由docker compose部署nextcloud

软路由istoreos部署docker-compose私有云nextcloud

本地部署

一:署纯净的 Nextcloud 环境

1.1 创建 docker-compose.yml
cat > /?/docker-compose.yml << 'EOF' # (?) yml文件存放位置
version: '3.7'

services:
  db:
    image: mariadb:10.11
    container_name: nextcloud-db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-buffer-pool-size=512M
    volumes:
      - /磁盘挂载地址/nextcloud/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_root_password_123
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: your_secure_password_123
    networks:
      - nextcloud-net

  app:
    image: nextcloud:27.1.4-apache
    container_name: nextcloud-app
    restart: unless-stopped
    ports:
      - "9111:80"   #宿主端口假设为9111
    volumes:
      - /磁盘挂载地址/nextcloud/html:/var/www/html
      - /磁盘挂载地址/nextcloud/data:/var/www/html/data
      - /外部磁盘挂载地址/nextcloud/files:/mnt/external_files
      - /etc/localtime:/etc/localtime:ro
      - /磁盘挂载地址/nextcloud/php-custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: your_secure_password_123
    depends_on:
      - db
    networks:
      - nextcloud-net

networks:
  nextcloud-net:
    driver: bridge
EOF
复制代码
1.2 创建 PHP 配置文件(支持大文件)
cat > /磁盘挂载地址/nextcloud/php-custom.ini << 'EOF'
memory_limit = 2G
upload_max_filesize = 500G
post_max_size = 500G
max_execution_time = 3600
max_input_time = 3600
max_file_uploads = 100
output_buffering = 4096
session.gc_maxlifetime = 7200

[opcache]
opcache.enable=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.memory_consumption=256
opcache.save_comments=1
opcache.revalidate_freq=0
EOF
复制代码
1.3 创建必要的目录并设置权限
# 创建所有必要的目录
mkdir -p /磁盘挂载地址/nextcloud/{db,html,data}
mkdir -p /外部磁盘挂载地址/nextcloud/files

# 设置正确的权限
chown -R 33:33 /磁盘挂载地址/nextcloud/html
chown -R 33:33 /磁盘挂载地址/nextcloud/data
chmod -R 755 /磁盘挂载地址/nextcloud/
复制代码

二:启动服务并验证

2.1 启动 Nextcloud 服务
cd /磁盘挂载地址/nextcloud
docker-compose up -d
复制代码
2.2 检查服务状态
# 检查容器状态
docker ps

# 检查端口监听
netstat -tlnp | grep 9111

# 检查容器日志
docker logs nextcloud-app

# 等待一段时间让服务完全启动
sleep 30
复制代码
2.3 本地测试访问
# 在 iStoreOS 上测试本地访问
curl -v http://127.0.0.1:9111

# 测试通过内网 IP 访问(替换为你的 iStoreOS IP)
curl -v http://192.168.x.x:9111
复制代码

三:通过浏览器完成安装

现在通过浏览器访问(请使用你的实际 iStoreOS IP):

http://192.168.x.x:9111
复制代码
安装步骤:

1.创建管理员账户:

  • 用户名:admin(或你喜欢的用户名)

  • 密码:设置一个强密码

2.配置数据库:

  • 数据库用户:nextcloud

  • 数据库密码:your_secure_password_123(与 docker-compose.yml 中一致)

  • 数据库名:nextcloud

  • 数据库主机:db(使用容器服务名)

3.完成安装:点击"安装完成"

四:安装后的重要配置

添加信任域名
# 添加你的域名为信任域名
docker exec nextcloud-app php /var/www/html/occ config:system:set trusted_domains 0 --value="192.168.x.x"
docker exec nextcloud-app php /var/www/html/occ config:system:set trusted_domains 1 --value="你的域名"
docker exec nextcloud-app php /var/www/html/occ config:system:set overwrite.cli.url --value="http://192.168.x.x:9111"
复制代码

域名HTTPS证书证书获取流程:Certbot DNS Cloudflare(DNS 验证)

由于家庭公网IP 80/443 不开放,必须使用 DNS 模式 使用 Cloudflare 插件进行 DNS 验证

# 安装 DNS 插件 (具体命令取决于您的 iStoreOS 环境和域名商)
 opkg install certbot-dns-cloudflare 
复制代码

步骤一:准备 Cloudflare DNS API 凭证

1.创建 API Token

获取证书的最佳实践是创建一个 受限的 API Token,而不是使用您的 Global API Key,以确保账户安全

  • 操作: 登录您的 Cloudflare 账户 → 右上角 My Profile → API Tokens → Create Token
  • 模板: 选择 Edit Zone DNS 模板,或自定义模板,确保以下权限:
  • Permissions (权限):

    Zone: DNS (区域: DNS) → Edit (编辑) Zone: Zone (区域: 区域) → Read (读取)

  • Zone Resources (区域资源):

    Include (包含): Specific zone (特定区域) → 选择您的域名 你的域名 所在的根域名。

  • 生成-复制生成的 API Token。
2. 创建凭证文件

在 iStoreOS 宿主机上,创建一个名为 cloudflare.ini 的文件,并填入您的凭证信息

vi /root/cloudflare.ini
复制代码

内容:

dns_cloudflare_api_token = [您复制的 API Token]
复制代码
3. 设置文件权限(安全步骤)

Certbot 要求凭证文件权限受到严格限制,以防泄露

chmod 600 /root/cloudflare.ini
复制代码

步骤二:执行 Certbot DNS 验证

使用 certbot certonly 命令配合 dns-cloudflare 插件来获取证书

# 替换您的邮箱地址
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  -d 你的域名 \
  --email 你的邮箱 \
  --agree-tos \
  --non-interactive
复制代码
命令解释:
  • --dns-cloudflare: 告诉 Certbot 使用 Cloudflare DNS 插件。

  • --dns-cloudflare-credentials: 指定我们刚刚创建的凭证文件路径。

  • --dns-cloudflare-propagation-seconds 60: 这是一个推荐的参数,设置等待 DNS 记录传播的时间为 60 秒,以确保验证成功(Cloudflare 通常很快,但预留时间更稳妥)。

  • -d 你的域名: 指定要获取证书的域名。

  • --email / --agree-tos / --non-interactive: 邮箱、同意服务条款、非交互模式

成功后的结果:

如果命令执行成功,您将看到类似 "Successfully received certificate." 的信息

您的证书将被放置在以下目录结构中:

/etc/letsencrypt/live/你的域名/
├── fullchain.pem  (完整证书链,用于 Nginx 的 ssl_certificate)
└── privkey.pem    (私钥文件,用于 Nginx 的 ssl_certificate_key)
复制代码

至此,您已经通过 DNS 验证模式成功获取了 SSL 证书,下一步就是将这些路径配置到 Nginx 的 9111 端口的 server 块中

  • Certbot 将自动与您的域名托管商通信,完成验证并获取证书,证书路径在 /etc/letsencrypt/live/你的域名/


配置 Nginx 反向代理和 SSL

步骤 1:调整 Nextcloud 配置

1.1 停止当前容器并修改配置
# 进入 Nextcloud 目录
cd /磁盘挂载地址/nextcloud

# 停止容器
docker-compose down

# 修改 docker-compose.yml,移除端口映射(因为我们将使用 Nginx 代理)
cat > docker-compose.yml << 'EOF'
version: '3.7'

services:
  db:
    image: mariadb:10.11
    container_name: nextcloud-db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-buffer-pool-size=512M
    volumes:
      - /磁盘挂载地址/nextcloud/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_root_password_123
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: your_secure_password_123
    networks:
      - nextcloud-net

  app:
    image: nextcloud:27.1.4-apache
    container_name: nextcloud-app
    restart: unless-stopped
    # 注意:移除了端口映射,将通过 Nginx 访问
    volumes:
      - /磁盘挂载地址/nextcloud/html:/var/www/html
      - /磁盘挂载地址/nextcloud/data:/var/www/html/data
      - /外部磁盘挂载地址/nextcloud/files:/mnt/external_files
      - /etc/localtime:/etc/localtime:ro
      - /磁盘挂载地址/nextcloud/php-custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: your_secure_password_123
      # 添加信任域名
      NEXTCLOUD_TRUSTED_DOMAINS: 你的域名 192.168.x.x
    depends_on:
      - db
    networks:
      - nextcloud-net

networks:
  nextcloud-net:
    driver: bridge
EOF
复制代码
1.2 重新启动容器
docker-compose up -d
复制代码

步骤 2:配置 Nginx 反向代理

cat > /etc/nginx/conf.d/nextcloud.conf << 'EOF'
server {
    listen 9111 ssl;
    listen [::]:9111 ssl;
    server_name 你的域名;

    # SSL 配置
    ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL_nextcloud:10m;
    ssl_session_timeout 24h;

    # HSTS 安全头
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # 安全头
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy "no-referrer" always;

    # 文件上传设置
    client_max_body_size 500G;
    client_body_timeout 10800s;
    client_header_timeout 10800s;

    # 禁用请求缓冲,支持大文件流式上传
    proxy_request_buffering off;
    client_body_buffer_size 1m;

    # 主要位置块
    location / {
        proxy_pass http://nextcloud-app:80;
        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 X-Forwarded-Host $host:$server_port;

        # 超时设置
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        send_timeout 300;

        # 禁用带宽限制
        limit_rate 0;
        limit_rate_after 0;

        # 大文件上传优化
        proxy_buffering off;
        proxy_max_temp_file_size 0;
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 禁止访问特定文件
    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
        deny all;
    }
}
EOF
复制代码
2.2 将 Nginx 连接到 Docker 网络
# 创建 Nginx 网络配置
cat > /etc/nginx/nginx.conf << 'EOF'
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    access_log off;
    sendfile on;
    keepalive_timeout 65;
    
    # 解析 Docker 容器名称
    resolver 127.0.0.11 valid=30s;  # Docker 内置 DNS
    
    include /etc/nginx/conf.d/*.conf;
}
EOF
复制代码

步骤 3:将 Nginx 加入 Docker 网络

让 Nginx 能够访问 Nextcloud 容器:

# 检查网络
docker network ls

# 将 Nginx 的网络命名空间连接到 Docker 网络
# 方法:使用 host 网络模式或者创建自定义网络
# 我们使用更简单的方法:修改 Nginx 配置使用容器 IP

# 获取 Nextcloud 容器的 IP
NEXTCLOUD_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nextcloud-app)
echo "Nextcloud 容器 IP: $NEXTCLOUD_IP"

# 更新 Nginx 配置使用容器 IP
sed -i "s/proxy_pass http:\/\/nextcloud-app:80;/proxy_pass http:\/\/$NEXTCLOUD_IP:80;/" /etc/nginx/conf.d/nextcloud.conf
复制代码

步骤 4:测试并启动 Nginx

4.1 测试配置
# 测试 Nginx 配置
nginx -t

# 如果测试成功,启动 Nginx
nginx -c /etc/nginx/nginx.conf

# 检查进程
ps | grep nginx

# 检查端口监听
netstat -tlnp | grep 9111
复制代码
4.2 验证反向代理
# 测试 HTTPS 访问
curl -k -I https://127.0.0.1:9111

# 测试通过域名访问
curl -k -I https://你的域名:9111
复制代码

步骤 5:更新添加信任域名和配置

# 添加信任域名
docker exec nextcloud-app php /var/www/html/occ config:system:set trusted_domains 0 --value="192.168.x.x"
docker exec nextcloud-app php /var/www/html/occ config:system:set trusted_domains 1 --value="你的域名"

# 配置覆盖 URL
docker exec nextcloud-app php /var/www/html/occ config:system:set overwrite.cli.url --value="https://你的域名:9111"

# 配置协议为 HTTPS
docker exec nextcloud-app php /var/www/html/occ config:system:set overwriteprotocol --value="https"

# 配置代理头
docker exec nextcloud-app php /var/www/html/occ config:system:set overwritehost --value="你的域名:9111"

# 启用 HTTPS
docker exec nextcloud-app php /var/www/html/occ config:system:set trusted_proxies 0 --value="172.17.0.1"
复制代码

测试访问

通过浏览器访问:

https://你的域名:9111
复制代码
#istoreos#liunx
头像

HaG_Cat

1分类数6文章数

该笔记已存活437 天 19 时 53 分 29 秒

QQQQ个人作品站个人作品站ArtStationArtStationBilibiliBilibili

哔哔

-

© 2025-2026 HaG_Cat‘Blog