Docker düzenlemesi
This commit is contained in:
parent
c26f0cb5bc
commit
3ac72ad19b
4 changed files with 84 additions and 16 deletions
|
|
@ -44,6 +44,7 @@ COPY "src/Sozsoft.Platform.EntityFrameworkCore/Sozsoft.Platform.EntityFrameworkC
|
||||||
COPY "src/Sozsoft.Platform.HttpApi/Sozsoft.Platform.HttpApi.csproj" "src/Sozsoft.Platform.HttpApi/"
|
COPY "src/Sozsoft.Platform.HttpApi/Sozsoft.Platform.HttpApi.csproj" "src/Sozsoft.Platform.HttpApi/"
|
||||||
COPY "src/Sozsoft.Platform.HttpApi.Client/Sozsoft.Platform.HttpApi.Client.csproj" "src/Sozsoft.Platform.HttpApi.Client/"
|
COPY "src/Sozsoft.Platform.HttpApi.Client/Sozsoft.Platform.HttpApi.Client.csproj" "src/Sozsoft.Platform.HttpApi.Client/"
|
||||||
COPY "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj" "src/Sozsoft.Platform.HttpApi.Host/"
|
COPY "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj" "src/Sozsoft.Platform.HttpApi.Host/"
|
||||||
|
COPY "src/Sozsoft.Platform.DbMigrator/Sozsoft.Platform.DbMigrator.csproj" "src/Sozsoft.Platform.DbMigrator/"
|
||||||
COPY "test/Sozsoft.Platform.EntityFrameworkCore.Tests/Sozsoft.Platform.EntityFrameworkCore.Tests.csproj" "test/Sozsoft.Platform.EntityFrameworkCore.Tests/"
|
COPY "test/Sozsoft.Platform.EntityFrameworkCore.Tests/Sozsoft.Platform.EntityFrameworkCore.Tests.csproj" "test/Sozsoft.Platform.EntityFrameworkCore.Tests/"
|
||||||
COPY "test/Sozsoft.Platform.TestBase/Sozsoft.Platform.TestBase.csproj" "test/Sozsoft.Platform.TestBase/"
|
COPY "test/Sozsoft.Platform.TestBase/Sozsoft.Platform.TestBase.csproj" "test/Sozsoft.Platform.TestBase/"
|
||||||
RUN dotnet restore "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj"
|
RUN dotnet restore "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj"
|
||||||
|
|
@ -51,6 +52,7 @@ RUN dotnet restore "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.H
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN mkdir -p publish
|
RUN mkdir -p publish
|
||||||
RUN dotnet publish "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj" -c Release -o /app/publish --no-restore
|
RUN dotnet publish "src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj" -c Release -o /app/publish --no-restore
|
||||||
|
RUN dotnet publish "src/Sozsoft.Platform.DbMigrator/Sozsoft.Platform.DbMigrator.csproj" -c Release -o /app/migrator
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine AS final
|
FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine AS final
|
||||||
|
|
||||||
|
|
@ -97,4 +99,8 @@ EXPOSE 443
|
||||||
|
|
||||||
WORKDIR /srv/app
|
WORKDIR /srv/app
|
||||||
COPY --from=build /app/publish .
|
COPY --from=build /app/publish .
|
||||||
|
|
||||||
|
# Migrator publish çıktısını Setup modunun çağırabilmesi için kopyala
|
||||||
|
COPY --from=build /app/migrator /srv/Sozsoft.Platform.DbMigrator
|
||||||
|
|
||||||
ENTRYPOINT ["./Sozsoft.Platform.HttpApi.Host"]
|
ENTRYPOINT ["./Sozsoft.Platform.HttpApi.Host"]
|
||||||
|
|
|
||||||
|
|
@ -162,15 +162,47 @@ internal static class SetupAppRunner
|
||||||
await Send("info", "Veritabanı migration ve seed başlatılıyor...");
|
await Send("info", "Veritabanı migration ve seed başlatılıyor...");
|
||||||
await Send("info", $"Migrator yolu: {migratorPath}");
|
await Send("info", $"Migrator yolu: {migratorPath}");
|
||||||
|
|
||||||
var fileName = "dotnet";
|
var extraArgs = cfg["Setup:MigratorArgs"] ?? "--Seed=true";
|
||||||
var arguments = migratorPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)
|
|
||||||
? $"\"{migratorPath}\""
|
|
||||||
: $"run --project \"{migratorPath}\"";
|
|
||||||
|
|
||||||
// seed=true her zaman geçirilir — başlangıç kurulumu için zorunlu.
|
string fileName;
|
||||||
// appsettings Setup:MigratorArgs ile override edilebilir.
|
string arguments;
|
||||||
var extraArgs = cfg["Setup:MigratorArgs"] ?? "seed=true";
|
string workingDirectory;
|
||||||
arguments += $" -- {extraArgs}";
|
|
||||||
|
if (migratorPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) && File.Exists(migratorPath))
|
||||||
|
{
|
||||||
|
// Doğrudan DLL yolu verilmiş — "--" separator YOK, doğrudan argüman
|
||||||
|
fileName = "dotnet";
|
||||||
|
arguments = $"\"{migratorPath}\" {extraArgs}";
|
||||||
|
workingDirectory = Path.GetDirectoryName(migratorPath)!;
|
||||||
|
}
|
||||||
|
else if (Directory.Exists(migratorPath))
|
||||||
|
{
|
||||||
|
// Klasör verilmiş — içinde publish edilmiş DLL var mı?
|
||||||
|
var dllFiles = Directory.GetFiles(migratorPath, "*.DbMigrator.dll", SearchOption.TopDirectoryOnly);
|
||||||
|
if (dllFiles.Length == 0)
|
||||||
|
dllFiles = Directory.GetFiles(migratorPath, "*Migrator*.dll", SearchOption.TopDirectoryOnly);
|
||||||
|
|
||||||
|
if (dllFiles.Length > 0)
|
||||||
|
{
|
||||||
|
// Publish çıktısı — SDK gerekmez, "--" separator YOK
|
||||||
|
fileName = "dotnet";
|
||||||
|
arguments = $"\"{dllFiles[0]}\" {extraArgs}";
|
||||||
|
workingDirectory = migratorPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Kaynak proje klasörü — geliştirme ortamı, "--" gerekli
|
||||||
|
fileName = "dotnet";
|
||||||
|
arguments = $"run --project \"{migratorPath}\" -- {extraArgs}";
|
||||||
|
workingDirectory = migratorPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await Send("error", $"Migrator yolu bulunamadı veya geçersiz: {migratorPath}");
|
||||||
|
await Send("done", "Hata ile sonlandı.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await Send("info", $"Çalıştırılıyor: {fileName} {arguments}");
|
await Send("info", $"Çalıştırılıyor: {fileName} {arguments}");
|
||||||
|
|
||||||
|
|
@ -187,7 +219,7 @@ internal static class SetupAppRunner
|
||||||
RedirectStandardError = true,
|
RedirectStandardError = true,
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
CreateNoWindow = true,
|
CreateNoWindow = true,
|
||||||
WorkingDirectory = migratorPath,
|
WorkingDirectory = workingDirectory,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,10 @@
|
||||||
"StringEncryption": {
|
"StringEncryption": {
|
||||||
"DefaultPassPhrase": "UQpiYfT79zRZ3yYH"
|
"DefaultPassPhrase": "UQpiYfT79zRZ3yYH"
|
||||||
},
|
},
|
||||||
|
"Setup": {
|
||||||
|
"MigratorPath": "/srv/Sozsoft.Platform.DbMigrator",
|
||||||
|
"MigratorArgs": "--Seed=true"
|
||||||
|
},
|
||||||
"Serilog": {
|
"Serilog": {
|
||||||
"MinimumLevel": {
|
"MinimumLevel": {
|
||||||
"Default": "Information"
|
"Default": "Information"
|
||||||
|
|
|
||||||
|
|
@ -49,25 +49,51 @@ const DatabaseSetup = () => {
|
||||||
setStatus('restarting')
|
setStatus('restarting')
|
||||||
|
|
||||||
let attempt = 0
|
let attempt = 0
|
||||||
|
let successCount = 0
|
||||||
|
const REQUIRED_SUCCESS = 2 // sunucunun kararlı olduğunu doğrulamak için arka arkaya 2 başarılı yanıt
|
||||||
|
|
||||||
const tick = async () => {
|
const tick = async () => {
|
||||||
attempt++
|
attempt++
|
||||||
setPollCountdown(attempt)
|
setPollCountdown(attempt)
|
||||||
try {
|
try {
|
||||||
const res = await fetch(applicationConfigurationUrl(false), { method: 'GET' })
|
const res = await fetch(
|
||||||
if (res.status !== 503) {
|
`${import.meta.env.VITE_API_URL ?? ''}${applicationConfigurationUrl(false)}`,
|
||||||
// Full ABP application is ready — reload the page
|
{
|
||||||
|
method: 'GET',
|
||||||
|
headers: { Accept: 'application/json' },
|
||||||
|
cache: 'no-store',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if (res.status === 200) {
|
||||||
|
try {
|
||||||
|
const json = await res.json()
|
||||||
|
// ABP config yanıtının geçerli olduğunu doğrula (currentUser alanı her zaman bulunur)
|
||||||
|
if (json && typeof json.currentUser === 'object') {
|
||||||
|
successCount++
|
||||||
|
if (successCount >= REQUIRED_SUCCESS) {
|
||||||
|
// Sunucu tamamen hazır — yönlendir
|
||||||
window.location.href = '/'
|
window.location.href = '/'
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// Bir sonraki doğrulama denemesi
|
||||||
|
pollTimerRef.current = setTimeout(tick, 1000)
|
||||||
|
return
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// Server not responding yet — expected, retry
|
// JSON parse hatası — sunucu henüz tam hazır değil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Başarısız — sıfırla ve tekrar dene
|
||||||
|
successCount = 0
|
||||||
|
} catch {
|
||||||
|
// Sunucu henüz yanıt vermiyor — bekleniyor, tekrar dene
|
||||||
|
successCount = 0
|
||||||
}
|
}
|
||||||
pollTimerRef.current = setTimeout(tick, 2000)
|
pollTimerRef.current = setTimeout(tick, 2000)
|
||||||
}
|
}
|
||||||
|
|
||||||
// İlk denemeden önce kısa bir bekleme (sunucunun kapanma süresi)
|
// İlk denemeden önce kısa bir bekleme (sunucunun kapanma süresi)
|
||||||
pollTimerRef.current = setTimeout(tick, 2500)
|
pollTimerRef.current = setTimeout(tick, 3000)
|
||||||
}
|
}
|
||||||
|
|
||||||
const startMigration = () => {
|
const startMigration = () => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue