최초 배포

This commit is contained in:
2026-01-27 16:55:03 +09:00
commit 6ebf8e8df7
76 changed files with 5990 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

13
backend/data/config.json Normal file
View File

@@ -0,0 +1,13 @@
{
"enabled": true,
"passwordHash": "d7fe5080df575511eb7b3c5e50a99c0402952461f5e202e8c90461c1e52d208a9c14329317d5b39ec85de62caca369114295d559466e044d9f8b3a5e94b5ebd3",
"salt": "ced784250b4ed141397cc2115e864dac",
"retentionHours": 24,
"alertThresholds": {
"cpu": 80,
"memory": 80,
"disk": 90
},
"containerAlertEnabled": false,
"alertCooldownSeconds": 300
}

View File

@@ -0,0 +1,30 @@
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
// 이미 /app/data 내에서 실행되므로 현재 디렉토리가 data 폴더임
const DATA_DIR = __dirname;
const svgPath = path.join(DATA_DIR, 'icon.svg');
// icon.svg가 존재하는지 확인
if (!fs.existsSync(svgPath)) {
console.error(`File not found: ${svgPath}`);
process.exit(1);
}
const svgBuffer = fs.readFileSync(svgPath);
async function convert() {
try {
console.log('Converting icons from:', svgPath);
await sharp(svgBuffer).resize(64, 64).png().toFile(path.join(DATA_DIR, 'favicon.png'));
await sharp(svgBuffer).resize(192, 192).png().toFile(path.join(DATA_DIR, 'pwa-192x192.png'));
await sharp(svgBuffer).resize(512, 512).png().toFile(path.join(DATA_DIR, 'pwa-512x512.png'));
await sharp(svgBuffer).resize(180, 180).png().toFile(path.join(DATA_DIR, 'apple-touch-icon.png'));
console.log('Conversion complete. Files saved to:', DATA_DIR);
} catch (err) {
console.error('Error converting icons:', err);
process.exit(1);
}
}
convert();

BIN
backend/data/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

File diff suppressed because one or more lines are too long

49
backend/data/icon.svg Normal file
View File

@@ -0,0 +1,49 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="paint0_linear" x1="0" y1="0" x2="512" y2="512" gradientUnits="userSpaceOnUse">
<stop stop-color="#2563eb"/>
<stop offset="1" stop-color="#06b6d4"/>
</linearGradient>
<filter id="dropshadow" height="130%">
<feGaussianBlur in="SourceAlpha" stdDeviation="15"/>
<feOffset dx="0" dy="10" result="offsetblur"/>
<feComponentTransfer>
<feFuncA type="linear" slope="0.3"/>
</feComponentTransfer>
<feMerge>
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<!-- Background: Royal Blue (Adjusted from Deep Navy) -->
<rect width="512" height="512" fill="#1e3a8a"/>
<!-- Main Hexagon Shape (Scaled Down to 85% and Centered using Matrix) -->
<!-- Matrix calc: Scale 0.85. Offset = (512 - 512*0.85)/2 = 38.4 -->
<g filter="url(#dropshadow)" transform="matrix(0.85, 0, 0, 0.85, 38.4, 38.4)">
<path d="M256 50
L433 152
L433 357
L256 460
L79 357
L79 152
Z"
fill="url(#paint0_linear)"
stroke="white"
stroke-width="20"
stroke-linejoin="round"/>
<!-- Internal Cube Lines (Y shape) -->
<path d="M256 460 L256 255" stroke="white" stroke-width="20" stroke-linecap="round"/>
<path d="M256 255 L433 152" stroke="white" stroke-width="20" stroke-linecap="round"/>
<path d="M79 152 L256 255" stroke="white" stroke-width="20" stroke-linecap="round"/>
<!-- Tech Accent Dots -->
<circle cx="256" cy="255" r="30" fill="white"/>
<circle cx="256" cy="110" r="15" fill="white" fill-opacity="0.6"/>
<circle cx="380" cy="320" r="15" fill="white" fill-opacity="0.6"/>
<circle cx="132" cy="320" r="15" fill="white" fill-opacity="0.6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1 @@
[]

1
backend/data/vapid.json Normal file
View File

@@ -0,0 +1 @@
{"publicKey":"BFOD5bzNh9Dch_Rjt8cpWc2IfSktAoEUx0virpARRvPfpmsuvQka3ppCa0WajNFaIJS7Z62VNUAeo_6yMBvLVZA","privateKey":"ymBn65iLw_M19FJPdzJ7FqA7jgHVBCfSV6vSdM_8GIw"}