Содержание

NextCloud

Данная статья больше как незавершенный черновик, на уровень выше у меня инструкция на Apache

Домашняя хранилка у меня представляет малюсенький ПК (Terramaster f4-423) с 4 дисками в RAID-10,
большинство ресурсов доступны только из локальной сети, но вот появилась необходимость редактировать документики (таблички)
и синхронизировать папки через приложение, это немного не сетевая папка, а именно синхронизация, когда нет интернета папка доступна, а когда интернет появляется, то она синхронизируется и обновляется.

Общая архитектура

про установку certbot
Установка mariadb
Установка докера
Инструкция по раскатке на докер-хабе

Вводные данные

Что Какое
Папка, в которой будут храниться данные пользователей /storage/nextCloud
Папка, в которой будут данные контейнера
в т.ч. compose конфиги итд…
/storage/DockerApps/nextCloud
Порт fpm, который будем прокидывать на хост из докера
доступен только на localhost
9103

Создадим файлы/папки

  1. # Создаем директорию и файл
  2. mkdir -p /storage/DockerApps/nextCloud
  3. touch /storage/DockerApps/nextCloud/.env
  4. chmod 600 /storage/DockerApps/nextCloud/.env

Создадим конфиг

  1. ENV="/storage/DockerApps/nextCloud/.env"
  2. mkdir -p /storage/DockerApps/nextCloud
  3. touch $ENV
  4. chmod 600 $ENV
  5.  
  6. # --- Сеть ---
  7. grep -q "^DB_HOST=" $ENV || echo 'DB_HOST="172.22.0.1"' >> $ENV
  8. grep -q "^NETWORK_NAME=" $ENV || echo 'NETWORK_NAME="nextcloud_net"' >> $ENV
  9. grep -q "^NETWORK_SUBNET=" $ENV || echo 'NETWORK_SUBNET="172.22.0.0/16"' >> $ENV
  10. grep -q "^DB_HOST_SUBNET=" $ENV || echo 'DB_HOST_SUBNET="172.22.%"' >> $ENV
  11.  
  12. # 🔴 Домен Nextcloud (уникальное имя)
  13. grep -q "^DOMAIN_NC=" $ENV || echo 'DOMAIN_NC="oblako.example.com"' >> $ENV
  14.  
  15. # --- Порт ---
  16. grep -q "^FPM_HOST_PORT=" $ENV || echo 'FPM_HOST_PORT="9103"' >> $ENV
  17.  
  18. # --- База данных ---
  19. grep -q "^DB_NAME=" $ENV || echo 'DB_NAME="nextcloud"' >> $ENV
  20. grep -q "^DB_USER=" $ENV || echo 'DB_USER="nextcloud"' >> $ENV
  21. grep -q "^DB_PASS=" $ENV || echo "DB_PASS=\"$(pwgen -s 32 1)\"" >> $ENV
  22.  
  23. # --- Nextcloud ---
  24. grep -q "^NEXTCLOUD_ADMIN_USER=" $ENV || echo 'NEXTCLOUD_ADMIN_USER="admin"' >> $ENV
  25. grep -q "^NEXTCLOUD_ADMIN_PASSWORD=" $ENV || echo "NEXTCLOUD_ADMIN_PASSWORD=\"$(pwgen -s 24 1)\"" >> $ENV
  26.  
  27. # --- Redis ---
  28. grep -q "^REDIS_PASSWORD=" $ENV || echo "REDIS_PASSWORD=\"$(pwgen -s 32 1)\"" >> $ENV
  29.  
  30. # --- OnlyOffice (задел на будущее) ---
  31. grep -q "^DOMAIN_OO=" $ENV || echo 'DOMAIN_OO="office.example.com"' >> $ENV
  32. grep -q "^ONLYOFFICE_JWT_SECRET=" $ENV || echo "ONLYOFFICE_JWT_SECRET=\"$(pwgen -s 32 1)\"" >> $ENV
  33.  
  34. echo "✅ .env готов с раздельными доменами"

Далее при желании откроем файл

/storage/DockerApps/nextCloud/.env

