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
