Compare commits

..

No commits in common. "17706676d5248e3cd47c492c057965169d9ade4f" and "ca637f8d3bf36fbf9ede27a2634e5d1d180c4c54" have entirely different histories.

5 changed files with 10 additions and 63 deletions

View File

@ -1,5 +1,5 @@
# Backend API - Multi-stage optimized build # Backend API - Multi-stage optimized build
FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build
WORKDIR /src WORKDIR /src
# Copy csproj files first for layer caching # Copy csproj files first for layer caching
@ -9,18 +9,15 @@ COPY src/backend/Adapters/Driven/Persistence/*.csproj Adapters/Driven/Persistenc
COPY src/backend/Adapters/Driving/Api/*.csproj Adapters/Driving/Api/ COPY src/backend/Adapters/Driving/Api/*.csproj Adapters/Driving/Api/
COPY src/backend/Host/*.csproj Host/ COPY src/backend/Host/*.csproj Host/
# Restore dependencies for Alpine/musl # Restore dependencies
RUN dotnet restore Host/Host.csproj -r linux-musl-x64 RUN dotnet restore Host/Host.csproj
# Copy source and build # Copy source and build
COPY src/backend/ . COPY src/backend/ .
RUN dotnet publish Host/Host.csproj -c Release -o /app -r linux-musl-x64 --self-contained false RUN dotnet publish Host/Host.csproj -c Release -o /app --no-restore
# Runtime image # Runtime image
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS runtime FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine AS runtime
# Install ICU for SQL Server globalization support
RUN apk add --no-cache icu-libs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
WORKDIR /app WORKDIR /app
COPY --from=build /app . COPY --from=build /app .

View File

@ -4,7 +4,7 @@ WORKDIR /app
# Copy package files for caching # Copy package files for caching
COPY src/frontend/package*.json ./ COPY src/frontend/package*.json ./
RUN npm ci RUN npm ci --silent
# Copy source and build # Copy source and build
COPY src/frontend/ . COPY src/frontend/ .

View File

@ -15,7 +15,7 @@ server {
# API proxy # API proxy
location /graphql { location /graphql {
proxy_pass http://student-api:5000; proxy_pass http://api:5000;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade'; proxy_set_header Connection 'upgrade';
@ -24,7 +24,7 @@ server {
} }
location /health { location /health {
proxy_pass http://student-api:5000; proxy_pass http://api:5000;
} }
# Cache static assets # Cache static assets

View File

@ -1,39 +0,0 @@
#!/bin/bash
# Deploy script for k3s cluster
# Run this on the k3s master node after pulling latest code
set -e
NAMESPACE="student-enrollment"
PROJECT_DIR="/home/andres/student-enrollment"
TAG=$(git -C "$PROJECT_DIR" rev-parse --short HEAD)
echo "=== Deploying commit $TAG to k3s ==="
cd "$PROJECT_DIR"
git pull
echo "=== Building API image ==="
sudo docker build -t student-api:$TAG -f deploy/docker/Dockerfile.api .
echo "=== Building Frontend image ==="
sudo docker build -t student-frontend:$TAG -f deploy/docker/Dockerfile.frontend .
echo "=== Importing images to k3s ==="
sudo docker save student-api:$TAG | sudo k3s ctr images import -
sudo docker save student-frontend:$TAG | sudo k3s ctr images import -
echo "=== Updating deployments ==="
sudo kubectl -n $NAMESPACE set image deployment/student-api api=student-api:$TAG
sudo kubectl -n $NAMESPACE set image deployment/student-frontend frontend=student-frontend:$TAG
echo "=== Waiting for rollout ==="
sudo kubectl -n $NAMESPACE rollout status deployment/student-api --timeout=120s
sudo kubectl -n $NAMESPACE rollout status deployment/student-frontend --timeout=60s
echo "=== Health check ==="
sleep 5
API_POD=$(sudo kubectl -n $NAMESPACE get pods -l app=student-api -o jsonpath='{.items[0].metadata.name}')
sudo kubectl -n $NAMESPACE exec $API_POD -- wget -q --spider http://localhost:5000/health
echo "=== Deploy complete! Tag: $TAG ==="

View File

@ -12343,7 +12343,7 @@
"version": "6.0.6", "version": "6.0.6",
"resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.6.tgz", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.6.tgz",
"integrity": "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==", "integrity": "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==",
"devOptional": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=20" "node": ">=20"
@ -12440,17 +12440,6 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"node_modules/hono": {
"version": "4.11.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.11.3.tgz",
"integrity": "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=16.9.0"
}
},
"node_modules/hosted-git-info": { "node_modules/hosted-git-info": {
"version": "9.0.2", "version": "9.0.2",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
@ -20125,7 +20114,7 @@
"version": "8.19.0", "version": "8.19.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"devOptional": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"