и отредактируем хосты/домены/юзеров…

Создаем подсеть

  1. source /storage/DockerApps/nextCloud/.env

Чтобы заранее знать подсеть…

  1. # Проверяем, существует ли сеть
  2. docker network inspect ${NETWORK_NAME} &> /dev/null
  3.  
  4. if [ $? -ne 0 ]; then
  5. # Сети нет - создаем
  6. docker network create \
  7. --driver=bridge \
  8. --subnet=${NETWORK_SUBNET} \
  9. --gateway=172.22.0.1 \
  10. ${NETWORK_NAME}
  11.  
  12. echo "✅ Сеть ${NETWORK_NAME} создана"
  13. else
  14. echo "ℹ️ Сеть ${NETWORK_NAME} уже существует"
  15. fi

Проверка

  1. docker network inspect ${NETWORK_NAME} --format='
  2. Сеть: {{.Name}}
  3. Драйвер: {{.Driver}}
  4. Подсеть: {{range .IPAM.Config}}{{.Subnet}}{{end}}
  5. Шлюз: {{range .IPAM.Config}}{{.Gateway}}{{end}}
  6. '

Создаем базу данных, пользователя...

  1. source /storage/DockerApps/nextCloud/.env

Проверим что все переменные заполнились корректно

  1. echo "База: ${DB_NAME}"
  2. echo "Пользователь: ${DB_USER}"
  3. echo "Хост: ${DB_HOST}"
  4. echo "Подсеть: ${DB_HOST_SUBNET}"

Создадим базу, пользователя

  1. mariadb -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
  2.  
  3. mariadb -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'${DB_HOST_SUBNET}' IDENTIFIED BY '${DB_PASS}';"
  4.  
  5. mariadb -e "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'${DB_HOST_SUBNET}';"
  6. mariadb -e "FLUSH PRIVILEGES;"
  7.  
  8. mariadb -e "SELECT User, Host FROM mysql.user WHERE User='${DB_USER}';"

Создадим контейнер NextCloud

Структура будет примерно такой

  1. /storage/DockerApps/nextCloud/
  2. ├── .env
  3. ├── docker-compose.yml
  4. ├── nextcloud/
  5. │ ├── config/
  6. │ └── html/
  7. └── redis/
  1. # Основной каталог приложения
  2. mkdir -p /storage/DockerApps/nextCloud/{nextcloud/{html,config},redis}
  3.  
  4. # Отдельный каталог для данных пользователей
  5. mkdir -p /storage/nextCloud_data
  6.  
  7. # Данные пользователей (только контейнер FPM)
  8. chown -R 33:33 /storage/nextCloud_data
  9. chmod -R 750 /storage/nextCloud_data
  10.  
  11. # Код приложения (контейнер FPM + хост-Nginx для чтения)
  12. chown -R 33:33 /storage/DockerApps/nextCloud/nextcloud/html
  13. chmod -R 755 /storage/DockerApps/nextCloud/nextcloud/html
  14.  
  15. # Конфигурация (только контейнер FPM)
  16. chown -R 33:33 /storage/DockerApps/nextCloud/nextcloud/config/
  17. chmod -R 750 /storage/DockerApps/nextCloud/nextcloud/config/
  18.  
  19. # Redis (только контейнер Redis)
  20. chown -R 33:33 /storage/DockerApps/nextCloud/redis
  21. chmod -R 750 /storage/DockerApps/nextCloud/redis
  22.  
  23. # Сам файл .env (максимальная защита)
  24. chmod 600 /storage/DockerApps/nextCloud/.env

Проверим

  1. tree -L 3 /storage/DockerApps/nextCloud/

