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*.json ./
|
||||
|
||||
# Install dependencies
|
||||
RUN npm ci
|
||||
# Install dependencies (force reinstall for Alpine Linux compatibility)
|
||||
RUN rm -rf node_modules package-lock.json && \
|
||||
npm cache clean --force && \
|
||||
npm install
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
@@ -24,10 +26,12 @@ WORKDIR /app
|
||||
# Copy built application and dependencies
|
||||
COPY --from=builder /app/build build/
|
||||
COPY --from=builder /app/node_modules node_modules/
|
||||
COPY --from=builder /app/server.js .
|
||||
COPY --from=builder /app/certs certs/
|
||||
COPY package.json .
|
||||
|
||||
# Expose port
|
||||
# Expose HTTPS port
|
||||
EXPOSE 3000
|
||||
|
||||
# Start the application
|
||||
CMD ["node", "build"]
|
||||
# Start the application with HTTPS
|
||||
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-----
|
||||
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
|
||||
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
|
||||
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
|
||||
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
|
||||
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
|
||||
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
|
||||
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
|
||||
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
|
||||
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
|
||||
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
|
||||
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
|
||||
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
|
||||
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
|
||||
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
|
||||
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
|
||||
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
|
||||
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
|
||||
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
|
||||
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
|
||||
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
|
||||
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
|
||||
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
|
||||
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
|
||||
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
|
||||
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
|
||||
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
|
||||
-----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:
|
||||
app:
|
||||
build: .
|
||||
@@ -22,13 +20,59 @@ services:
|
||||
- DB_AZURE_PASS=${DB_AZURE_PASS}
|
||||
- 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
|
||||
- BACKUP_PATH=/data/backups
|
||||
|
||||
- PORT=3000
|
||||
- ORIGIN=http://localhost:3000
|
||||
- ORIGIN=https://localhost:3000
|
||||
- NODE_ENV=production
|
||||
volumes:
|
||||
# Map a local folder to the container's backup path
|
||||
- ./backups:/data/backups:ro
|
||||
# Map the actual backup folder from host to the container's backup path
|
||||
# Windows path D:/BackupSFTP/ mapped to /data/backups inside container (read-only)
|
||||
- D:/BackupSFTP:/data/backups:ro
|
||||
extra_hosts:
|
||||
- "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",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"start": "node server.js",
|
||||
"check": "svelte-kit sync && tsc --noEmit"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -31,6 +32,7 @@
|
||||
"bcrypt": "^6.0.0",
|
||||
"bootstrap": "^5.3.3",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.18.2",
|
||||
"jsonwebtoken": "^9.0.3",
|
||||
"mssql": "^10.0.2",
|
||||
"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);
|
||||
}
|
||||
|
||||
// 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;
|
||||
notRestoredCount = 0;
|
||||
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
||||
|
||||
for (const db of databaseRows) {
|
||||
// Buscar backups de esta base de datos en las últimas 24 horas
|
||||
// Comparar usando NodoSubNodo (de la BD) con nodo_name (del archivo de backup)
|
||||
const recentBackups = backupFiles.filter(backup => {
|
||||
const backupNodo = (backup.nodo_name || '').toLowerCase();
|
||||
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) {
|
||||
// Verificar si tiene una restauración en las últimas 24 horas
|
||||
if (db.last_restore_date) {
|
||||
const restoreDate = new Date(db.last_restore_date);
|
||||
if (restoreDate > oneDayAgo) {
|
||||
restoredCount++;
|
||||
} else {
|
||||
notRestoredCount++;
|
||||
}
|
||||
} else {
|
||||
notRestoredCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// Aplicar filtro de permisos de usuario (si no es admin)
|
||||
@@ -423,23 +415,17 @@ export const load: PageServerLoad = async ({ cookies }) => {
|
||||
restoredCount = 0;
|
||||
notRestoredCount = 0;
|
||||
for (const db of databaseRows) {
|
||||
const recentBackups = backupFiles.filter(backup => {
|
||||
const backupNodo = (backup.nodo_name || '').toLowerCase();
|
||||
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) {
|
||||
// Verificar si tiene una restauración en las últimas 24 horas
|
||||
if (db.last_restore_date) {
|
||||
const restoreDate = new Date(db.last_restore_date);
|
||||
if (restoreDate > oneDayAgo) {
|
||||
restoredCount++;
|
||||
} else {
|
||||
notRestoredCount++;
|
||||
}
|
||||
} else {
|
||||
notRestoredCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,10 @@ const config = {
|
||||
|
||||
kit: {
|
||||
// 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 { defineConfig } from 'vite';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
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