dev-1.7.0 #294
13
.env
Normal file
13
.env
Normal file
@@ -0,0 +1,13 @@
|
||||
# Termix Auto-generated Configuration
|
||||
|
||||
|
||||
# Security Keys (Auto-generated)
|
||||
DATABASE_KEY=8a731dc798578dba00002b325f8f7ce941e0c93220062c670808c536a9ff336b
|
||||
|
||||
# SSL Configuration (Auto-generated)
|
||||
ENABLE_SSL=false
|
||||
SSL_PORT=8443
|
||||
SSL_CERT_PATH=/Users/zacharyzcr/WebstormProjects/Termix/ssl/termix.crt
|
||||
SSL_KEY_PATH=/Users/zacharyzcr/WebstormProjects/Termix/ssl/termix.key
|
||||
SSL_DOMAIN=localhost
|
||||
JWT_SECRET=f200e28053a39d216667c503e39124cbd3acaa23b45628ed0b8ce364b9072d6a
|
||||
44
Dockerfile
44
Dockerfile
@@ -1,44 +0,0 @@
|
||||
# Termix Docker Image with Auto-SSL Configuration
|
||||
FROM node:18-slim
|
||||
|
||||
# Install OpenSSL for SSL certificate generation
|
||||
RUN apt-get update && apt-get install -y \
|
||||
openssl \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies
|
||||
RUN npm ci --only=production
|
||||
|
||||
# Copy application source
|
||||
COPY . .
|
||||
|
||||
# Build the application
|
||||
RUN npm run build:backend
|
||||
|
||||
# Create directories for SSL certificates and data
|
||||
RUN mkdir -p /app/ssl /app/data
|
||||
|
||||
# Set proper permissions
|
||||
RUN chown -R node:node /app
|
||||
|
||||
# Switch to non-root user
|
||||
USER node
|
||||
|
||||
# Expose ports
|
||||
EXPOSE 8080 8443
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
||||
CMD curl -f -k https://localhost:8443/health 2>/dev/null || \
|
||||
curl -f http://localhost:8080/health 2>/dev/null || \
|
||||
exit 1
|
||||
|
||||
# Default command - SSL is auto-configured during startup
|
||||
CMD ["npm", "start"]
|
||||
@@ -1,83 +0,0 @@
|
||||
# Termix Default Docker Compose Configuration
|
||||
# SSL/TLS enabled by default for secure connections
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
termix:
|
||||
build: .
|
||||
ports:
|
||||
# HTTP port (redirects to HTTPS)
|
||||
- "${PORT:-8080}:8080"
|
||||
# HTTPS port (default enabled)
|
||||
- "${SSL_PORT:-8443}:8443"
|
||||
environment:
|
||||
# SSL Configuration (enabled by default)
|
||||
- ENABLE_SSL=true
|
||||
- SSL_PORT=${SSL_PORT:-8443}
|
||||
- SSL_DOMAIN=${SSL_DOMAIN:-localhost}
|
||||
|
||||
# SSL Certificate paths (auto-generated inside container)
|
||||
- SSL_CERT_PATH=/app/ssl/termix.crt
|
||||
- SSL_KEY_PATH=/app/ssl/termix.key
|
||||
|
||||
# Security keys (auto-generated on first startup if not provided)
|
||||
- JWT_SECRET=${JWT_SECRET:-}
|
||||
- DATABASE_KEY=${DATABASE_KEY:-}
|
||||
|
||||
# Server configuration
|
||||
- PORT=${PORT:-8080}
|
||||
- NODE_ENV=${NODE_ENV:-production}
|
||||
|
||||
# CORS configuration (allow all origins by default)
|
||||
- ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-*}
|
||||
|
||||
# Database configuration
|
||||
- DATABASE_ENCRYPTION=${DATABASE_ENCRYPTION:-true}
|
||||
|
||||
volumes:
|
||||
# Persist SSL certificates (auto-generated)
|
||||
- ssl_certs:/app/ssl
|
||||
# Persist database and data
|
||||
- termix_data:/app/data
|
||||
# Optional: Mount custom SSL certificates
|
||||
# - ./ssl:/app/ssl:ro
|
||||
|
||||
# Health check for HTTPS (with fallback to HTTP)
|
||||
healthcheck:
|
||||
test: |
|
||||
curl -f -k https://localhost:8443/health 2>/dev/null ||
|
||||
curl -f http://localhost:8080/health 2>/dev/null ||
|
||||
exit 1
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
# SSL is automatically configured during startup
|
||||
# No additional scripts needed - integrated into application startup
|
||||
|
||||
volumes:
|
||||
ssl_certs:
|
||||
driver: local
|
||||
termix_data:
|
||||
driver: local
|
||||
|
||||
# Quick Start:
|
||||
# 1. Run: docker-compose up
|
||||
# 2. Access: https://localhost:8443 (HTTPS with auto-generated certificates)
|
||||
# 3. Alt: http://localhost:8080 (HTTP redirects to HTTPS)
|
||||
#
|
||||
# The application will automatically:
|
||||
# - Generate SSL certificates on first startup
|
||||
# - Generate JWT and database encryption keys
|
||||
# - Enable HTTPS/WSS connections
|
||||
# - Display connection information in logs
|
||||
#
|
||||
# Optional .env file configuration:
|
||||
# SSL_PORT=8443
|
||||
# SSL_DOMAIN=yourdomain.com
|
||||
# JWT_SECRET=your_custom_jwt_secret_64_chars
|
||||
# DATABASE_KEY=your_custom_database_key_64_chars
|
||||
@@ -45,7 +45,7 @@ ENV npm_config_target_platform=linux
|
||||
ENV npm_config_target_arch=x64
|
||||
ENV npm_config_target_libc=glibc
|
||||
|
||||
RUN npm ci --only=production --ignore-scripts --force && \
|
||||
RUN npm ci --omit=dev --ignore-scripts --force && \
|
||||
npm cache clean --force
|
||||
|
||||
# Stage 5: Build native modules
|
||||
@@ -61,7 +61,7 @@ ENV npm_config_target_arch=x64
|
||||
ENV npm_config_target_libc=glibc
|
||||
|
||||
# Install native modules and compile them properly
|
||||
RUN npm ci --only=production --force && \
|
||||
RUN npm ci --omit=dev --force && \
|
||||
npm rebuild better-sqlite3 bcryptjs --force && \
|
||||
npm cache clean --force
|
||||
|
||||
@@ -71,9 +71,9 @@ ENV DATA_DIR=/app/data \
|
||||
PORT=8080 \
|
||||
NODE_ENV=production
|
||||
|
||||
RUN apk add --no-cache nginx gettext su-exec && \
|
||||
mkdir -p /app/data && \
|
||||
chown -R node:node /app/data
|
||||
RUN apk add --no-cache nginx gettext su-exec openssl && \
|
||||
mkdir -p /app/data /app/config && \
|
||||
chown -R node:node /app/data /app/config
|
||||
|
||||
COPY docker/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY docker/nginx-https.conf /etc/nginx/nginx-https.conf
|
||||
@@ -87,7 +87,8 @@ COPY --from=native-builder /app/node_modules /app/node_modules
|
||||
COPY --from=backend-builder /app/dist/backend ./dist/backend
|
||||
|
||||
COPY package.json ./
|
||||
RUN chown -R node:node /app
|
||||
RUN chown -R node:node /app && \
|
||||
chmod 755 /app/config
|
||||
|
||||
VOLUME ["/app/data"]
|
||||
|
||||
|
||||
@@ -1,15 +1,55 @@
|
||||
services:
|
||||
termix:
|
||||
image: ghcr.io/lukegus/termix:latest
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: termix
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
# HTTP port (redirects to HTTPS if SSL enabled)
|
||||
- "${PORT:-8080}:8080"
|
||||
# HTTPS port (when SSL is enabled)
|
||||
- "${SSL_PORT:-8443}:8443"
|
||||
volumes:
|
||||
- termix-data:/app/data
|
||||
- termix-config:/app/config
|
||||
# Optional: Mount custom SSL certificates
|
||||
# - ./ssl:/app/ssl:ro
|
||||
environment:
|
||||
PORT: "8080"
|
||||
# Basic configuration
|
||||
- PORT=${PORT:-8080}
|
||||
- NODE_ENV=${NODE_ENV:-production}
|
||||
|
||||
# SSL/TLS Configuration
|
||||
- ENABLE_SSL=${ENABLE_SSL:-false}
|
||||
- SSL_PORT=${SSL_PORT:-8443}
|
||||
- SSL_DOMAIN=${SSL_DOMAIN:-localhost}
|
||||
- SSL_CERT_PATH=${SSL_CERT_PATH:-/app/ssl/termix.crt}
|
||||
- SSL_KEY_PATH=${SSL_KEY_PATH:-/app/ssl/termix.key}
|
||||
|
||||
# Security keys (set these for production)
|
||||
- JWT_SECRET=${JWT_SECRET:-}
|
||||
- DATABASE_KEY=${DATABASE_KEY:-}
|
||||
|
||||
# Database configuration
|
||||
- DATABASE_ENCRYPTION=${DATABASE_ENCRYPTION:-true}
|
||||
|
||||
# CORS configuration
|
||||
- ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-*}
|
||||
|
||||
# Health check for both HTTP and HTTPS
|
||||
healthcheck:
|
||||
test: |
|
||||
curl -f -k https://localhost:8443/health 2>/dev/null ||
|
||||
curl -f http://localhost:8080/health 2>/dev/null ||
|
||||
exit 1
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
volumes:
|
||||
termix-data:
|
||||
driver: local
|
||||
|
|
||||
termix-config:
|
||||
driver: local
|
||||
|
||||
113
package-lock.json
generated
113
package-lock.json
generated
@@ -1255,72 +1255,6 @@
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/windows-sign": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
|
||||
"integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"cross-dirname": "^0.1.0",
|
||||
"debug": "^4.3.4",
|
||||
"fs-extra": "^11.1.1",
|
||||
"minimist": "^1.2.8",
|
||||
"postject": "^1.0.0-alpha.6"
|
||||
},
|
||||
"bin": {
|
||||
"electron-windows-sign": "bin/electron-windows-sign.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/windows-sign/node_modules/fs-extra": {
|
||||
"version": "11.3.1",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz",
|
||||
"integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/windows-sign/node_modules/jsonfile": {
|
||||
"version": "6.2.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
|
||||
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/windows-sign/node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@epic-web/invariant": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz",
|
||||
@@ -7692,15 +7626,6 @@
|
||||
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/cross-dirname": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
|
||||
"integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/cross-env": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz",
|
||||
@@ -13398,36 +13323,6 @@
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/postject": {
|
||||
"version": "1.0.0-alpha.6",
|
||||
"resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",
|
||||
"integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"commander": "^9.4.0"
|
||||
},
|
||||
"bin": {
|
||||
"postject": "dist/cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/postject/node_modules/commander": {
|
||||
"version": "9.5.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
|
||||
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": "^12.20.0 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/prebuild-install": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
|
||||
@@ -14934,14 +14829,6 @@
|
||||
"license": "BSD-3-Clause",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/sql.js": {
|
||||
"version": "1.13.0",
|
||||
"resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.13.0.tgz",
|
||||
"integrity": "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/ssh2": {
|
||||
"version": "1.17.0",
|
||||
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz",
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
// node ./dist/backend/starter.js
|
||||
|
||||
import "dotenv/config";
|
||||
import dotenv from "dotenv";
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
import { AutoSSLSetup } from "./utils/auto-ssl-setup.js";
|
||||
import { AuthManager } from "./utils/auth-manager.js";
|
||||
import { DataCrypto } from "./utils/data-crypto.js";
|
||||
@@ -9,6 +12,22 @@ import { systemLogger, versionLogger } from "./utils/logger.js";
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
// Load persistent .env file from config directory if available (Docker)
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
try {
|
||||
await fs.access('/app/config/.env');
|
||||
dotenv.config({ path: '/app/config/.env' });
|
||||
systemLogger.info("Loaded persistent configuration from /app/config/.env", {
|
||||
operation: "config_load"
|
||||
});
|
||||
} catch {
|
||||
// Config file doesn't exist yet, will be created on first run
|
||||
systemLogger.info("No persistent config found, will create on first run", {
|
||||
operation: "config_init"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const version = process.env.VERSION || "unknown";
|
||||
versionLogger.info(`Termix Backend starting - Version: ${version}`, {
|
||||
operation: "startup",
|
||||
@@ -36,15 +55,21 @@ import { systemLogger, versionLogger } from "./utils/logger.js";
|
||||
|
||||
const securityIssues: string[] = [];
|
||||
|
||||
// Check JWT and database keys (auto-generated if missing)
|
||||
// Check JWT and database keys (auto-generated if missing - warnings only)
|
||||
if (!process.env.JWT_SECRET) {
|
||||
securityIssues.push("JWT_SECRET should be set as environment variable in production");
|
||||
systemLogger.warn("JWT_SECRET not set - using auto-generated keys (consider setting for production)", {
|
||||
operation: "security_warning",
|
||||
note: "Auto-generated keys are secure but not persistent across deployments"
|
||||
});
|
||||
} else if (process.env.JWT_SECRET.length < 64) {
|
||||
securityIssues.push("JWT_SECRET should be at least 64 characters in production");
|
||||
}
|
||||
|
||||
if (!process.env.DATABASE_KEY) {
|
||||
securityIssues.push("DATABASE_KEY should be set as environment variable in production");
|
||||
systemLogger.warn("DATABASE_KEY not set - using auto-generated keys (consider setting for production)", {
|
||||
operation: "security_warning",
|
||||
note: "Auto-generated keys are secure but not persistent across deployments"
|
||||
});
|
||||
} else if (process.env.DATABASE_KEY.length < 64) {
|
||||
securityIssues.push("DATABASE_KEY should be at least 64 characters in production");
|
||||
}
|
||||
@@ -54,13 +79,6 @@ import { systemLogger, versionLogger } from "./utils/logger.js";
|
||||
securityIssues.push("Database file encryption should be enabled in production");
|
||||
}
|
||||
|
||||
// Check JWT secret
|
||||
if (!process.env.JWT_SECRET) {
|
||||
systemLogger.info("JWT_SECRET not set - will use encrypted storage", {
|
||||
operation: "security_checks",
|
||||
note: "Using encrypted JWT storage"
|
||||
});
|
||||
}
|
||||
|
||||
// Check CORS configuration warning
|
||||
systemLogger.warn("Production deployment detected - ensure CORS is properly configured", {
|
||||
|
||||
@@ -209,7 +209,12 @@ class SystemCrypto {
|
||||
* Update .env file with new environment variable
|
||||
*/
|
||||
private async updateEnvFile(key: string, value: string): Promise<void> {
|
||||
const envPath = path.join(process.cwd(), ".env");
|
||||
// Use persistent config directory if available (Docker), otherwise use current directory
|
||||
const configDir = process.env.NODE_ENV === 'production' &&
|
||||
await fs.access('/app/config').then(() => true).catch(() => false)
|
||||
? '/app/config'
|
||||
: process.cwd();
|
||||
const envPath = path.join(configDir, ".env");
|
||||
|
||||
try {
|
||||
let envContent = "";
|
||||
|
||||
24
ssl/termix.crt
Normal file
24
ssl/termix.crt
Normal file
@@ -0,0 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID/zCCAuegAwIBAgIUTPIoBu3lyT70xPH7WYr4Ow/cgbIwDQYJKoZIhvcNAQEL
|
||||
BQAwaTELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
|
||||
MQ8wDQYDVQQKDAZUZXJtaXgxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxEjAQBgNV
|
||||
BAMMCWxvY2FsaG9zdDAeFw0yNTA5MjIyMjAzMTNaFw0yNjA5MjIyMjAzMTNaMGkx
|
||||
CzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEPMA0G
|
||||
A1UECgwGVGVybWl4MRYwFAYDVQQLDA1JVCBEZXBhcnRtZW50MRIwEAYDVQQDDAls
|
||||
b2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5H+LHG8Ub
|
||||
p7fyxG6yqKmaP17pY5QlPnySBvmbgHclqRc5ymVcrghBa9q7pgkEmDrR2LH+oge/
|
||||
al6dvH7c9F7Z9pgaVaBnmbuPzyJerewVANXy7RtxA248xYGJ5U7Mr6ApWSaSBVwO
|
||||
UwTjKozjPvjFl+TbVrTZajSS+Qyx8bmThqJALnVeyolF87CXjZqrGqe1/+pWvrkz
|
||||
ts4uvTzUrVWTtRP4avAOsA60KMCpFVmdIdNFmOwMNAQTrOKHMd8hfODUE7d9Xvcs
|
||||
dTXiZGXXbv73LD6bEnbtG5RDYU6NkqDC8hyClVgTPujTMC9Fl3LxGQFZ4ni0Ua33
|
||||
XXS+uNyX4rafAgMBAAGjgZ4wgZswCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwYgYD
|
||||
VR0RBFswWYIJbG9jYWxob3N0ggkxMjcuMC4wLjGCCyoubG9jYWxob3N0ggx0ZXJt
|
||||
aXgubG9jYWyCDioudGVybWl4LmxvY2FshwR/AAABhxAAAAAAAAAAAAAAAAAAAAAB
|
||||
MB0GA1UdDgQWBBQ/oPi5PKU6VNUBfpZSGDWjvqB0eDANBgkqhkiG9w0BAQsFAAOC
|
||||
AQEAti0BW7JckfJMcVVFb8eINTwlSsk+MoGORHIjTsaw2o2lQUmukm0I0dfuG1ef
|
||||
6YKoW5zMRFL8HumlzGB9JWcbmMoWxPv8/oHk4yuYO6zfo17PK6NxfZTlmMdmezm5
|
||||
vt0RDIhZScRQxDeiZomDB6ECamMdCUicUg9Ce+xZktVN1GdhCVNK/ReUtvONJ6JQ
|
||||
leIcWOTXG2oOe4OiaHaEmRbOXOjLN+Ii2beacRXxCV5pZBMp0KCDq2FCTn+ffAMZ
|
||||
0cQ81S5NrWHUNVwzpapJiH2k8EhnRisc3KXFoNJ+kytSdQa6SkxDAb4G6JhYT+Il
|
||||
cahHz3r7n1/Q3D3mVSVx+CPBdw==
|
||||
-----END CERTIFICATE-----
|
||||
28
ssl/termix.key
Normal file
28
ssl/termix.key
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC5H+LHG8Ubp7fy
|
||||
xG6yqKmaP17pY5QlPnySBvmbgHclqRc5ymVcrghBa9q7pgkEmDrR2LH+oge/al6d
|
||||
vH7c9F7Z9pgaVaBnmbuPzyJerewVANXy7RtxA248xYGJ5U7Mr6ApWSaSBVwOUwTj
|
||||
KozjPvjFl+TbVrTZajSS+Qyx8bmThqJALnVeyolF87CXjZqrGqe1/+pWvrkzts4u
|
||||
vTzUrVWTtRP4avAOsA60KMCpFVmdIdNFmOwMNAQTrOKHMd8hfODUE7d9XvcsdTXi
|
||||
ZGXXbv73LD6bEnbtG5RDYU6NkqDC8hyClVgTPujTMC9Fl3LxGQFZ4ni0Ua33XXS+
|
||||
uNyX4rafAgMBAAECggEAQLRq5NIJfmWMT1+mG28FPMMajvO9s5jYHIgwlU/9FR45
|
||||
XnsmG5M+knM6tCzP6Rm2MWOOryP+FkL9CB/6rYsCXiepOUcldiCPJLAu4K3knuC4
|
||||
ZxzF4yXiUX5tDQAnnzZhgiJFb3NNHjqZMjdMoB8B/7pcBOgU9QsAjkBbVhTZmryz
|
||||
UkmDqa6DZYgFHZfNVPVKi7CvhNeJE5gDeUSKjpPWwuI6k9dUWQ7oXgEfwXiYKQDa
|
||||
xnU3HXI+7kSomRCKPSgxZygHrtHW/0l+hLAr0D3pL89AaDqJDqj8H/HJyHsHj9hn
|
||||
ONKXZeyhs+B/vO/MsofKWw9yQfkZwcEQNXRmG+IM0QKBgQDhaBl0qnxWNRjSUh+Q
|
||||
irt0Cuef9pofYDRLTr6/1uqD7eBp5RtAdSjfVBhaiKu7t8co/b7VVcn72p5ubShb
|
||||
ApZbd5SGLJeynxI+1jBh1o7DO54P9j456oO9Tl5ra+5xQOPUABnsedS5D2D9pAvj
|
||||
K8zpq6tdw6xqR49Uq7rNyiY7jwKBgQDSQCi9aYgHMzdRp7pk1/kmPDMjYfVchQEB
|
||||
KLzWa1G3ItmD3rUfH/zW/1qR/DigOwc3qb885hBlv3qSAuyHMR4ugn7b8dyLCA7/
|
||||
UNZwqWk7xl5luW6yYHyYZqSTvwh+fUGS+kGG37GjWHlcpzu20MOJLcA5VtslckuT
|
||||
JuJecJKL8QKBgA06VLQaBS3x88Dz/NI4sgN/WFR03lqVBLyepGcRr7WKUi8kuNKx
|
||||
jXJ9tugpORrNEC0Bpx9R54aWL9H/Ke0dW8GGZPryxvw+hY2WeERlmP8wEniRVNmF
|
||||
P7HuVXAsZ1PSIQyh7OOJysgJdQGtjN0KBv53ipj4ELgz9t9bLJ1DDbdVAoGBANF+
|
||||
VlmtTnoGIUe+fa4/uKTNdRL7Z3ThngeepNJtqsV09xE7lnNF9zPuyjsN+wpE5sMi
|
||||
40d14b7QVPwp564pVe533pmfW+Y4iGEEFje5xf5mgOaRJuib1WoxVClXPspyWiVu
|
||||
MF6Ig8LDxGF6zLgzObJ1IMTBc6jTQtSD+SiquIqxAoGAdXPEEtpasCHaKCmhFgAt
|
||||
kkPvUkR+TEKh+F2awHf/WmNwCpE8NsXhdyGgNh1PP8XU9+xYRegtdU3cGQmAOCLz
|
||||
wTSLQczr0APrCbEXu2wmMJX051/zBt9dwaEwwIEBj0ZcZ2wEVwvKl+5jxIDrgOfW
|
||||
Ho14/p6rLWL000/ZbCeIpH0=
|
||||
-----END PRIVATE KEY-----
|
||||
Reference in New Issue
Block a user
Setting
ALLOWED_ORIGINSto*by default poses a significant security risk in production environments, as it permits cross-origin requests from any domain. For a more secure default configuration, consider changing this to a more restrictive value, for example, an empty string or a specific development URL likehttp://localhost:8080. The accompanying documentation should strongly advise users to configure this with their specific domain for production deployments.