docker-compose v1

  1. cat > /storage/DockerApps/nextCloud/docker-compose.yml <<EOF
  2. version: '3.8'
  3.  
  4. services:
  5.   redis:
  6.   image: redis:alpine
  7.   container_name: nc_redis
  8.   restart: always
  9.   networks:
  10.   - nextcloud_net
  11.   command: redis-server --requirepass ${REDIS_PASSWORD}
  12.   volumes:
  13.   - ./redis:/data
  14.  
  15.   nextcloud-fpm:
  16.   image: nextcloud:fpm
  17.   container_name: nc_fpm
  18.   restart: always
  19.   depends_on:
  20.   - redis
  21.   networks:
  22.   - nextcloud_net
  23.   ports:
  24.   - "127.0.0.1:${FPM_HOST_PORT}:9000"
  25.   volumes:
  26.   - ./nextcloud/html:/var/www/html
  27.   - /storage/nextCloud_data:/var/www/html/data
  28.   - ./nextcloud/config:/var/www/html/config
  29.   environment:
  30.   - MYSQL_HOST=${DB_HOST}
  31.   - MYSQL_DATABASE=${DB_NAME}
  32.   - MYSQL_USER=${DB_USER}
  33.   - MYSQL_PASSWORD=${DB_PASS}
  34.   - REDIS_HOST=redis
  35.   - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
  36.   - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
  37.   - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
  38.   - NEXTCLOUD_TRUSTED_DOMAINS=${DOMAIN_NC}
  39.   - PHP_MEMORY_LIMIT=512M
  40.   - PHP_UPLOAD_LIMIT=10G
  41.  
  42. networks:
  43.   nextcloud_net:
  44.   external: true
  45.   name: ${NETWORK_NAME}
  46. EOF
  47.  
  48. echo "✅ docker-compose.yml создан"

Запускаем

  1. cd /storage/DockerApps/nextCloud
  2. docker compose up -d
  3. docker logs -f nc_fpm

Решение проблем

Если установка не прошла, то ее можно руками запустить

  1. docker exec -u www-data nc_fpm php occ maintenance:install \
  2. --database "mysql" \
  3. --database-host "${DB_HOST}" \
  4. --database-name "${DB_NAME}" \
  5. --database-user "${DB_USER}" \
  6. --database-pass "${DB_PASS}" \
  7. --admin-user "${NEXTCLOUD_ADMIN_USER}" \
  8. --admin-pass "${NEXTCLOUD_ADMIN_PASS}"

Статус установки узнать так

  1. docker exec -u www-data nc_fpm php occ status

Так проверить трастовый домен если не пускает…

  1. docker exec -u www-data nc_fpm php occ config:system:get trusted_domains

А так можно проверить…

  1. docker exec -u www-data nc_fpm php occ config:system:set trusted_domains 1 --value="${DOMAIN_NC}"

