Files
DFWebOS-Apps/invoice-ninja/hooks/pre-start

174 lines
7.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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