feat: Configuración completa de Docker con PostgreSQL, HTTPS y servidor de producción
- Agregada configuración de servidor HTTPS con Express (server.js) - Integración de PostgreSQL en docker-compose.yml con servicio dedicado - Actualizado Dockerfile para optimizar build en Alpine Linux - Configurado vite.config.ts con soporte HTTPS para desarrollo - Agregados certificados SSL para HTTPS - Actualizado svelte.config.js con configuración CSRF - Ajustadas métricas de restauración en +page.server.ts para usar last_restore_date - Agregado script npm start en package.json - Instalado express como dependencia de producción
This commit is contained in:
14
Dockerfile
14
Dockerfile
@@ -6,8 +6,10 @@ WORKDIR /app
|
|||||||
# Copy package files
|
# Copy package files
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
# Install dependencies
|
# Install dependencies (force reinstall for Alpine Linux compatibility)
|
||||||
RUN npm ci
|
RUN rm -rf node_modules package-lock.json && \
|
||||||
|
npm cache clean --force && \
|
||||||
|
npm install
|
||||||
|
|
||||||
# Copy source code
|
# Copy source code
|
||||||
COPY . .
|
COPY . .
|
||||||
@@ -24,10 +26,12 @@ WORKDIR /app
|
|||||||
# Copy built application and dependencies
|
# Copy built application and dependencies
|
||||||
COPY --from=builder /app/build build/
|
COPY --from=builder /app/build build/
|
||||||
COPY --from=builder /app/node_modules node_modules/
|
COPY --from=builder /app/node_modules node_modules/
|
||||||
|
COPY --from=builder /app/server.js .
|
||||||
|
COPY --from=builder /app/certs certs/
|
||||||
COPY package.json .
|
COPY package.json .
|
||||||
|
|
||||||
# Expose port
|
# Expose HTTPS port
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
# Start the application
|
# Start the application with HTTPS
|
||||||
CMD ["node", "build"]
|
CMD ["node", "server.js"]
|
||||||
|
|||||||
88
certs/certificado_completo.pem
Normal file
88
certs/certificado_completo.pem
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFLzCCBBegAwIBAgISBSlK1w8yv74gA1MpoRWxuScSMA0GCSqGSIb3DQEBCwUA
|
||||||
|
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
|
||||||
|
EwNSMTMwHhcNMjYwMjE3MjAzNTIwWhcNMjYwNTE4MjAzNTE5WjAoMSYwJAYDVQQD
|
||||||
|
Ex13d3cuY3BhbmVsLWEyNC5hZHVhbmFzb2Z0LmNvbTCCASIwDQYJKoZIhvcNAQEB
|
||||||
|
BQADggEPADCCAQoCggEBAL/Eab9LDyi1w37BYZpF32XufVXOP/5LWz38tnUTVAc+
|
||||||
|
7XNgzJJESA7ZDL8ObPZfqNLd0wx8k/4l6UC7hI0+VGEEnpQARAMnK7X/E5YRUgcY
|
||||||
|
+X5SnufbrO0raDiJJyU6KjypZ6ie8/O595vG3ZgNYRacI2AxR3WOhx4mZJcTd5mo
|
||||||
|
uBPOfn7pVYu6O/iNCSwVmt+01abR6znAgX54ri9J5LR+Y36V8pDS6kSPfS/+pblt
|
||||||
|
hLYjxtE0XyA2FoJ/anVCyxSE4v0A4Hf9zuUjDIDFGavL6sn375NnUphCm/+U63XX
|
||||||
|
hITAguZxiOi/ObrZhLMivWtTsDCxuEbIpOFAZu///QMCAwEAAaOCAkYwggJCMA4G
|
||||||
|
A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA
|
||||||
|
MB0GA1UdDgQWBBT5Xeqix1yWnv2zUvlW2WZq54MP5zAfBgNVHSMEGDAWgBTnq58P
|
||||||
|
LDOgU9NeT3jIsoQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0
|
||||||
|
dHA6Ly9yMTMuaS5sZW5jci5vcmcvMEMGA1UdEQQ8MDqCGWNwYW5lbC1hMjQuYWR1
|
||||||
|
YW5hc29mdC5jb22CHXd3dy5jcGFuZWwtYTI0LmFkdWFuYXNvZnQuY29tMBMGA1Ud
|
||||||
|
IAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTMuYy5s
|
||||||
|
ZW5jci5vcmcvMTkuY3JsMIIBDAYKKwYBBAHWeQIEAgSB/QSB+gD4AHYAyzj3FYl8
|
||||||
|
hKFEX1vB3fvJbvKaWc1HCmkFhbDLFMMUWOcAAAGcbYYZgQAABAMARzBFAiEA3lrX
|
||||||
|
okh5ZBsHXkrM3V5vQiliDs43mwOpXvS94hpPrOkCIGW5eJmyEHzu2HsJUXeew3It
|
||||||
|
D8/9ZrcwMWLJSzBltKjeAH4AGoudaUpXmMiZoMqIvfSPwLRWYMzDYA0fcfRp/8fR
|
||||||
|
rKMAAAGcbYYc/AAIAAAFAEnJns8EAwBHMEUCIEFhMKBwxFIGTbR8JNX9hF9UYvYd
|
||||||
|
YtIS3Ej0Dd6Gf5RwAiEA9eXfJKJDK8XO48qubNrUSrZVyO7iPWhVAT4Zbe3lszkw
|
||||||
|
DQYJKoZIhvcNAQELBQADggEBAJX7OOSpmtVV2rYqweE9D5ndlqtJqqMPI0IPVHnO
|
||||||
|
zuuIBuAL3QpPkM6ydKjNXfgKGDowJEmcAHOT44Rm2Og+7ODJ08xUkj1PovFgErUs
|
||||||
|
cjZns+eiBzyMhIdQu5ACu0wv6jqzPiYtCbHvdaSBNNCjc08DyE4r0c2f7JiknkCF
|
||||||
|
XMd1tBnjd8njB4RiSbFYJP3MQL2hx9GX0d18gQvBXfhqTQI4ETCdIEmffLzvmiEO
|
||||||
|
HrBFy/z52b7HzfL0TajnoHWPpdDfvwOuEt18MklB+1970sVuxhh3HpS/X1Gd17Gc
|
||||||
|
6gBzxyzpA7oYP9unVuYppE1WwmgtfU8dFhFx0+acgDRxYlA=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/xGm/Sw8otcN+
|
||||||
|
wWGaRd9l7n1Vzj/+S1s9/LZ1E1QHPu1zYMySREgO2Qy/Dmz2X6jS3dMMfJP+JelA
|
||||||
|
u4SNPlRhBJ6UAEQDJyu1/xOWEVIHGPl+Up7n26ztK2g4iSclOio8qWeonvPzufeb
|
||||||
|
xt2YDWEWnCNgMUd1joceJmSXE3eZqLgTzn5+6VWLujv4jQksFZrftNWm0es5wIF+
|
||||||
|
eK4vSeS0fmN+lfKQ0upEj30v/qW5bYS2I8bRNF8gNhaCf2p1QssUhOL9AOB3/c7l
|
||||||
|
IwyAxRmry+rJ9++TZ1KYQpv/lOt114SEwILmcYjovzm62YSzIr1rU7AwsbhGyKTh
|
||||||
|
QGbv//0DAgMBAAECggEADuxN/mDs8RIUAI0z9zlwxRHmFwNR34wlsZE08a9rXpT7
|
||||||
|
DXt+7/L4WI9zenq46ANRs/cnMVWQfrqciDkPe55aGqKtZH8Qy94EfMk40PjQFVVQ
|
||||||
|
NRBg5VInBt3V4nBp52+7UbUtJ+YWveS+7BRxsh94arYD2rx6/x70TNhYA5m0OPTR
|
||||||
|
qWLNJabPxxi2Dm2zkEo2+pxzw1R+s3g8Sd6026LxiiDiZrUgVEwGnpIAOuHNGQ1u
|
||||||
|
8K5XWzjezrl8OUSwRSFAJyqSTcF5Ktj+dVCtMkUKg2WpK0qotVIZmm6YJ5cH13CP
|
||||||
|
/32myqHZRKkV6KslHAFlOaxZ0cvIAb3mXksSwO4bIQKBgQDu1ME75gaLbarV6FrE
|
||||||
|
vEG5vikS/nzRRjS7/96ecWF5iC1O9C+Sp0ViVlng3qQlW3h9OgUHhJYg+JvNMIT3
|
||||||
|
s9LR7rqvSf0RWbebsK7aOWh8poZaGGP3lk7BU6X3OhYHa4i9H/9BpeovQSuML/cP
|
||||||
|
A7g+4TQ8KA3lB1oolCRE3+NchwKBgQDNjYkEVNJ0SWevl/BPYUgrlJ+4OkooNXTk
|
||||||
|
6XgxWyHIr06k7M7UsoUnBauH/odHABBWFg6uwan8uCcWyP9kAdAVo1gVKePwO0eK
|
||||||
|
Ori9EthB169ZoYYdVecHGgkjW1JYXwS3us7+k9Jy09UBLniOoAfY8HGZeP+xo+3G
|
||||||
|
+7hKa6BWpQKBgDc2qmGdoR+0v8zqBan717oIM1i3ysVa1LAtzBqXHbDKAaeCHklq
|
||||||
|
MEk2q1qoPgyA5A8XTbhaN5bxwpsiP2tAgFmWNkR193J+akstAo9ivDwtB1xmzR2c
|
||||||
|
+yIIo5LPM+6NNrR6ZDmaENTR3S5wnE41TvACgl/x5pxvIbHF5ciidd6bAoGBALfw
|
||||||
|
jcoYdXOmNGjHmD4QmdqV1w+u6altnLszyWCxYlwJtGCVoMhpMAopYsQBmuCISBYh
|
||||||
|
CuaLWyhRSnlzSEcf8CtMzoexws243l3uCl73vBm/fqTAjBk4Q9LxE3hWQivea4RW
|
||||||
|
YOEjOtGSiivSgANxZVRWZfGme3llbmP/4XyHLyYZAoGBAMu5Amt9Dg7CAe4CLKmV
|
||||||
|
BIt2PmU1YoNxTXwlDwRYu8Fy20IdH5U93fS7sGifeg7oLa2t3YN2S3DE9XOri03D
|
||||||
|
3XTOUHV3/uGbkzJtd5QBGWyC9IAznvVDhpZlowKyk4SVdPxn/zxoVNgMHLtJHPYd
|
||||||
|
7Yf7vY2YofoFlsVKRqQme9Sw
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
28
certs/llave_privada.key
Normal file
28
certs/llave_privada.key
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/xGm/Sw8otcN+
|
||||||
|
wWGaRd9l7n1Vzj/+S1s9/LZ1E1QHPu1zYMySREgO2Qy/Dmz2X6jS3dMMfJP+JelA
|
||||||
|
u4SNPlRhBJ6UAEQDJyu1/xOWEVIHGPl+Up7n26ztK2g4iSclOio8qWeonvPzufeb
|
||||||
|
xt2YDWEWnCNgMUd1joceJmSXE3eZqLgTzn5+6VWLujv4jQksFZrftNWm0es5wIF+
|
||||||
|
eK4vSeS0fmN+lfKQ0upEj30v/qW5bYS2I8bRNF8gNhaCf2p1QssUhOL9AOB3/c7l
|
||||||
|
IwyAxRmry+rJ9++TZ1KYQpv/lOt114SEwILmcYjovzm62YSzIr1rU7AwsbhGyKTh
|
||||||
|
QGbv//0DAgMBAAECggEADuxN/mDs8RIUAI0z9zlwxRHmFwNR34wlsZE08a9rXpT7
|
||||||
|
DXt+7/L4WI9zenq46ANRs/cnMVWQfrqciDkPe55aGqKtZH8Qy94EfMk40PjQFVVQ
|
||||||
|
NRBg5VInBt3V4nBp52+7UbUtJ+YWveS+7BRxsh94arYD2rx6/x70TNhYA5m0OPTR
|
||||||
|
qWLNJabPxxi2Dm2zkEo2+pxzw1R+s3g8Sd6026LxiiDiZrUgVEwGnpIAOuHNGQ1u
|
||||||
|
8K5XWzjezrl8OUSwRSFAJyqSTcF5Ktj+dVCtMkUKg2WpK0qotVIZmm6YJ5cH13CP
|
||||||
|
/32myqHZRKkV6KslHAFlOaxZ0cvIAb3mXksSwO4bIQKBgQDu1ME75gaLbarV6FrE
|
||||||
|
vEG5vikS/nzRRjS7/96ecWF5iC1O9C+Sp0ViVlng3qQlW3h9OgUHhJYg+JvNMIT3
|
||||||
|
s9LR7rqvSf0RWbebsK7aOWh8poZaGGP3lk7BU6X3OhYHa4i9H/9BpeovQSuML/cP
|
||||||
|
A7g+4TQ8KA3lB1oolCRE3+NchwKBgQDNjYkEVNJ0SWevl/BPYUgrlJ+4OkooNXTk
|
||||||
|
6XgxWyHIr06k7M7UsoUnBauH/odHABBWFg6uwan8uCcWyP9kAdAVo1gVKePwO0eK
|
||||||
|
Ori9EthB169ZoYYdVecHGgkjW1JYXwS3us7+k9Jy09UBLniOoAfY8HGZeP+xo+3G
|
||||||
|
+7hKa6BWpQKBgDc2qmGdoR+0v8zqBan717oIM1i3ysVa1LAtzBqXHbDKAaeCHklq
|
||||||
|
MEk2q1qoPgyA5A8XTbhaN5bxwpsiP2tAgFmWNkR193J+akstAo9ivDwtB1xmzR2c
|
||||||
|
+yIIo5LPM+6NNrR6ZDmaENTR3S5wnE41TvACgl/x5pxvIbHF5ciidd6bAoGBALfw
|
||||||
|
jcoYdXOmNGjHmD4QmdqV1w+u6altnLszyWCxYlwJtGCVoMhpMAopYsQBmuCISBYh
|
||||||
|
CuaLWyhRSnlzSEcf8CtMzoexws243l3uCl73vBm/fqTAjBk4Q9LxE3hWQivea4RW
|
||||||
|
YOEjOtGSiivSgANxZVRWZfGme3llbmP/4XyHLyYZAoGBAMu5Amt9Dg7CAe4CLKmV
|
||||||
|
BIt2PmU1YoNxTXwlDwRYu8Fy20IdH5U93fS7sGifeg7oLa2t3YN2S3DE9XOri03D
|
||||||
|
3XTOUHV3/uGbkzJtd5QBGWyC9IAznvVDhpZlowKyk4SVdPxn/zxoVNgMHLtJHPYd
|
||||||
|
7Yf7vY2YofoFlsVKRqQme9Sw
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
build: .
|
build: .
|
||||||
@@ -22,13 +20,59 @@ services:
|
|||||||
- DB_AZURE_PASS=${DB_AZURE_PASS}
|
- DB_AZURE_PASS=${DB_AZURE_PASS}
|
||||||
- DB_AZURE_DB=${DB_AZURE_DB}
|
- DB_AZURE_DB=${DB_AZURE_DB}
|
||||||
|
|
||||||
|
# PostgreSQL connection (connect to postgres service)
|
||||||
|
- DB_POSTGRES_HOST=postgres
|
||||||
|
- DB_POSTGRES_PORT=5432
|
||||||
|
- DB_POSTGRES_USER=${DB_POSTGRES_USER}
|
||||||
|
- DB_POSTGRES_PASS=${DB_POSTGRES_PASS}
|
||||||
|
- DB_POSTGRES_DB=${DB_POSTGRES_DB}
|
||||||
|
|
||||||
|
# JWT Secret
|
||||||
|
- JWT_SECRET=${JWT_SECRET}
|
||||||
|
|
||||||
# Use a mounted volume for backups
|
# Use a mounted volume for backups
|
||||||
- BACKUP_PATH=/data/backups
|
- BACKUP_PATH=/data/backups
|
||||||
|
|
||||||
- PORT=3000
|
- PORT=3000
|
||||||
- ORIGIN=http://localhost:3000
|
- ORIGIN=https://localhost:3000
|
||||||
|
- NODE_ENV=production
|
||||||
volumes:
|
volumes:
|
||||||
# Map a local folder to the container's backup path
|
# Map the actual backup folder from host to the container's backup path
|
||||||
- ./backups:/data/backups:ro
|
# Windows path D:/BackupSFTP/ mapped to /data/backups inside container (read-only)
|
||||||
|
- D:/BackupSFTP:/data/backups:ro
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- "host.docker.internal:host-gateway"
|
- "host.docker.internal:host-gateway"
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
networks:
|
||||||
|
- aduanasoft-network
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: postgres:15-alpine
|
||||||
|
container_name: aduanasoft-postgres
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: ${DB_POSTGRES_USER}
|
||||||
|
POSTGRES_PASSWORD: ${DB_POSTGRES_PASS}
|
||||||
|
POSTGRES_DB: ${DB_POSTGRES_DB}
|
||||||
|
PGDATA: /var/lib/postgresql/data/pgdata
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- postgres_data:/var/lib/postgresql/data
|
||||||
|
- ./database/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- aduanasoft-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
aduanasoft-network:
|
||||||
|
driver: bridge
|
||||||
|
|||||||
1295
package-lock.json
generated
1295
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,7 @@
|
|||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
|
"start": "node server.js",
|
||||||
"check": "svelte-kit sync && tsc --noEmit"
|
"check": "svelte-kit sync && tsc --noEmit"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -31,6 +32,7 @@
|
|||||||
"bcrypt": "^6.0.0",
|
"bcrypt": "^6.0.0",
|
||||||
"bootstrap": "^5.3.3",
|
"bootstrap": "^5.3.3",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
|
"express": "^4.18.2",
|
||||||
"jsonwebtoken": "^9.0.3",
|
"jsonwebtoken": "^9.0.3",
|
||||||
"mssql": "^10.0.2",
|
"mssql": "^10.0.2",
|
||||||
"pg": "^8.18.0"
|
"pg": "^8.18.0"
|
||||||
|
|||||||
32
server.js
Normal file
32
server.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { handler } from './build/handler.js';
|
||||||
|
import express from 'express';
|
||||||
|
import https from 'https';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
// Rutas a los certificados SSL
|
||||||
|
const sslOptions = {
|
||||||
|
key: fs.readFileSync(path.join(__dirname, 'certs/llave_privada.key')),
|
||||||
|
cert: fs.readFileSync(path.join(__dirname, 'certs/certificado_completo.pem'))
|
||||||
|
};
|
||||||
|
|
||||||
|
// Agregar CA si existe el archivo intermedio
|
||||||
|
const caPath = path.join(__dirname, 'certs/intermedio.crt');
|
||||||
|
if (fs.existsSync(caPath)) {
|
||||||
|
sslOptions.ca = fs.readFileSync(caPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SvelteKit handler
|
||||||
|
app.use(handler);
|
||||||
|
|
||||||
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
|
// Crear servidor HTTPS
|
||||||
|
https.createServer(sslOptions, app).listen(PORT, '0.0.0.0', () => {
|
||||||
|
console.log(`🔒 HTTPS Server running on https://0.0.0.0:${PORT}`);
|
||||||
|
});
|
||||||
@@ -377,31 +377,23 @@ export const load: PageServerLoad = async ({ cookies }) => {
|
|||||||
console.error("Error processing backups/alerts hydration:", e);
|
console.error("Error processing backups/alerts hydration:", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CALCULAR MÉTRICAS DE RESTAURACIÓN basadas en backups reales (ANTES del filtro)
|
// CALCULAR MÉTRICAS DE RESTAURACIÓN basadas en last_restore_date (ANTES del filtro)
|
||||||
restoredCount = 0;
|
restoredCount = 0;
|
||||||
notRestoredCount = 0;
|
notRestoredCount = 0;
|
||||||
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
||||||
|
|
||||||
for (const db of databaseRows) {
|
for (const db of databaseRows) {
|
||||||
// Buscar backups de esta base de datos en las últimas 24 horas
|
// Verificar si tiene una restauración en las últimas 24 horas
|
||||||
// Comparar usando NodoSubNodo (de la BD) con nodo_name (del archivo de backup)
|
if (db.last_restore_date) {
|
||||||
const recentBackups = backupFiles.filter(backup => {
|
const restoreDate = new Date(db.last_restore_date);
|
||||||
const backupNodo = (backup.nodo_name || '').toLowerCase();
|
if (restoreDate > oneDayAgo) {
|
||||||
const dbNodo = (db.NodoSubNodo || '').toLowerCase();
|
|
||||||
const backupDate = new Date(backup.date);
|
|
||||||
|
|
||||||
// Si no tiene NodoSubNodo, intentar con el nombre de la BD
|
|
||||||
const hasMatch = dbNodo ? (backupNodo === dbNodo) :
|
|
||||||
(backupNodo === (db.visible_name || '').toLowerCase());
|
|
||||||
|
|
||||||
return hasMatch && backupDate > oneDayAgo;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (recentBackups.length > 0) {
|
|
||||||
restoredCount++;
|
restoredCount++;
|
||||||
} else {
|
} else {
|
||||||
notRestoredCount++;
|
notRestoredCount++;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
notRestoredCount++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aplicar filtro de permisos de usuario (si no es admin)
|
// Aplicar filtro de permisos de usuario (si no es admin)
|
||||||
@@ -423,23 +415,17 @@ export const load: PageServerLoad = async ({ cookies }) => {
|
|||||||
restoredCount = 0;
|
restoredCount = 0;
|
||||||
notRestoredCount = 0;
|
notRestoredCount = 0;
|
||||||
for (const db of databaseRows) {
|
for (const db of databaseRows) {
|
||||||
const recentBackups = backupFiles.filter(backup => {
|
// Verificar si tiene una restauración en las últimas 24 horas
|
||||||
const backupNodo = (backup.nodo_name || '').toLowerCase();
|
if (db.last_restore_date) {
|
||||||
const dbNodo = (db.NodoSubNodo || '').toLowerCase();
|
const restoreDate = new Date(db.last_restore_date);
|
||||||
const backupDate = new Date(backup.date);
|
if (restoreDate > oneDayAgo) {
|
||||||
|
|
||||||
// Si no tiene NodoSubNodo, intentar con el nombre de la BD
|
|
||||||
const hasMatch = dbNodo ? (backupNodo === dbNodo) :
|
|
||||||
(backupNodo === (db.visible_name || '').toLowerCase());
|
|
||||||
|
|
||||||
return hasMatch && backupDate > oneDayAgo;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (recentBackups.length > 0) {
|
|
||||||
restoredCount++;
|
restoredCount++;
|
||||||
} else {
|
} else {
|
||||||
notRestoredCount++;
|
notRestoredCount++;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
notRestoredCount++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,10 @@ const config = {
|
|||||||
|
|
||||||
kit: {
|
kit: {
|
||||||
// adapter-node creates a Node.js server for the build
|
// adapter-node creates a Node.js server for the build
|
||||||
adapter: adapter()
|
adapter: adapter(),
|
||||||
|
csrf: {
|
||||||
|
checkOrigin: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,16 @@
|
|||||||
import { sveltekit } from '@sveltejs/kit/vite';
|
import { sveltekit } from '@sveltejs/kit/vite';
|
||||||
import { defineConfig } from 'vite';
|
import { defineConfig } from 'vite';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [sveltekit()]
|
plugins: [sveltekit()],
|
||||||
|
server: {
|
||||||
|
https: {
|
||||||
|
key: fs.readFileSync(path.resolve(__dirname, 'certs/llave_privada.key')),
|
||||||
|
cert: fs.readFileSync(path.resolve(__dirname, 'certs/certificado_completo.pem'))
|
||||||
|
},
|
||||||
|
port: 3000,
|
||||||
|
host: '0.0.0.0'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user