Настроим nginx

  1. source /storage/DockerApps/nextCloud/.env
  2.  
  3. cat > /etc/nginx/sites-available/nextcloud <<EOF
  4. # Set the `immutable` cache control options only for assets with a cache busting `v` argument
  5. map $arg_v $asset_immutable {
  6.   "" "";
  7.   default ", immutable";
  8. }
  9.  
  10. server {
  11.   listen 80;
  12.   listen [::]:80;
  13.   server_name oblako.example.com;
  14.  
  15.   # Prevent nginx HTTP Server Detection
  16.   server_tokens off;
  17.  
  18.   # Enforce HTTPS
  19.   return 301 https://$server_name$request_uri;
  20. }
  21.  
  22. server {
  23.   listen 443 ssl http2;
  24.   listen [::]:443 ssl http2;
  25.   server_name oblako.example.com;
  26.  
  27.   # Path to the root of your installation (on HOST)
  28.   root /storage/DockerApps/nextCloud/nextcloud/html;
  29.  
  30.   # Use Mozilla's guidelines for SSL/TLS settings
  31.   # https://mozilla.github.io/server-side-tls/ssl-config-generator/
  32.   ssl_certificate /etc/letsencrypt/live/oblako.example.com/fullchain.pem;
  33.   ssl_certificate_key /etc/letsencrypt/live/oblako.example.com/privkey.pem;
  34.  
  35.   # Prevent nginx HTTP Server Detection
  36.   server_tokens off;
  37.  
  38.   # HSTS settings
  39.   # WARNING: Only add the preload option once you read about
  40.   # the consequences in https://hstspreload.org/. This option
  41.   # will add the domain to a hardcoded list that is shipped
  42.   # in all major browsers and getting removed from this list
  43.   # could take several months.
  44.   #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  45.  
  46.   # set max upload size and increase upload timeout:
  47.   client_max_body_size 512M;
  48.   client_body_timeout 300s;
  49.   fastcgi_buffers 64 4K;
  50.  
  51.   # Proxy and client response timeouts
  52.   # Uncomment an increase these if facing timeout errors during large file uploads
  53.   #proxy_connect_timeout 60s;
  54.   #proxy_send_timeout 60s;
  55.   #proxy_read_timeout 60s;
  56.   #send_timeout 60s;
  57.  
  58.   # Enable gzip but do not remove ETag headers
  59.   gzip on;
  60.   gzip_vary on;
  61.   gzip_comp_level 4;
  62.   gzip_min_length 256;
  63.   gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
  64.   gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
  65.  
  66.   # Pagespeed is not supported by Nextcloud, so if your server is built
  67.   # with the `ngx_pagespeed` module, uncomment this line to disable it.
  68.   #pagespeed off;
  69.  
  70.   # The settings allows you to optimize the HTTP2 bandwidth.
  71.   # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
  72.   # for tuning hints
  73.   client_body_buffer_size 512k;
  74.  
  75.   # HTTP response headers borrowed from Nextcloud `.htaccess`
  76.   add_header Referrer-Policy "no-referrer" always;
  77.   add_header X-Content-Type-Options "nosniff" always;
  78.   add_header X-Frame-Options "SAMEORIGIN" always;
  79.   add_header X-Permitted-Cross-Domain-Policies "none" always;
  80.   add_header X-Robots-Tag "noindex, nofollow" always;
  81.  
  82.   # Remove X-Powered-By, which is an information leak
  83.   fastcgi_hide_header X-Powered-By;
  84.  
  85.   # Set .mjs and .wasm MIME types
  86.   # Either include it in the default mime.types list
  87.   # and include that list explicitly or add the file extension
  88.   # only for Nextcloud like below:
  89.   include mime.types;
  90.   types {
  91.   text/javascript mjs;
  92. application/wasm wasm;
  93.   }
  94.  
  95.   # Specify how to handle directories -- specifying `/index.php$request_uri`
  96.   # here as the fallback means that Nginx always exhibits the desired behaviour
  97.   # when a client requests a path that corresponds to a directory that exists
  98.   # on the server. In particular, if that directory contains an index.php file,
  99.   # that file is correctly served; if it doesn't, then the request is passed to
  100.   # the front-end controller. This consistent behaviour means that we don't need
  101.   # to specify custom rules for certain paths (e.g. images and other assets,
  102.   # `/updater`, `/ocs-provider`), and thus
  103.   # `try_files $uri $uri/ /index.php$request_uri`
  104.   # always provides the desired behaviour.
  105.   index index.php index.html /index.php$request_uri;
  106.  
  107.   # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
  108.   location = / {
  109.   if ( $http_user_agent ~ ^DavClnt ) {
  110.   return 302 /remote.php/webdav/$is_args$args;
  111.   }
  112.   }
  113.  
  114.   location = /robots.txt {
  115.   allow all;
  116.   log_not_found off;
  117.   access_log off;
  118.   }
  119.  
  120.   # Make a regex exception for `/.well-known` so that clients can still
  121.   # access it despite the existence of the regex rule
  122.   # `location ~ /(\.|autotest|...)` which would otherwise handle requests
  123.   # for `/.well-known`.
  124.   location ^~ /.well-known {
  125.   # The rules in this block are an adaptation of the rules
  126.   # in `.htaccess` that concern `/.well-known`.
  127.  
  128.   location = /.well-known/carddav { return 301 /remote.php/dav/; }
  129.   location = /.well-known/caldav { return 301 /remote.php/dav/; }
  130.  
  131.   location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
  132.   location /.well-known/pki-validation { try_files $uri $uri/ =404; }
  133.  
  134.   # Let Nextcloud's API for `/.well-known` URIs handle all other
  135.   # requests by passing them to the front-end controller.
  136.   return 301 /index.php$request_uri;
  137.   }
  138.  
  139.   # Rules borrowed from `.htaccess` to hide certain paths from clients
  140.   location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
  141.   location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
  142.  
  143.   # Ensure this block, which passes PHP files to the PHP process, is above the blocks
  144.   # which handle static assets (as seen below). If this block is not declared first,
  145.   # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
  146.   # to the URI, resulting in a HTTP 500 error response.
  147.   location ~ \.php(?:$|/) {
  148.   # Required for legacy support
  149.   rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;
  150.  
  151.   fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  152.   set $path_info $fastcgi_path_info;
  153.  
  154.   try_files $fastcgi_script_name =404;
  155.  
  156.   include fastcgi_params;
  157.   # The path inside the container
  158.   fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
  159.   fastcgi_param PATH_INFO $path_info;
  160.   fastcgi_param HTTPS on;
  161.  
  162.   fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
  163.   fastcgi_param front_controller_active true; # Enable pretty urls
  164.   # Connect directly to the FPM port on the host
  165.   fastcgi_pass 127.0.0.1:9103;
  166.  
  167.   fastcgi_intercept_errors on;
  168.   fastcgi_request_buffering on; # Required as PHP-FPM does not support chunked transfer encoding and requires a valid ContentLength header.
  169.  
  170.   # PHP-FPM 504 response timeouts
  171.   # Uncomment and increase these if facing timeout errors during large file uploads
  172.   #fastcgi_read_timeout 60s;
  173.   #fastcgi_send_timeout 60s;
  174.   #fastcgi_connect_timeout 60s;
  175.  
  176.   fastcgi_max_temp_file_size 0;
  177.   }
  178.  
  179.   # Serve static files
  180.   location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac|mp4|webm)$ {
  181.   try_files $uri /index.php$request_uri;
  182.   # HTTP response headers borrowed from Nextcloud `.htaccess`
  183.   add_header Cache-Control "public, max-age=15778463$asset_immutable";
  184.   add_header Referrer-Policy "no-referrer" always;
  185.   add_header X-Content-Type-Options "nosniff" always;
  186.   add_header X-Frame-Options "SAMEORIGIN" always;
  187.   add_header X-Permitted-Cross-Domain-Policies "none" always;
  188.   add_header X-Robots-Tag "noindex, nofollow" always;
  189.   access_log off; # Optional: Don't log access to assets
  190.   }
  191.  
  192.   location ~ \.(otf|woff2?)$ {
  193.   try_files $uri /index.php$request_uri;
  194.   expires 7d; # Cache-Control policy borrowed from `.htaccess`
  195.   access_log off; # Optional: Don't log access to assets
  196.   }
  197.  
  198.   # Rule borrowed from `.htaccess`
  199.   location /remote {
  200.   return 301 /remote.php$request_uri;
  201.   }
  202.  
  203.   location / {
  204.   try_files $uri $uri/ /index.php$request_uri;
  205.   }
  206. }
  207. EOF
  208.  
  209. echo "✅ Конфиг создан в sites-available"

