chore(dev): add HTTPS Vite dev server and HTTP launch profile
Serve Vite over HTTPS on :7081 using a certificate exported from dotnet dev-certs (scripts/dev-certs.ps1). Add an http launch profile on :5078 as the default backend and point the /api proxy at it, so dev runs on defaults without env vars.
This commit is contained in:
@@ -1,6 +1,15 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"http": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": false,
|
||||||
|
"applicationUrl": "http://localhost:5078",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
"https": {
|
"https": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"dotnetRunMessages": true,
|
"dotnetRunMessages": true,
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ dist
|
|||||||
dist-ssr
|
dist-ssr
|
||||||
*.local
|
*.local
|
||||||
|
|
||||||
|
# Lokalne certyfikaty dev (scripts/dev-certs.ps1)
|
||||||
|
.certs/
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/extensions.json
|
!.vscode/extensions.json
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
"certs": "pwsh ../scripts/dev-certs.ps1",
|
||||||
"build": "vue-tsc -b && vite build",
|
"build": "vue-tsc -b && vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"copy": "node ../scripts/copy-client.mjs",
|
"copy": "node ../scripts/copy-client.mjs",
|
||||||
|
|||||||
+20
-1
@@ -1,11 +1,30 @@
|
|||||||
|
import fs from 'node:fs'
|
||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
|
|
||||||
|
// Certyfikat PEM wygenerowany przez scripts/dev-certs.ps1 (dotnet dev-certs https).
|
||||||
|
const certDir = fileURLToPath(new URL('./.certs', import.meta.url))
|
||||||
|
const certFile = `${certDir}/dev.pem`
|
||||||
|
const keyFile = `${certDir}/dev-key.pem`
|
||||||
|
const hasCerts = fs.existsSync(certFile) && fs.existsSync(keyFile)
|
||||||
|
|
||||||
|
if (!hasCerts) {
|
||||||
|
console.warn(
|
||||||
|
'[vite] Brak certyfikatów w client/.certs — dev-server wstanie po HTTP. ' +
|
||||||
|
'Uruchom: pwsh ../scripts/dev-certs.ps1 (z katalogu client/).',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Domyślnie backend z profilu `http` (launchSettings.json), port 5078.
|
||||||
// https://vite.dev/config/
|
// https://vite.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [vue()],
|
plugins: [vue()],
|
||||||
server: {
|
server: {
|
||||||
port: 5173,
|
port: 7081,
|
||||||
|
https: hasCerts
|
||||||
|
? { cert: fs.readFileSync(certFile), key: fs.readFileSync(keyFile) }
|
||||||
|
: undefined,
|
||||||
proxy: {
|
proxy: {
|
||||||
'/api': {
|
'/api': {
|
||||||
target: 'http://localhost:5078',
|
target: 'http://localhost:5078',
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Eksportuje certyfikat deweloperski ASP.NET Core (dotnet dev-certs) do formatu
|
||||||
|
PEM używanego przez dev-serwer Vite (HTTPS).
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Zapewnia istnienie zaufanego certyfikatu deweloperskiego `dotnet dev-certs https`,
|
||||||
|
a następnie eksportuje go do plików PEM (certyfikat + klucz prywatny) w katalogu
|
||||||
|
client/.certs. Pliki są ignorowane przez Git i służą wyłącznie lokalnemu dev.
|
||||||
|
|
||||||
|
Wymagany PowerShell Core 7+ (`pwsh`) — używamy metod PEM z .NET 7+.
|
||||||
|
#>
|
||||||
|
param(
|
||||||
|
[string]$OutDir = (Join-Path $PSScriptRoot "..\client\.certs"),
|
||||||
|
[string]$Password = "tarninahub-dev",
|
||||||
|
[switch]$NoTrust
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
if (-not (Get-Command dotnet -ErrorAction SilentlyContinue)) {
|
||||||
|
throw "Nie znaleziono 'dotnet' w PATH. Zainstaluj .NET SDK 10+: https://dotnet.microsoft.com/download"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($NoTrust) {
|
||||||
|
dotnet dev-certs https | Out-Host
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dotnet dev-certs https --trust | Out-Host
|
||||||
|
}
|
||||||
|
|
||||||
|
$resolvedOut = [System.IO.Path]::GetFullPath($OutDir)
|
||||||
|
New-Item -ItemType Directory -Force -Path $resolvedOut | Out-Null
|
||||||
|
|
||||||
|
$pfxPath = Join-Path ([System.IO.Path]::GetTempPath()) ("tarninahub-dev-" + [guid]::NewGuid().ToString("N") + ".pfx")
|
||||||
|
$certPath = Join-Path $resolvedOut "dev.pem"
|
||||||
|
$keyPath = Join-Path $resolvedOut "dev-key.pem"
|
||||||
|
|
||||||
|
try {
|
||||||
|
dotnet dev-certs https --export-path $pfxPath --password $Password | Out-Host
|
||||||
|
|
||||||
|
$flags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable
|
||||||
|
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($pfxPath, $Password, $flags)
|
||||||
|
|
||||||
|
$certPem = [System.Security.Cryptography.PemEncoding]::Write(
|
||||||
|
"CERTIFICATE", $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert))
|
||||||
|
|
||||||
|
$privateKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert)
|
||||||
|
if (-not $privateKey) {
|
||||||
|
$privateKey = [System.Security.Cryptography.X509Certificates.ECDsaCertificateExtensions]::GetECDsaPrivateKey($cert)
|
||||||
|
}
|
||||||
|
if (-not $privateKey) { throw "Certyfikat deweloperski nie zawiera klucza prywatnego (RSA/ECDSA)." }
|
||||||
|
|
||||||
|
$keyPem = [System.Security.Cryptography.PemEncoding]::Write("PRIVATE KEY", $privateKey.ExportPkcs8PrivateKey())
|
||||||
|
|
||||||
|
[System.IO.File]::WriteAllText($certPath, $certPem)
|
||||||
|
[System.IO.File]::WriteAllText($keyPath, $keyPem)
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (Test-Path -LiteralPath $pfxPath) {
|
||||||
|
Remove-Item -LiteralPath $pfxPath -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Certyfikat PEM: $certPath"
|
||||||
|
Write-Host "Klucz prywatny: $keyPath"
|
||||||
Reference in New Issue
Block a user