Skip to content

Commit 4fbb485

Browse files
committed
creating a docker demo image
1 parent 67d6547 commit 4fbb485

File tree

11 files changed

+167
-882
lines changed

11 files changed

+167
-882
lines changed

.dockerignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@ backend/dist
1313
frontend/dist
1414
database/
1515
*.db
16-
demo/
16+
!demo/database/demo.db
17+
demo/backend/node_modules
18+
demo/frontend/node_modules
19+
demo/backend/dist
20+
demo/frontend/dist
1721
docs/

.dockerignore-demo

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
node_modules
2+
.git
3+
.gitignore
4+
*.test.*
5+
*.spec.*
6+
README.md
7+
!.env
8+
.env.*
9+
!.env.example
10+
demo/backend/node_modules
11+
demo/frontend/node_modules
12+
demo/backend/dist
13+
demo/frontend/dist
14+
backend/
15+
frontend/
16+
database/
17+
images/
18+
.github/
19+
*.md
20+
!demo/database/demo.db

.github/workflows/docker-demo.yml

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
name: Docker Demo Build & Push
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
- '[0-9]+.[0-9]+.[0-9]+'
8+
9+
env:
10+
REGISTRY: ghcr.io
11+
IMAGE_NAME: ${{ github.repository }}-demo
12+
13+
jobs:
14+
build:
15+
runs-on: ubuntu-latest
16+
permissions:
17+
contents: write
18+
packages: write
19+
20+
steps:
21+
- name: Checkout repository
22+
uses: actions/checkout@v4
23+
24+
- name: Set up Docker Buildx
25+
uses: docker/setup-buildx-action@v3
26+
27+
- name: Log in to GHCR
28+
if: github.event_name != 'pull_request'
29+
uses: docker/login-action@v3
30+
with:
31+
registry: ${{ env.REGISTRY }}
32+
username: ${{ github.actor }}
33+
password: ${{ secrets.GITHUB_TOKEN }}
34+
35+
- name: Extract metadata (tags, labels)
36+
id: meta
37+
uses: docker/metadata-action@v5
38+
with:
39+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
40+
tags: |
41+
type=ref,event=tag
42+
type=semver,pattern={{version}}
43+
type=semver,pattern={{major}}.{{minor}}
44+
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') }}
45+
46+
- name: Build and push Docker demo image
47+
uses: docker/build-push-action@v5
48+
with:
49+
context: .
50+
file: ./Dockerfile-demo
51+
push: ${{ github.event_name != 'pull_request' }}
52+
tags: ${{ steps.meta.outputs.tags }}
53+
labels: ${{ steps.meta.outputs.labels }}
54+
cache-from: type=gha
55+
cache-to: type=gha,mode=max
56+
57+
- name: Update GitHub Release with Demo Info
58+
if: startsWith(github.ref, 'refs/tags/v')
59+
uses: softprops/action-gh-release@v1
60+
with:
61+
append_body: true
62+
body: |
63+
64+
## 🎮 Demo Docker Image
65+
66+
Try the pre-configured demo with sample data:
67+
68+
```bash
69+
# Pull the demo image
70+
docker pull ghcr.io/gcclinux/easyscheduler-demo:latest
71+
# or
72+
docker pull ghcr.io/gcclinux/easyscheduler-demo:${{ github.ref_name }}
73+
74+
# Run the demo container
75+
docker run --name "easyscheduler-demo" -d -p 80:5001 ghcr.io/gcclinux/easyscheduler-demo:latest
76+
```
77+
78+
**Demo Features:**
79+
- 🔒 Read-only demo user (login: `demo`, password: `demo`)
80+
- 👥 5 pre-seeded users
81+
- 📅 8 sample appointments
82+
- 🎨 Green theme
83+
- 🚫 No database modifications allowed
84+
85+
Access at: **http://localhost**
86+
env:
87+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Dockerfile-demo

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Stage 1: Build Frontend
2+
FROM node:20-alpine AS frontend-builder
3+
WORKDIR /app/frontend
4+
COPY demo/frontend/package.json demo/frontend/package-lock.json ./
5+
RUN npm ci
6+
COPY demo/frontend/ ./
7+
ENV VITE_API_BASE_URL=""
8+
RUN npm run build -- --outDir dist
9+
10+
# Stage 2: Build Backend
11+
FROM node:20-alpine AS backend-builder
12+
WORKDIR /app/backend
13+
COPY demo/backend/package.json demo/backend/package-lock.json ./
14+
RUN npm ci
15+
COPY demo/backend/ ./
16+
RUN if [ ! -f src/config/license.ts ]; then cp src/config/license.example.ts src/config/license.ts; fi
17+
RUN npm run build
18+
19+
# Stage 3: Production Runtime
20+
FROM node:20-alpine
21+
WORKDIR /app
22+
23+
# Install build dependencies for native modules (sqlite3)
24+
RUN apk add --no-cache python3 make g++
25+
26+
# Set environment variables
27+
ENV NODE_ENV=production
28+
ENV PORT=5001
29+
ENV FRONTEND_PATH=/app/frontend/dist
30+
ENV DB_PATH=/app/data/demo.db
31+
32+
# Install production dependencies for backend
33+
COPY demo/backend/package.json demo/backend/package-lock.json ./
34+
RUN npm ci --only=production
35+
36+
# Remove build dependencies to reduce image size
37+
RUN apk del python3 make g++
38+
39+
# Copy built backend code
40+
COPY --from=backend-builder /app/backend/dist ./dist
41+
42+
# Copy built frontend code
43+
COPY --from=frontend-builder /app/frontend/dist ./frontend/dist
44+
45+
# Create data directory and copy demo database
46+
RUN mkdir -p /app/data
47+
COPY demo/database/demo.db /app/data/demo.db
48+
49+
# Expose the port
50+
EXPOSE 5001
51+
52+
# Start the server
53+
CMD ["node", "dist/server.js"]

0 commit comments

Comments
 (0)