Активируем хост

  1. ln -sf /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud
  1. nginx -t && systemctl reload nginx
  1. certbot --nginx \
  2. -d ${DOMAIN_NC} \
  3. --email admin@example.com \
  4. --agree-tos \
  5. --non-interactive \
  6. --redirect

OnlyOffice

  1. version: '3.8'
  2.  
  3. services:
  4. redis:
  5. image: redis:alpine
  6. container_name: nc_redis
  7. restart: always
  8. networks:
  9. - nextcloud_net
  10. command: redis-server --requirepass ${REDIS_PASSWORD}
  11. volumes:
  12. - ./redis:/data
  13.  
  14. nextcloud-fpm:
  15. image: nextcloud:fpm
  16. container_name: nc_fpm
  17. restart: always
  18. depends_on:
  19. - redis
  20. networks:
  21. - nextcloud_net
  22. ports:
  23. - "127.0.0.1:${FPM_HOST_PORT}:9000"
  24. volumes:
  25. - ./nextcloud/html:/var/www/html
  26. - /storage/nextCloud_data:/var/www/html/data
  27. - ./nextcloud/config:/var/www/html/config
  28. environment:
  29. - MYSQL_HOST=${DB_HOST}
  30. - MYSQL_DATABASE=${DB_NAME}
  31. - MYSQL_USER=${DB_USER}
  32. - MYSQL_PASSWORD=${DB_PASS}
  33. - REDIS_HOST=redis
  34. - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
  35. - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
  36. - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
  37. - NEXTCLOUD_TRUSTED_DOMAINS=${DOMAIN_NC}
  38. - PHP_MEMORY_LIMIT=512M
  39. - PHP_UPLOAD_LIMIT=10G
  40.  
  41. # --- НОВЫЙ СЕРВИС ONLYOFFICE ---
  42. onlyoffice-document-server:
  43. image: onlyoffice/documentserver:latest # Можно заменить на конкретную версию
  44. container_name: nc_onlyoffice
  45. restart: always
  46. networks:
  47. - nextcloud_net # Та же сеть, что и nextcloud-fpm
  48. volumes:
  49. - ./onlyoffice/logs:/var/log/onlyoffice # Логи на хост
  50. - ./onlyoffice/data:/var/www/onlyoffice/Data # Данные документов на хост
  51. - ./onlyoffice/fonts:/usr/share/fonts/truetype/custom # Кастомные шрифты (опционально)
  52. # - ./onlyoffice/example:/etc/onlyoffice/documentserver-example # Примеры конфигов (опционально)
  53. environment:
  54. - JWT_ENABLED=true
  55. - JWT_SECRET=${ONLYOFFICE_JWT_SECRET} # Используем переменную из .env
  56. - JWT_HEADER=AuthorizationJwt # Заголовок, который будет использовать Nextcloud
  57. # ports: # Не публикуем порты на хост, т.к. общение идет внутри сети
  58. # - "8080:80" # Только если нужно отдельно тестировать OnlyOffice
  59.  
  60. networks:
  61. nextcloud_net:
  62. external: true
  63. name: ${NETWORK_NAME}
  1. mkdir -p /storage/DockerApps/nextCloud/onlyoffice/{logs,data,fonts}
  2. chown -R 33:33 /storage/DockerApps/nextCloud/onlyoffice # UID/GID для пользователя www-data в OnlyOffice
  3. chmod -R 750 /storage/DockerApps/nextCloud/onlyoffice

Как всё удалить???

  1. cd /storage/DockerApps/nextCloud
  2. docker compose down
  3. cd /storage/DockerApps/nextCloud
  4. docker compose down
  5. rm -r /storage/DockerApps/nextCloud/*
  6. rm -r /storage/nextCloud_data/*
  7.  
  8. rm -r /storage/DockerApps/nextCloud/.env
  9.  
  10.  
  11. # 1. Загружаем переменные из .env
  12. source /storage/DockerApps/nextCloud/.env
  13.  
  14. # 2. Удаляем базу данных
  15. mariadb -e "DROP DATABASE IF EXISTS ${DB_NAME};"
  16.  
  17. # 3. Удаляем пользователя
  18. mariadb -e "DROP USER IF EXISTS '${DB_USER}'@'${DB_HOST_SUBNET}';"
  19.  
  20. # 4. Применяем изменения
  21. mariadb -e "FLUSH PRIVILEGES;"
  22. rm -r /storage/nextCloud_data/*
  23.  
  24.  
  25. # 1. Загружаем переменные из .env
  26. source /storage/DockerApps/nextCloud/.env
  27.  
  28. # 2. Удаляем базу данных
  29. mariadb -e "DROP DATABASE IF EXISTS ${DB_NAME};"
  30.  
  31. # 3. Удаляем пользователя
  32. mariadb -e "DROP USER IF EXISTS '${DB_USER}'@'${DB_HOST_SUBNET}';"
  33.  
  34. # 4. Применяем изменения
  35. mariadb -e "FLUSH PRIVILEGES;"