Рефакторизация структуры кода для улучшения читаемости и удобства сопровождения.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
manifestVersion: 1.1
|
||||
id: nextcloud
|
||||
category: files
|
||||
name: Nextcloud
|
||||
version: "33.0.2"
|
||||
tagline: Платформа продуктивности, которая позволит вам контролировать ситуацию
|
||||
description: >-
|
||||
Nextcloud помещает ваши данные под ваш контроль.
|
||||
Храните свои документы, календарь, контакты и фотографии на DFWebOS вместо
|
||||
дата-центр какой-то компании. Функции:
|
||||
|
||||
|
||||
- Синхронизация с мобильным и настольным компьютером
|
||||
|
||||
- Версионирование и восстановление
|
||||
|
||||
- Галереи и лента активности
|
||||
|
||||
- Поддержка редактирования и предварительного просмотра файлов для PDF, изображений, текстовых файлов, открытых документов, файлов Word и многого другого.
|
||||
|
||||
- Плавная работа и простой пользовательский интерфейс.
|
||||
|
||||
- Детальный контроль над доступом к данным и возможностями совместного использования пользователем и группой.
|
||||
|
||||
|
||||
Примечание. После входа в Nextcloud смените пароль на более безопасный, прежде чем делиться адресом с кем-либо.
|
||||
releaseNotes: >-
|
||||
Это обновление включает исправления ошибок и улучшения:
|
||||
- 📁 Новая опция для ограничения количества последних файлов, отображаемых в настройках файлов.
|
||||
- 🔗 Исправлено создание общего ресурса, когда общий ресурс, защищенный паролем, не поддерживается типом общего ресурса.
|
||||
- ↩️ Исправлено нежелательное перенаправление при сбое принятия акции.
|
||||
- 🔄 Исправлено несоответствие зависимостей в программе обновления.
|
||||
- 🧩 Обновления версий для всех приложений Stable33 (без функциональных изменений)
|
||||
|
||||
|
||||
Полные примечания к выпуску можно найти по адресу https://github.com/nextcloud-releases/server/releases.
|
||||
developer: Nextcloud GmbH
|
||||
website: https://nextcloud.com
|
||||
dependencies: []
|
||||
repo: https://github.com/nextcloud/server
|
||||
support: https://help.nextcloud.com/categories
|
||||
port: 8081
|
||||
gallery:
|
||||
- 1.jpg
|
||||
- 2.jpg
|
||||
- 3.jpg
|
||||
path: ""
|
||||
defaultUsername: dfwebos
|
||||
deterministicPassword: true
|
||||
torOnly: false
|
||||
submitter: DFWebOS
|
||||
submission: https://github.com/getumbrel/umbrel/commit/dcaae95daa8ee3d7e8044d55d13887d8ff353030
|
||||
@@ -0,0 +1,75 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
app_proxy:
|
||||
environment:
|
||||
APP_HOST: nextcloud_web_1
|
||||
APP_PORT: 80
|
||||
PROXY_AUTH_ADD: "false"
|
||||
|
||||
db:
|
||||
image: mariadb:10.6.21@sha256:8a16204dc96c08ed0ee2c52c0f9324aa5d2dd0e43ad23a471d447a39f75765b5
|
||||
user: "1000:1000"
|
||||
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/mysql
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=moneyprintergobrrr
|
||||
- MYSQL_PASSWORD=moneyprintergobrrr
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MARIADB_AUTO_UPGRADE=1
|
||||
healthcheck:
|
||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||
start_period: 10s
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
||||
redis:
|
||||
image: redis:6.2.2-buster@sha256:e10f55f92478715698a2cef97c2bbdc48df2a05081edd884938903aa60df6396
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/data/redis:/data"
|
||||
|
||||
web:
|
||||
image: nextcloud:33.0.2-apache@sha256:2176a451aa8fbd9f003a3d745978377e9a5213850e0181f4bcb24be63885175b
|
||||
# В настоящее время необходимо запускать от имени пользователя root, если мы запускаем от имени uid 1000, это не удастся
|
||||
# https://github.com/nextcloud/docker/blob/05026b029d37fc5cd488d4a4a2a79480e39841ba/21.0/apache/entrypoint.sh#L53-L77
|
||||
# user: "1000:1000"
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/nextcloud:/var/www/html
|
||||
environment:
|
||||
- MYSQL_HOST=nextcloud_db_1
|
||||
- REDIS_HOST=nextcloud_redis_1
|
||||
- MYSQL_PASSWORD=moneyprintergobrrr
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- TRUSTED_PROXIES=${NETWORK_IP}/16
|
||||
- NEXTCLOUD_ADMIN_USER=umbrel
|
||||
- NEXTCLOUD_ADMIN_PASSWORD=${APP_PASSWORD}
|
||||
- NEXTCLOUD_TRUSTED_DOMAINS=${APP_DOMAIN}:${APP_NEXTCLOUD_PORT} ${APP_HIDDEN_SERVICE} ${DEVICE_HOSTNAME}:${APP_NEXTCLOUD_PORT} ${APP_NEXTCLOUD_LOCAL_IPS} nextcloud_web_1
|
||||
- PHP_UPLOAD_LIMIT=1024G
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
|
||||
cron:
|
||||
image: nextcloud:33.0.2-apache@sha256:2176a451aa8fbd9f003a3d745978377e9a5213850e0181f4bcb24be63885175b
|
||||
# В настоящее время необходимо запускать от имени пользователя root, если мы запускаем от имени uid 1000, это не удастся
|
||||
# https://github.com/nextcloud/docker/blob/05026b029d37fc5cd488d4a4a2a79480e39841ba/21.0/apache/entrypoint.sh#L53-L77
|
||||
# user: "1000:1000"
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/nextcloud:/var/www/html
|
||||
entrypoint: /cron.sh
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
@@ -0,0 +1,4 @@
|
||||
export APP_NEXTCLOUD_PORT="8081"
|
||||
|
||||
local_ips=$(hostname --all-ip-addresses 2> /dev/null) || local_ips=""
|
||||
export APP_NEXTCLOUD_LOCAL_IPS="${local_ips}"
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Чтобы разрешить загрузку больших файлов, Nextcloud
|
||||
# Экземпляр Apache должен быть настроен с помощью 'LimitRequestBody 0'.
|
||||
# внутри файла .htaccess
|
||||
|
||||
APP_DATA_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
|
||||
DOT_HTACCESS_FILE="${APP_DATA_DIR}/data/nextcloud/.htaccess"
|
||||
|
||||
echo "Waiting for file (${DOT_HTACCESS_FILE}) to exist..."
|
||||
|
||||
# Подождите до 30 секунд...
|
||||
for attempt in $(seq 1 300); do
|
||||
if [[ -f "${DOT_HTACCESS_FILE}" ]]; then
|
||||
echo ".htaccess file exists"
|
||||
break
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
if [[ ! -f "${DOT_HTACCESS_FILE}" ]]; then
|
||||
echo ".htaccess was never created. Something is likely wrong with the Nextcloud app"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Теперь проверьте, существует ли уже `LimitRequestBody 0` в файле .htaccess.
|
||||
if ! cat "${DOT_HTACCESS_FILE}" | grep --quiet '^LimitRequestBody'
|
||||
then
|
||||
echo "Writing 'LimitRequestBody 0' config. to .htaccess"
|
||||
|
||||
echo >> "${DOT_HTACCESS_FILE}"
|
||||
echo "LimitRequestBody 0" >> "${DOT_HTACCESS_FILE}"
|
||||
fi
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Этот скрипт проверяет файл Nextcloud config.php на наличие 'nextcloud_web_1' в массиве доверенных_доменов и добавляет его, если он не существует. При установке версий до 29.0.4 на umbrelOS домен не будет добавлен через `NEXTCLOUD_TRUSTED_DOMAIN`.
|
||||
# Это обрабатывается в перехватчике после обновления, чтобы гарантировать, что мы не мешаем процессу запуска Nextcloud и предстартовому сценарию, в который записывается config.php.
|
||||
|
||||
APP_DATA_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
|
||||
CONFIG_PHP_FILE="${APP_DATA_DIR}/data/nextcloud/config/config.php"
|
||||
|
||||
DOMAIN_TO_ADD="nextcloud_web_1"
|
||||
|
||||
domain_exists() {
|
||||
grep -q "'$DOMAIN_TO_ADD'" "$CONFIG_PHP_FILE"
|
||||
}
|
||||
|
||||
get_highest_index() {
|
||||
awk -F "=>" '/trusted_domains/ {
|
||||
max = 0
|
||||
while (getline && !/\),/) {
|
||||
if ($1 ~ /^[[:space:]]*[0-9]+/) {
|
||||
split($1, a, " ")
|
||||
if (a[1] > max) max = a[1]
|
||||
}
|
||||
}
|
||||
print max
|
||||
}' "$CONFIG_PHP_FILE"
|
||||
}
|
||||
|
||||
if domain_exists; then
|
||||
echo "Domain '$DOMAIN_TO_ADD' already exists in trusted_domains."
|
||||
else
|
||||
echo "Domain '$DOMAIN_TO_ADD' not found. Adding it to trusted_domains..."
|
||||
|
||||
# Получите самый высокий текущий индекс в массиве доверенных_доменов.
|
||||
highest_index=$(get_highest_index)
|
||||
|
||||
# Рассчитайте новый индекс для добавления
|
||||
new_index=$((highest_index + 1))
|
||||
|
||||
# Добавьте новую запись домена
|
||||
sed -i "/trusted_domains/,/),/ s/),/ $new_index => '$DOMAIN_TO_ADD',\n&/" "$CONFIG_PHP_FILE"
|
||||
|
||||
echo "Domain '$DOMAIN_TO_ADD' added successfully."
|
||||
fi
|
||||
Executable
+178
@@ -0,0 +1,178 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
APP_DATA_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
|
||||
DFWEBOS_ROOT="${APP_DATA_DIR}/../.."
|
||||
|
||||
CONFIG_PHP_FILE="${APP_DATA_DIR}/data/nextcloud/config/config.php"
|
||||
|
||||
APP_COMPOSE_FILE="${APP_DATA_DIR}/docker-compose.yml"
|
||||
APP_COMPOSE_BACKUP_FILE="${APP_DATA_DIR}/docker-compose.yml.bak"
|
||||
|
||||
# Поддерживаемый список миграции основных версий Nextcloud
|
||||
VERSIONS=()
|
||||
VERSIONS+=( "22" )
|
||||
VERSIONS+=( "23" )
|
||||
VERSIONS+=( "24" )
|
||||
VERSIONS+=( "25" )
|
||||
VERSIONS+=( "26" )
|
||||
VERSIONS+=( "27" )
|
||||
VERSIONS+=( "28" )
|
||||
VERSIONS+=( "29" )
|
||||
VERSIONS+=( "30" )
|
||||
VERSIONS+=( "31" )
|
||||
VERSIONS+=( "32" )
|
||||
VERSIONS+=( "33" )
|
||||
|
||||
# Список образов основных версий Nextcloud для миграции
|
||||
IMAGES=()
|
||||
IMAGES+=( "nextcloud:22.2.10-apache@sha256:71c4fb75d7c035ea2c840ebc1adf0da144b0c69e39ce925f4a2ea84b7c06db18" )
|
||||
IMAGES+=( "nextcloud:23.0.11-apache@sha256:671ed70c7b204c63cb56d5c0d5dd624abec5eadeacd492191e65e834ddffef26" )
|
||||
IMAGES+=( "nextcloud:24.0.7-apache@sha256:f95a21b598b7470b788251db5b0bbe9516992fdb865e7a8978980585e36eb715" )
|
||||
IMAGES+=( "nextcloud:25.0.1-apache@sha256:a200319b132c01ec3486e0dcaf052092b560ec30ac9b78115607696dd201f704" )
|
||||
IMAGES+=( "nextcloud:26.0.9-apache@sha256:23180fbe8169d428ce0058bfc8d47793628a16e00e40b495d82e4504a124b3fa" )
|
||||
IMAGES+=( "nextcloud:27.0.2-apache@sha256:3c8040278bdc991cbc025278eaffc4978a9c2fd4ac34e95b10f646dcadb7c3fb" )
|
||||
IMAGES+=( "nextcloud:28.0.3-apache@sha256:ed07f89119dcca2a3711897c48a8ac969542d96d69384445d8fcdc7804ca946f" )
|
||||
IMAGES+=( "nextcloud:29.0.7-apache@sha256:3bcd2afa9d02fccc52251712bee1afc4f5891beaf353af47881b7662cd1308f7" )
|
||||
IMAGES+=( "nextcloud:30.0.5-apache@sha256:02441f524c6fab3aadbf7157f6e0484927e231d685b248dc0734fa2941b4445e" )
|
||||
IMAGES+=( "nextcloud:31.0.9-apache@sha256:11f158050216614d585886600445e0a1b75ee224d6a6dddc5eba996cc9499fa6" )
|
||||
IMAGES+=( "nextcloud:32.0.6-apache@sha256:0e1084cc59df77bec7d6bb29d9ac6939da8372512237a9c51f74ff0a970524f2" )
|
||||
IMAGES+=( "nextcloud:33.0.2-apache@sha256:2176a451aa8fbd9f003a3d745978377e9a5213850e0181f4bcb24be63885175b" )
|
||||
|
||||
find_index() {
|
||||
local -r value="${1}"
|
||||
shift
|
||||
local -r array=("$@")
|
||||
|
||||
for i in "${!array[@]}"; do
|
||||
if [[ "${array[$i]}" == "${value}" ]]; then
|
||||
echo $i
|
||||
exit
|
||||
fi
|
||||
done
|
||||
|
||||
echo -1
|
||||
}
|
||||
|
||||
wait_for_value_in_file () {
|
||||
local -r file="${1}"
|
||||
local -r str="${2}"
|
||||
local -r max_seconds="${3}"
|
||||
|
||||
echo "Searching for '${str}' inside: ${file}"
|
||||
|
||||
for i in $(seq 1 "${max_seconds}"); do
|
||||
echo "Attempt: ${i}"
|
||||
if cat "${file}" | grep --quiet "${str}"; then
|
||||
return
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "Failed after ${max_seconds} seconds to find '${str}' inside: ${file}"
|
||||
exit 1
|
||||
}
|
||||
|
||||
check_compose_file () {
|
||||
local -r image="${1}"
|
||||
|
||||
web_image=$(cat "${APP_COMPOSE_FILE}" 2> /dev/null | yq '.services.web.image' || true)
|
||||
cron_image=$(cat "${APP_COMPOSE_FILE}" 2> /dev/null | yq '.services.cron.image' || true)
|
||||
|
||||
if [[ "${web_image}" != "${image}" ]] || [[ "${cron_image}" != "${image}" ]]; then
|
||||
echo "The docker-compose.yml now looks bad. Restoring..."
|
||||
|
||||
mv "${APP_COMPOSE_BACKUP_FILE}" "${APP_COMPOSE_FILE}"
|
||||
|
||||
exit
|
||||
fi
|
||||
}
|
||||
|
||||
get_version() {
|
||||
cat "${CONFIG_PHP_FILE}" | grep "'version'[[:space:]]=>[[:space:]]" | awk -F"'" '{print $4}'
|
||||
}
|
||||
|
||||
get_major_version() {
|
||||
echo "${1%%.*}"
|
||||
}
|
||||
|
||||
# Если файл конфигурации Nextcloud еще не существует
|
||||
# Тогда скорее всего это новая установка
|
||||
# Поэтому делать нечего
|
||||
if [[ ! -f "${CONFIG_PHP_FILE}" ]]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
nextcloud_version=$(get_version)
|
||||
nextcloud_major_version=$(get_major_version "$nextcloud_version")
|
||||
|
||||
echo "Active Nextcloud Version: ${nextcloud_version}"
|
||||
echo "Active Nextcloud Major Version: ${nextcloud_major_version}"
|
||||
|
||||
# проверьте, добавлен ли к активной версии "-patch", и выйдите, если да, мы позволяем миграции завершиться
|
||||
# мы добавляем "-patch" в версию ниже во время миграции
|
||||
if [[ "${nextcloud_version}" == *"-patch"* ]]; then
|
||||
echo "Active Nextcloud version is undergoing migration. Exiting..."
|
||||
exit
|
||||
fi
|
||||
|
||||
# Проверьте, есть ли активная основная версия в списке миграции
|
||||
active_version_idx=$(find_index "${nextcloud_major_version}" "${VERSIONS[@]}")
|
||||
if [[ "${active_version_idx}" == "-1" ]]; then
|
||||
echo "Active major version is not supported in the list of migrations"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Проверьте, обновлено ли уже
|
||||
if [[ "${VERSIONS[-1]}" == "${nextcloud_major_version}" ]]; then
|
||||
echo "Nextcloud is already on the latest major version. No migration needed."
|
||||
exit
|
||||
fi
|
||||
|
||||
# Перебирать версии, игнорируя предыдущие версии.
|
||||
for i in "${!VERSIONS[@]}"; do
|
||||
[[ "${i}" -le "${active_version_idx}" ]] && continue
|
||||
|
||||
version="${VERSIONS[$i]}"
|
||||
image="${IMAGES[$i]}"
|
||||
|
||||
echo "Migrating to major version: ${version} (${image})"
|
||||
echo
|
||||
|
||||
cp --archive "${APP_COMPOSE_FILE}" "${APP_COMPOSE_BACKUP_FILE}"
|
||||
|
||||
yq -i ".services.web.image = \"${image}\"" "${APP_COMPOSE_FILE}"
|
||||
yq -i ".services.cron.image = \"${image}\"" "${APP_COMPOSE_FILE}"
|
||||
|
||||
check_compose_file "${image}"
|
||||
|
||||
nextcloud_version=$(get_version)
|
||||
sed -i "s/${nextcloud_version}/${nextcloud_version}-patch/" "${CONFIG_PHP_FILE}"
|
||||
|
||||
"${DFWEBOS_ROOT}/scripts/app" start nextcloud
|
||||
|
||||
echo "Waiting for update to complete..."
|
||||
|
||||
# Подождите, пока Nextcloud перейдет в режим обслуживания.
|
||||
# Указание на то, что процесс обновления начался.
|
||||
wait_for_value_in_file "${CONFIG_PHP_FILE}" "'maintenance'[[:space:]]=>[[:space:]]true" 300
|
||||
|
||||
# Подождите, пока Nextcloud выйдет из режима обслуживания.
|
||||
# Указание на завершение процесса обновления
|
||||
wait_for_value_in_file "${CONFIG_PHP_FILE}" "'maintenance'[[:space:]]=>[[:space:]]false" 300
|
||||
|
||||
"${DFWEBOS_ROOT}/scripts/app" stop nextcloud
|
||||
|
||||
# Удалить изображение промежуточной версии
|
||||
# Если это не последнее изображение
|
||||
# В противном случае его придется загрузить заново
|
||||
if [[ "${version}" != "${VERSIONS[-1]}" ]]; then
|
||||
echo "Deleting intermediary image: ${image}"
|
||||
|
||||
docker rmi "${image}" || true
|
||||
fi
|
||||
done
|
||||
|
||||
rm -rf "${APP_COMPOSE_BACKUP_FILE}"
|
||||
|
||||
echo "Migration completed successfully"
|
||||
Reference in New Issue
Block a user