174 lines
7.0 KiB
Bash
Executable File
174 lines
7.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
### Правильные разрешения для каталогов данных bill-ninja.
|
||
|
||
APP_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/..")"
|
||
APP_DATA_DIR="${APP_DIR}/data"
|
||
|
||
DESIRED_OWNER="1000:1000"
|
||
|
||
PUBLIC_DATA_DIR="${APP_DATA_DIR}/public"
|
||
STORAGE_DATA_DIR="${APP_DATA_DIR}/storage"
|
||
REDIS_DATA_DIR="${APP_DATA_DIR}/redis"
|
||
|
||
invoiceninja_correct_permission() {
|
||
local -r path="${1}"
|
||
|
||
if [[ -d "${path}" ]]; then
|
||
owner=$(stat -c "%u:%g" "${path}")
|
||
|
||
if [[ "${owner}" != "${DESIRED_OWNER}" ]]; then
|
||
chown "${DESIRED_OWNER}" "${path}"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
invoiceninja_correct_permission "${PUBLIC_DATA_DIR}"
|
||
invoiceninja_correct_permission "${STORAGE_DATA_DIR}"
|
||
invoiceninja_correct_permission "${REDIS_DATA_DIR}"
|
||
|
||
### Сгенерировать APP_KEY для счета-ниндзя
|
||
|
||
MAX_RETRIES=5
|
||
RETRY_COUNT=0
|
||
|
||
LARAVEL_APP_KEY_FILE_PATH="${APP_DATA_DIR}/laravel-app-key.txt"
|
||
|
||
echo "Checking for existing invoice-ninja APP_KEY..."
|
||
|
||
# Мы генерируем и сохраняем Laravel APP_KEY только в том случае, если он еще не существует.
|
||
if [[ ! -f "${LARAVEL_APP_KEY_FILE_PATH}" ]]; then
|
||
echo "Generating Invoice-Ninja APP_KEY…"
|
||
|
||
# запустить службу в фоновом режиме
|
||
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" up -d app >/dev/null
|
||
|
||
# убедитесь, что пути к кэшу Laravel существуют, поскольку Invoice Ninja удалил том bootstrap/cache.
|
||
# https://github.com/invoiceninja/dockerfiles/pull/738
|
||
# https://github.com/invoiceninja/dockerfiles/pull/745
|
||
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" exec -T -w /var/www/html app \
|
||
bash -c '
|
||
php artisan optimize || true
|
||
mkdir -p storage/framework/{cache,data,sessions,testing,views} bootstrap/cache
|
||
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true
|
||
chmod -R ug+rwx storage bootstrap/cache
|
||
'
|
||
|
||
# сгенерировать ключ
|
||
APP_KEY=$(
|
||
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" \
|
||
run --rm -w /var/www/html app \
|
||
php artisan key:generate --show --no-ansi
|
||
)
|
||
|
||
# удалить цветовые коды/переводы строк и сохранить
|
||
printf '%s' "${APP_KEY//[$'\t\r\n ']}" > "${LARAVEL_APP_KEY_FILE_PATH}"
|
||
echo "Invoice-Ninja APP_KEY saved → ${LARAVEL_APP_KEY_FILE_PATH}"
|
||
else
|
||
echo "Invoice-Ninja APP_KEY already exists – nothing to do."
|
||
fi
|
||
|
||
### Создайте файл конфигурации nginx по умолчанию для счета-ниндзя, если он не обновлен.
|
||
|
||
NGINX_CONFIG_FILE="${APP_DIR}/config/nginx.conf"
|
||
|
||
# Мы используем маркер в верхней части файла, чтобы идентифицировать канонический nginx.conf для счета-ниндзя.
|
||
MARKER_REGEX='^# DFWebOS Invoice-Ninja canonical nginx.conf 27-May-2025'
|
||
|
||
# Проверяем, не существует ли конфиг-файл nginx или он существует и маркер неактуален
|
||
if [[ ! -f "${NGINX_CONFIG_FILE}" ]] || ! grep -qx "${MARKER_REGEX}" "${NGINX_CONFIG_FILE}"; then
|
||
echo "Updating nginx configuration file for invoice-ninja."
|
||
# Перезаписать файл конфигурации nginx
|
||
cat >"${NGINX_CONFIG_FILE}" <<'EOF'
|
||
# Зонт Invoice-Ninja канонический nginx.conf 27 мая 2025 г.
|
||
|
||
# Invoice-Ninja рекомендует nginx.conf для Laravel
|
||
# https://github.com/invoiceninja/dockerfiles/blob/ed9c23d9c74a2a9f47b9dcb54946726ab816b6bc/debian/nginx/laravel.conf
|
||
|
||
# https://laravel.com/docs/master/deployment#nginx
|
||
server {
|
||
listen 80 default_server;
|
||
server_name _;
|
||
root /var/www/html/public;
|
||
|
||
add_header X-Frame-Options "SAMEORIGIN";
|
||
add_header X-Content-Type-Options "nosniff";
|
||
|
||
index index.php;
|
||
charset utf-8;
|
||
|
||
location / {
|
||
try_files $uri $uri/ /index.php?$query_string;
|
||
}
|
||
|
||
location = /favicon.ico { access_log off; log_not_found off; }
|
||
location = /robots.txt { access_log off; log_not_found off; }
|
||
|
||
error_page 404 /index.php;
|
||
|
||
location ~ \.php$ {
|
||
fastcgi_pass invoice-ninja_app_1:9000;
|
||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||
include fastcgi_params;
|
||
}
|
||
|
||
location ~ /\.(?!well-known).* {
|
||
deny all;
|
||
}
|
||
}
|
||
|
||
# Invoice-Ninja рекомендуемые директивы global/server
|
||
# https://github.com/invoiceninja/dockerfiles/blob/ed9c23d9c74a2a9f47b9dcb54946726ab816b6bc/debian/nginx/invoiceninja.conf
|
||
|
||
# https://nginx.org/en/docs/http/ngx_http_core_module.html
|
||
client_max_body_size 10M;
|
||
client_body_buffer_size 10M;
|
||
server_tokens off;
|
||
|
||
# https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
|
||
fastcgi_buffers 32 16K;
|
||
|
||
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
|
||
gzip on;
|
||
gzip_comp_level 2;
|
||
gzip_min_length 1M;
|
||
gzip_proxied any;
|
||
gzip_types *;
|
||
EOF
|
||
|
||
echo "Updated nginx configuration file for invoice-ninja."
|
||
|
||
fi
|
||
|
||
# Объединить данные из неправильного монтирования /data/storage в правильное монтирование /data/storage для счета-ниндзя
|
||
# Неправильное монтирование привязки хранилища произошло из-за логики файлов DFWebOS для миграции данных:
|
||
# https://github.com/getumbrel/umbrel/blob/93a4b1801d1141252e73ff759a4ef52d038fff92/packages/dfwebosd/source/modules/apps/app.ts#L113-L120
|
||
|
||
INCORRECT_STORAGE_DIR="${APP_DIR}/home"
|
||
CORRECT_STORAGE_DIR="${APP_DIR}/data/storage"
|
||
|
||
# Мы копируем данные только из каталога ${APP_DIR}/home, если он существует.
|
||
if [[ -d "${INCORRECT_STORAGE_DIR}" ]]; then
|
||
echo "Migrating invoice-ninja data from ${INCORRECT_STORAGE_DIR} to ${CORRECT_STORAGE_DIR}..."
|
||
|
||
# Убедитесь, что пункт назначения существует (в случае, если пользователь удалил каталог)
|
||
mkdir -p "${CORRECT_STORAGE_DIR}"
|
||
|
||
# Скопируйте все из неправильного монтирования привязки в правильное.
|
||
# -архив (пермы, времена, ссылки, точечные файлы)
|
||
# -u только для обновления (перезаписывать, только если исходный код новее)
|
||
rsync -au --progress \
|
||
"${INCORRECT_STORAGE_DIR}/" \
|
||
"${CORRECT_STORAGE_DIR}/"
|
||
|
||
# Убедитесь, что пользователь веб-сервера владеет объединенными данными.
|
||
chown -R www-data:www-data "${CORRECT_STORAGE_DIR}"
|
||
|
||
# Архивируйте старую привязку, чтобы этот блок никогда больше не сработал.
|
||
mv "${INCORRECT_STORAGE_DIR}" \
|
||
"${INCORRECT_STORAGE_DIR}_migrated_$(date +%Y%m%dT%H%M%S)"
|
||
|
||
echo "Successfully migrated invoice-ninja data from ${INCORRECT_STORAGE_DIR} to ${CORRECT_STORAGE_DIR}..."
|
||
fi
|