From f1b55db6d1752b8c62ba07b8362cd73d2a75f159 Mon Sep 17 00:00:00 2001 From: alireza Date: Thu, 15 Oct 2026 15:12:45 +0330 Subject: [PATCH] feat(infra): standalone Postgres 18 infra compose (shared greenNetwork); remove redundant postgres from app compose; add DataCopy to solution --- src/GreenHome.Api/GreenHome.Api.csproj | 1 + src/GreenHome.Api/Program.cs | 1 - .../appsettings.Development.json | 2 +- src/GreenHome.Api/docker-compose.yaml | 17 ----- src/GreenHome.sln | 74 +++++++++++++++++++ src/infra/docker-compose.yml | 44 +++++++++++ 6 files changed, 120 insertions(+), 19 deletions(-) create mode 100644 src/infra/docker-compose.yml diff --git a/src/GreenHome.Api/GreenHome.Api.csproj b/src/GreenHome.Api/GreenHome.Api.csproj index a96c557..f748f17 100644 --- a/src/GreenHome.Api/GreenHome.Api.csproj +++ b/src/GreenHome.Api/GreenHome.Api.csproj @@ -8,6 +8,7 @@ + all diff --git a/src/GreenHome.Api/Program.cs b/src/GreenHome.Api/Program.cs index a6109e1..e2420c9 100644 --- a/src/GreenHome.Api/Program.cs +++ b/src/GreenHome.Api/Program.cs @@ -7,7 +7,6 @@ using GreenHome.Infrastructure.Data; using GreenHome.Sms.Ippanel; using GreenHome.VoiceCall.Avanak; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.AspNetCore.StaticFiles; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.FileProviders; diff --git a/src/GreenHome.Api/appsettings.Development.json b/src/GreenHome.Api/appsettings.Development.json index 563bcb4..0126738 100644 --- a/src/GreenHome.Api/appsettings.Development.json +++ b/src/GreenHome.Api/appsettings.Development.json @@ -6,7 +6,7 @@ } }, "Database": { - "Provider": "SqlServer" + "Provider": "Postgres" }, "ConnectionStrings": { "Default": "Server=.;Integrated Security=False;Trusted_Connection=True;Encrypt=false;MultipleActiveResultSets=true;Database=GreenHomeDb;", diff --git a/src/GreenHome.Api/docker-compose.yaml b/src/GreenHome.Api/docker-compose.yaml index bda2cbd..3bae353 100644 --- a/src/GreenHome.Api/docker-compose.yaml +++ b/src/GreenHome.Api/docker-compose.yaml @@ -33,24 +33,7 @@ services: networks: - greenNetwork - postgres: - image: postgres:18-alpine - restart: unless-stopped - environment: - POSTGRES_DB: greenhome - POSTGRES_USER: greenhome - POSTGRES_PASSWORD: greenhome - ports: - - "5432:5432" - volumes: - - pgdata:/var/lib/postgresql/data - networks: - - greenNetwork - networks: serviceNetwork: name: greenNetwork external: true - -volumes: - pgdata: diff --git a/src/GreenHome.sln b/src/GreenHome.sln index e70b8ee..f0062e4 100644 --- a/src/GreenHome.sln +++ b/src/GreenHome.sln @@ -17,40 +17,114 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenHome.VoiceCall.Avanak" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenHome.AI.DeepSeek", "GreenHome.AI.DeepSeek\GreenHome.AI.DeepSeek.csproj", "{63D676E7-B882-4E70-8090-E56CFD516B0A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenHome.DataCopy", "GreenHome.DataCopy\GreenHome.DataCopy.csproj", "{0F5C7A31-54F9-4C29-8E05-66CECAF520C7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|x64.ActiveCfg = Debug|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|x64.Build.0 = Debug|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|x86.ActiveCfg = Debug|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Debug|x86.Build.0 = Debug|Any CPU {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|Any CPU.ActiveCfg = Release|Any CPU {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|Any CPU.Build.0 = Release|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|x64.ActiveCfg = Release|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|x64.Build.0 = Release|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|x86.ActiveCfg = Release|Any CPU + {31D70B40-BD35-4DA8-8E2B-B51120C85F19}.Release|x86.Build.0 = Release|Any CPU {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|x64.Build.0 = Debug|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Debug|x86.Build.0 = Debug|Any CPU {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|Any CPU.Build.0 = Release|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|x64.ActiveCfg = Release|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|x64.Build.0 = Release|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|x86.ActiveCfg = Release|Any CPU + {4E330D53-37E7-42D3-B38C-E0DDF52CEA35}.Release|x86.Build.0 = Release|Any CPU {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|x64.ActiveCfg = Debug|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|x64.Build.0 = Debug|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|x86.ActiveCfg = Debug|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Debug|x86.Build.0 = Debug|Any CPU {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|Any CPU.ActiveCfg = Release|Any CPU {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|Any CPU.Build.0 = Release|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|x64.ActiveCfg = Release|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|x64.Build.0 = Release|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|x86.ActiveCfg = Release|Any CPU + {D41BC2ED-CB72-4A98-82D6-8B6B7EC9423C}.Release|x86.Build.0 = Release|Any CPU {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|x64.ActiveCfg = Debug|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|x64.Build.0 = Debug|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|x86.ActiveCfg = Debug|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Debug|x86.Build.0 = Debug|Any CPU {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|Any CPU.ActiveCfg = Release|Any CPU {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|Any CPU.Build.0 = Release|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|x64.ActiveCfg = Release|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|x64.Build.0 = Release|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|x86.ActiveCfg = Release|Any CPU + {75E498D4-5D04-4F63-A1A5-5D851FA40C74}.Release|x86.Build.0 = Release|Any CPU {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|x64.Build.0 = Debug|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Debug|x86.Build.0 = Debug|Any CPU {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|Any CPU.Build.0 = Release|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|x64.ActiveCfg = Release|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|x64.Build.0 = Release|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|x86.ActiveCfg = Release|Any CPU + {B1FF8C56-E758-48C9-A6EB-E2C938D1BE6B}.Release|x86.Build.0 = Release|Any CPU {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|x64.Build.0 = Debug|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Debug|x86.Build.0 = Debug|Any CPU {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|Any CPU.Build.0 = Release|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|x64.ActiveCfg = Release|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|x64.Build.0 = Release|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|x86.ActiveCfg = Release|Any CPU + {A2C9D8E7-F459-4B1A-9C3D-1E4F5A6B7C8D}.Release|x86.Build.0 = Release|Any CPU {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|x64.ActiveCfg = Debug|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|x64.Build.0 = Debug|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|x86.ActiveCfg = Debug|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Debug|x86.Build.0 = Debug|Any CPU {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|Any CPU.Build.0 = Release|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|x64.ActiveCfg = Release|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|x64.Build.0 = Release|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|x86.ActiveCfg = Release|Any CPU + {63D676E7-B882-4E70-8090-E56CFD516B0A}.Release|x86.Build.0 = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|x64.Build.0 = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Debug|x86.Build.0 = Debug|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|Any CPU.Build.0 = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|x64.ActiveCfg = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|x64.Build.0 = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|x86.ActiveCfg = Release|Any CPU + {0F5C7A31-54F9-4C29-8E05-66CECAF520C7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/infra/docker-compose.yml b/src/infra/docker-compose.yml new file mode 100644 index 0000000..41a0c4e --- /dev/null +++ b/src/infra/docker-compose.yml @@ -0,0 +1,44 @@ +# Shared database infrastructure — standalone from the app. +# Reused by GreenHome and any future service on the same Docker network. +# +# Server usage (one-time): +# 1. mkdir -p /opt/infra && copy this file there +# 2. docker network create greenNetwork (skip if it already exists) +# 3. cd /opt/infra && docker compose up -d +# 4. docker compose exec postgres pg_isready -U greenhome +# +# App connection string: Host=postgres;Port=5432;Database=greenhome;Username=greenhome;Password= +# +# Adding a DB for another service later (no restart needed): +# docker compose exec -it postgres psql -U greenhome -c "CREATE DATABASE otherapp OWNER otherapp;" +services: + postgres: + image: postgres:18-alpine + container_name: postgres + restart: unless-stopped + environment: + POSTGRES_DB: greenhome + POSTGRES_USER: greenhome + # ⚠️ set a strong password here and use the same value in the app's + # ConnectionStrings__Postgres env var + POSTGRES_PASSWORD: CHANGE_ME_STRONG_PASSWORD + # localhost only: containers on greenNetwork reach it by name "postgres"; + # host psql can still connect via 127.0.0.1:5432. Do NOT bind 0.0.0.0. + ports: + - "127.0.0.1:5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U greenhome -d greenhome"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - greenNetwork + +networks: + greenNetwork: + external: true + +volumes: + pgdata: