diff --git a/compose.yaml b/compose.yaml index 7b0059e..a838b53 100644 --- a/compose.yaml +++ b/compose.yaml @@ -56,7 +56,6 @@ services: environment: ACCEPT_EULA: "Y" MSSQL_SA_PASSWORD: "${DATABASE_PASSWORD}" - MSSQL_PID: "Developer" ports: - "1433:1433" user: "root" @@ -71,17 +70,20 @@ services: networks: - backend - db-setup: - container_name: "db-setup" + db-migrations: + container_name: db-migrations build: - context: ./database - dockerfile: Dockerfile - restart: "no" - environment: - DATABASE_PASSWORD: "${DATABASE_PASSWORD}" + context: . + dockerfile: src/ServiceLayer.Mesh/Dockerfile.migrations + args: + DatabaseConnectionString: "${DatabaseConnectionString}" depends_on: db: condition: service_healthy + environment: + DATABASE_NAME: "${DATABASE_NAME}" + DATABASE_USER: "${DATABASE_USER}" + DATABASE_PASSWORD: "${DATABASE_PASSWORD}" networks: - backend diff --git a/database/Dockerfile b/database/Dockerfile deleted file mode 100644 index bbe5048..0000000 --- a/database/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM mcr.microsoft.com/mssql-tools:v1 - -# Use root initially to set permissions -USER root -WORKDIR /database -COPY db-setup-entrypoint.sh /database/ -COPY create_database_statement.sql /database/ - -RUN chmod +x /database/db-setup-entrypoint.sh && \ - useradd -m -s /bin/bash mssqltools && \ - chown -R mssqltools:mssqltools /database - -# Switch to non-root user for security -USER mssqltools - -ENTRYPOINT ["/database/db-setup-entrypoint.sh"] diff --git a/database/create_database_statement.sql b/database/create_database_statement.sql deleted file mode 100644 index a6db7d9..0000000 --- a/database/create_database_statement.sql +++ /dev/null @@ -1,23 +0,0 @@ -USE master; -GO - --- Check if database exists and create it if it doesn't -IF NOT EXISTS ( - SELECT name - FROM sys.databases - WHERE name = N'ServiceLayer' - ) -BEGIN - CREATE DATABASE [ServiceLayer]; -END -GO - -USE [ServiceLayer]; -GO - --- Only try to set QUERY_STORE if SQL Server version is higher than 12 (SQL 2014) -IF CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128)) > '12' -BEGIN - ALTER DATABASE [ServiceLayer] SET QUERY_STORE = ON; -END -GO diff --git a/database/db-setup-entrypoint.sh b/database/db-setup-entrypoint.sh deleted file mode 100644 index 062f666..0000000 --- a/database/db-setup-entrypoint.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -echo "🔧 Starting DB setup..." - -# Check if the SQL script exists -if [ ! -f /database/create_database_statement.sql ]; then - echo "❌ SQL script not found!" - exit 1 -fi - -echo "📡 Connecting to SQL Server at db..." -until /opt/mssql-tools/bin/sqlcmd -S db -U SA -P "${DATABASE_PASSWORD}" -Q "SELECT 1;" > /dev/null 2>&1 -do - echo "⏳ Waiting for SQL Server..." - sleep 5 -done -echo "✅ SQL Server is ready." - -# Run the SQL setup script to create the database -/opt/mssql-tools/bin/sqlcmd -S db -U SA -P "${DATABASE_PASSWORD}" -d master -i /database/create_database_statement.sql - -echo "✅ Database setup completed." diff --git a/scripts/database/migrate-and-seed.sh b/scripts/database/migrate-and-seed.sh new file mode 100644 index 0000000..6cb6030 --- /dev/null +++ b/scripts/database/migrate-and-seed.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +# Drop and recreate database for fresh start +echo "Checking if database exists..." +/opt/mssql-tools/bin/sqlcmd -S db -U "$DATABASE_USER" -P "$DATABASE_PASSWORD" -Q "IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'$DATABASE_NAME') CREATE DATABASE $DATABASE_NAME" + +# Run migrations +echo "Running migrations..." +/opt/mssql-tools/bin/sqlcmd -S db -d "$DATABASE_NAME" -U "$DATABASE_USER" -P "$DATABASE_PASSWORD" -i /database/migration.sql + +echo "Migration completed successfully!" diff --git a/src/ServiceLayer.Mesh/Dockerfile.migrations b/src/ServiceLayer.Mesh/Dockerfile.migrations new file mode 100644 index 0000000..f6fb372 --- /dev/null +++ b/src/ServiceLayer.Mesh/Dockerfile.migrations @@ -0,0 +1,41 @@ +# Stage 1: Build & Generate EF Migration Script +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env + +WORKDIR /src + +RUN apt-get update && apt-get install -y git + +COPY . . + +RUN git submodule update --init --recursive + +ARG DatabaseConnectionString +ENV DatabaseConnectionString=${DatabaseConnectionString} + +RUN dotnet restore ./src/ServiceLayer.Mesh/ServiceLayer.Mesh.csproj && \ + dotnet build ./src/ServiceLayer.Mesh/ServiceLayer.Mesh.csproj && \ + dotnet tool install dotnet-ef --tool-path /tools + +ENV PATH="/tools:$PATH" \ + DOTNET_CLI_HOME=/tmp \ + DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true \ + DOTNET_NOLOGO=true + +RUN mkdir -p /database && \ + dotnet ef migrations script \ + -o /database/migration.sql \ + --project ./src/ServiceLayer.Mesh/ + +# Stage 2: Runtime - Apply Migration and Seed Data +FROM mcr.microsoft.com/mssql-tools:v1 AS migration-env + +COPY --from=build-env /database/migration.sql /database/migration.sql +COPY scripts/database/migrate-and-seed.sh /scripts/database/migrate-and-seed.sh + +RUN addgroup --system appgroup && \ + adduser --system --ingroup appgroup appuser && \ + chmod +x /scripts/database/migrate-and-seed.sh + +USER appuser + +ENTRYPOINT ["/scripts/database/migrate-and-seed.sh"]