fix file size limit

This commit is contained in:
lendry
2026-07-07 15:42:45 +03:00
parent ca2e30af04
commit 9a0cf54aa6
3 changed files with 29 additions and 5 deletions

View File

@@ -18,6 +18,7 @@ import {
const ANDROID_PLATFORM = 'ANDROID' as const; const ANDROID_PLATFORM = 'ANDROID' as const;
const APK_ACCEPT = '.apk,application/vnd.android.package-archive'; const APK_ACCEPT = '.apk,application/vnd.android.package-archive';
const MAX_RELEASE_FILE_BYTES = 350 * 1024 * 1024;
function formatBytes(value: string) { function formatBytes(value: string) {
const size = Number(value); const size = Number(value);
@@ -83,6 +84,10 @@ export default function AdminReleasesPage() {
showToast('Выберите файл релиза'); showToast('Выберите файл релиза');
return; return;
} }
if (file.size > MAX_RELEASE_FILE_BYTES) {
showToast('APK не должен превышать 350 МБ');
return;
}
const parsedVersionCode = Number(versionCode); const parsedVersionCode = Number(versionCode);
if (!version.trim() || !Number.isInteger(parsedVersionCode) || parsedVersionCode < 1) { if (!version.trim() || !Number.isInteger(parsedVersionCode) || parsedVersionCode < 1) {
showToast('Укажите версию и положительный код версии'); showToast('Укажите версию и положительный код версии');

View File

@@ -1809,6 +1809,13 @@ export async function uploadAdminAppRelease(
if (!response.ok) { if (!response.ok) {
const body = await response.json().catch(() => ({})); const body = await response.json().catch(() => ({}));
if (response.status === 413) {
throw new ApiError(
'Файл слишком большой для загрузки (лимит сервера). Максимальный размер APK — 350 МБ. Попросите администратора обновить nginx: ./install.sh --fix-proxy',
413,
'UPLOAD_TOO_LARGE'
);
}
const message = typeof body?.message === 'string' ? body.message : 'Не удалось загрузить релиз'; const message = typeof body?.message === 'string' ? body.message : 'Не удалось загрузить релиз';
throw new ApiError(message, response.status, 'UPLOAD_FAILED'); throw new ApiError(message, response.status, 'UPLOAD_FAILED');
} }

View File

@@ -2306,6 +2306,9 @@ generate_all_self_signed_certs() {
ok "Самоподписанный сертификат создан: ${LOCAL_CERTS_DIR}/shared-intranet" ok "Самоподписанный сертификат создан: ${LOCAL_CERTS_DIR}/shared-intranet"
} }
# Лимит тела запроса в nginx (APK до 350 МБ + запас на multipart).
NGINX_RELEASE_UPLOAD_BODY_SIZE="${NGINX_RELEASE_UPLOAD_BODY_SIZE:-512m}"
nginx_conf_target() { nginx_conf_target() {
local label="$1" local label="$1"
if [[ "$NGINX_MODE" == "docker" ]]; then if [[ "$NGINX_MODE" == "docker" ]]; then
@@ -2571,6 +2574,10 @@ ${proxy_ws}
} }
location ^~ /idp-api/ { location ^~ /idp-api/ {
client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
proxy_read_timeout 900s;
proxy_send_timeout 900s;
client_body_timeout 900s;
${proxy_idp} ${proxy_idp}
${nginx_proxy_headers_api} ${nginx_proxy_headers_api}
} }
@@ -2611,7 +2618,7 @@ server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name ${domain}; server_name ${domain};
client_max_body_size 100m; client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${ws_block} ${ws_block}
${api_location} ${api_location}
@@ -2626,7 +2633,7 @@ ${http_preamble}server {
listen [::]:443 ssl http2; listen [::]:443 ssl http2;
server_name ${domain}; server_name ${domain};
${ssl_block} ${ssl_block}
client_max_body_size 100m; client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${ws_block} ${ws_block}
${api_location} ${api_location}
@@ -2661,6 +2668,10 @@ ${proxy_ws}
} }
location ^~ /idp-api/ { location ^~ /idp-api/ {
client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
proxy_read_timeout 900s;
proxy_send_timeout 900s;
client_body_timeout 900s;
${proxy_idp} ${proxy_idp}
${nginx_proxy_headers_api} ${nginx_proxy_headers_api}
} }
@@ -2709,6 +2720,7 @@ server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name ${domain}; server_name ${domain};
client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${idp_api_block} ${idp_api_block}
location / { location / {
@@ -2726,7 +2738,7 @@ ${http_preamble}server {
listen [::]:443 ssl http2; listen [::]:443 ssl http2;
server_name ${domain}; server_name ${domain};
${ssl_block} ${ssl_block}
client_max_body_size 50m; client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${idp_api_block} ${idp_api_block}
location / { location / {
@@ -2761,7 +2773,7 @@ server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name ${domain}; server_name ${domain};
client_max_body_size 50m; client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${idp_api_block} ${idp_api_block}
location / { location / {
@@ -2779,7 +2791,7 @@ ${http_preamble}server {
listen [::]:443 ssl http2; listen [::]:443 ssl http2;
server_name ${domain}; server_name ${domain};
${ssl_block} ${ssl_block}
client_max_body_size 50m; client_max_body_size ${NGINX_RELEASE_UPLOAD_BODY_SIZE};
${server_dns} ${server_dns}
${idp_api_block} ${idp_api_block}
location / { location / {