Add GitHub Container Registry support and automated builds
🚀 GitHub Actions CI/CD Pipeline: - Automatic Docker image builds on every push to main - Multi-platform support (Intel + Apple Silicon) - Images published to GitHub Container Registry (ghcr.io) - Tagged releases with semantic versioning - Build artifacts for easy deployment 📦 Deployment Options: - docker-compose.ghcr.yml for pre-built images (fastest) - Enhanced build-deploy.sh with 'local' and 'ghcr' modes - Comprehensive GITHUB_CONTAINER_REGISTRY.md guide - Updated README with quick deployment options 🏗️ Build Improvements: - Client build included in Docker image for nginx sharing - Automated GitHub Actions workflow with caching - Deployment artifacts generated automatically - Production docker-compose template creation ✅ Benefits: - 1-2 minute deployments (vs 5-10 minute local builds) - Consistent images across all environments - Automatic security scanning and multi-arch builds - Easy rollbacks with version tags - No local build dependencies required Usage: - Quick deploy: ./build-deploy.sh ghcr - Local build: ./build-deploy.sh local - View images: https://github.com/dlawler489/etsy-finance-tracker/pkgs/container/etsy-finance-tracker
This commit is contained in:
parent
b2da6c69ed
commit
1504ae6eea
7 changed files with 555 additions and 29 deletions
|
|
@ -13,6 +13,7 @@ build/
|
||||||
|
|
||||||
# Development files
|
# Development files
|
||||||
.git/
|
.git/
|
||||||
|
.github/
|
||||||
.gitignore
|
.gitignore
|
||||||
*.md
|
*.md
|
||||||
LICENSE
|
LICENSE
|
||||||
|
|
|
||||||
145
.github/workflows/docker-build.yml
vendored
Normal file
145
.github/workflows/docker-build.yml
vendored
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
name: Build and Push Docker Images
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
tags: [ 'v*' ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: ${{ github.repository }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Log in to Container Registry
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract metadata for Docker
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=ref,event=branch
|
||||||
|
type=ref,event=pr
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=sha,prefix=sha-
|
||||||
|
|
||||||
|
- name: Build React client
|
||||||
|
run: |
|
||||||
|
cd client
|
||||||
|
npm ci
|
||||||
|
npm run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
- name: Build and push Docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
- name: Generate deployment artifact
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
run: |
|
||||||
|
mkdir -p deployment
|
||||||
|
|
||||||
|
# Create production docker-compose file
|
||||||
|
cat > deployment/docker-compose.prod.yml << 'EOF'
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
nginx:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: etsy-nginx
|
||||||
|
ports:
|
||||||
|
- "3000:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- client_dist:/usr/share/nginx/html:ro
|
||||||
|
depends_on:
|
||||||
|
- etsy-tracker
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- etsy-network
|
||||||
|
|
||||||
|
etsy-tracker:
|
||||||
|
image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
|
||||||
|
container_name: etsy-finance-tracker
|
||||||
|
expose:
|
||||||
|
- "8080"
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
- PORT=8080
|
||||||
|
volumes:
|
||||||
|
- ./data:/app/data
|
||||||
|
- etsy_uploads:/app/uploads
|
||||||
|
- client_dist:/usr/share/nginx/html
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- etsy-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
etsy_uploads:
|
||||||
|
client_dist:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
etsy-network:
|
||||||
|
driver: bridge
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Copy nginx config
|
||||||
|
cp nginx.conf deployment/
|
||||||
|
|
||||||
|
# Create deployment script
|
||||||
|
cat > deployment/deploy.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🚀 Deploying Etsy Finance Tracker..."
|
||||||
|
|
||||||
|
# Pull latest image
|
||||||
|
docker-compose -f docker-compose.prod.yml pull
|
||||||
|
|
||||||
|
# Stop existing containers
|
||||||
|
docker-compose -f docker-compose.prod.yml down
|
||||||
|
|
||||||
|
# Start with new image
|
||||||
|
docker-compose -f docker-compose.prod.yml up -d
|
||||||
|
|
||||||
|
echo "✅ Deployment complete!"
|
||||||
|
echo "🌐 Access your app at: http://localhost:3000"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x deployment/deploy.sh
|
||||||
|
|
||||||
|
- name: Upload deployment artifacts
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: deployment-files
|
||||||
|
path: deployment/
|
||||||
|
retention-days: 30
|
||||||
|
|
@ -40,6 +40,9 @@ COPY --from=server-build --chown=nodejs:nodejs /app/server/dist ./server/
|
||||||
COPY --from=server-build --chown=nodejs:nodejs /app/server/node_modules ./server/node_modules/
|
COPY --from=server-build --chown=nodejs:nodejs /app/server/node_modules ./server/node_modules/
|
||||||
COPY --from=server-build --chown=nodejs:nodejs /app/server/package*.json ./server/
|
COPY --from=server-build --chown=nodejs:nodejs /app/server/package*.json ./server/
|
||||||
|
|
||||||
|
# Copy built client for nginx sharing
|
||||||
|
COPY --from=client-build --chown=nodejs:nodejs /app/client/dist ./client/dist/
|
||||||
|
|
||||||
# Create data directory for persistent storage
|
# Create data directory for persistent storage
|
||||||
RUN mkdir -p /app/data && chown nodejs:nodejs /app/data
|
RUN mkdir -p /app/data && chown nodejs:nodejs /app/data
|
||||||
|
|
||||||
|
|
|
||||||
173
GITHUB_CONTAINER_REGISTRY.md
Normal file
173
GITHUB_CONTAINER_REGISTRY.md
Normal file
|
|
@ -0,0 +1,173 @@
|
||||||
|
# GitHub Container Registry Deployment Guide
|
||||||
|
|
||||||
|
This guide shows how to deploy the Etsy Finance Tracker using pre-built images from GitHub Container Registry (GHCR).
|
||||||
|
|
||||||
|
## Benefits of Using GHCR
|
||||||
|
|
||||||
|
✅ **Automatic Builds**: Images built automatically on every commit
|
||||||
|
✅ **Multi-Platform**: Supports both Intel and Apple Silicon Macs
|
||||||
|
✅ **Fast Deployment**: No need to build locally, just pull and run
|
||||||
|
✅ **Version Control**: Tagged images for each release
|
||||||
|
✅ **Free for Public Repos**: No additional cost
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
1. **GitHub Actions** automatically builds Docker images when you push code
|
||||||
|
2. **Images are pushed** to GitHub Container Registry (`ghcr.io`)
|
||||||
|
3. **Your Mac Mini** pulls the pre-built image and runs it
|
||||||
|
4. **Updates** are as simple as pulling the latest image
|
||||||
|
|
||||||
|
## Available Images
|
||||||
|
|
||||||
|
The following images are automatically built and published:
|
||||||
|
|
||||||
|
- `ghcr.io/dlawler489/etsy-finance-tracker:main` - Latest development
|
||||||
|
- `ghcr.io/dlawler489/etsy-finance-tracker:v1.0.0` - Tagged releases
|
||||||
|
- `ghcr.io/dlawler489/etsy-finance-tracker:sha-abc123` - Specific commits
|
||||||
|
|
||||||
|
## Mac Mini Deployment (Using GHCR)
|
||||||
|
|
||||||
|
### 1. Install Docker Desktop
|
||||||
|
```bash
|
||||||
|
brew install --cask docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Clone Repository (Config Files Only)
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/dlawler489/etsy-finance-tracker.git
|
||||||
|
cd etsy-finance-tracker
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Setup Data Directory
|
||||||
|
```bash
|
||||||
|
mkdir -p data/{csv,pdf,spreadsheets}
|
||||||
|
# Copy your business files to data directories
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Deploy Using Pre-built Image
|
||||||
|
```bash
|
||||||
|
# Option 1: Use GitHub Container Registry (recommended)
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
|
||||||
|
# Option 2: Traditional local build (slower)
|
||||||
|
docker-compose up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Access Application
|
||||||
|
- **Web Interface**: http://localhost:3000
|
||||||
|
- **Health Check**: http://localhost:3000/health
|
||||||
|
|
||||||
|
## Management Commands
|
||||||
|
|
||||||
|
### Update to Latest Version
|
||||||
|
```bash
|
||||||
|
# Pull latest image and restart
|
||||||
|
docker-compose -f docker-compose.ghcr.yml pull
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use Specific Version
|
||||||
|
Edit `docker-compose.ghcr.yml` and change the image tag:
|
||||||
|
```yaml
|
||||||
|
etsy-tracker:
|
||||||
|
image: ghcr.io/dlawler489/etsy-finance-tracker:v1.0.0 # Use specific version
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Available Versions
|
||||||
|
Visit: https://github.com/dlawler489/etsy-finance-tracker/pkgs/container/etsy-finance-tracker
|
||||||
|
|
||||||
|
## GitHub Actions Workflow
|
||||||
|
|
||||||
|
The automated build process:
|
||||||
|
|
||||||
|
1. **Triggered by**: Push to main branch, tags, or pull requests
|
||||||
|
2. **Builds**: React client and Node.js server
|
||||||
|
3. **Creates**: Multi-platform Docker image (Intel + Apple Silicon)
|
||||||
|
4. **Publishes**: To GitHub Container Registry
|
||||||
|
5. **Artifacts**: Creates deployment files for easy setup
|
||||||
|
|
||||||
|
## Image Layers and Optimization
|
||||||
|
|
||||||
|
The Docker image includes:
|
||||||
|
- **Alpine Linux**: Minimal, secure base image
|
||||||
|
- **Node.js Runtime**: Latest LTS version
|
||||||
|
- **Built Application**: Pre-compiled React + API server
|
||||||
|
- **Security**: Non-root user, proper signal handling
|
||||||
|
- **Health Checks**: Built-in monitoring endpoints
|
||||||
|
|
||||||
|
## Deployment Strategies
|
||||||
|
|
||||||
|
### Development Deployment
|
||||||
|
```bash
|
||||||
|
# Use latest main branch
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Deployment
|
||||||
|
```bash
|
||||||
|
# Use specific tagged version
|
||||||
|
# Edit docker-compose.ghcr.yml to use version tag like :v1.0.0
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rollback Strategy
|
||||||
|
```bash
|
||||||
|
# Switch back to previous version in docker-compose.ghcr.yml
|
||||||
|
docker-compose -f docker-compose.ghcr.yml pull
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Monitoring and Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View all logs
|
||||||
|
docker-compose -f docker-compose.ghcr.yml logs -f
|
||||||
|
|
||||||
|
# View specific service logs
|
||||||
|
docker-compose -f docker-compose.ghcr.yml logs -f etsy-tracker
|
||||||
|
docker-compose -f docker-compose.ghcr.yml logs -f nginx
|
||||||
|
|
||||||
|
# Check container status
|
||||||
|
docker-compose -f docker-compose.ghcr.yml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advantages Over Local Build
|
||||||
|
|
||||||
|
| Aspect | Local Build | GHCR Deployment |
|
||||||
|
|--------|-------------|-----------------|
|
||||||
|
| **Setup Time** | 5-10 minutes | 1-2 minutes |
|
||||||
|
| **Build Required** | Yes, every time | No, pre-built |
|
||||||
|
| **Consistency** | May vary by machine | Identical everywhere |
|
||||||
|
| **Updates** | Rebuild required | Just pull & restart |
|
||||||
|
| **Platform Support** | Single architecture | Multi-platform |
|
||||||
|
| **Network Usage** | Downloads dependencies | Downloads image once |
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Image Pull Issues
|
||||||
|
```bash
|
||||||
|
# Login to GitHub Container Registry (if private)
|
||||||
|
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Version Conflicts
|
||||||
|
```bash
|
||||||
|
# Clean up and restart
|
||||||
|
docker-compose -f docker-compose.ghcr.yml down
|
||||||
|
docker system prune -f
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Available Images
|
||||||
|
```bash
|
||||||
|
# List all available tags
|
||||||
|
curl -s https://api.github.com/users/dlawler489/packages/container/etsy-finance-tracker/versions
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Notes
|
||||||
|
|
||||||
|
- Images are built in GitHub's secure environment
|
||||||
|
- No sensitive data included in images
|
||||||
|
- Your local `data/` directory remains private
|
||||||
|
- Images are scanned for vulnerabilities automatically
|
||||||
|
- Only public repository images are accessible without authentication
|
||||||
46
README.md
46
README.md
|
|
@ -64,38 +64,64 @@ etsy-tracker/
|
||||||
|
|
||||||
## 🚀 Getting Started
|
## 🚀 Getting Started
|
||||||
|
|
||||||
|
### Quick Deploy (Recommended)
|
||||||
|
|
||||||
|
**Option 1: GitHub Container Registry (Fastest)**
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/dlawler489/etsy-finance-tracker.git
|
||||||
|
cd etsy-finance-tracker
|
||||||
|
mkdir -p data/{csv,pdf,spreadsheets}
|
||||||
|
./build-deploy.sh ghcr
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 2: Local Docker Build**
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/dlawler489/etsy-finance-tracker.git
|
||||||
|
cd etsy-finance-tracker
|
||||||
|
./build-deploy.sh local
|
||||||
|
```
|
||||||
|
|
||||||
|
Both options will start the application at **http://localhost:3000**
|
||||||
|
|
||||||
|
### Development Setup
|
||||||
|
|
||||||
|
For development and customization:
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- Node.js (v18 or higher)
|
- Node.js (v18 or higher)
|
||||||
- npm or yarn
|
- npm or yarn
|
||||||
- MongoDB (local or Atlas)
|
- Docker Desktop (for containerized deployment)
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
1. **Clone the repository**
|
1. **Clone the repository**
|
||||||
```bash
|
```bash
|
||||||
git clone <repository-url>
|
git clone https://github.com/dlawler489/etsy-finance-tracker.git
|
||||||
cd etsy-tracker
|
cd etsy-finance-tracker
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Install dependencies**
|
2. **Install dependencies**
|
||||||
```bash
|
```bash
|
||||||
npm run install:all
|
cd client && npm install && cd ..
|
||||||
|
cd server && npm install && cd ..
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Set up environment variables**
|
3. **Set up environment variables (optional)**
|
||||||
```bash
|
```bash
|
||||||
cd server
|
cd server
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# Edit .env with your MongoDB URI and JWT secrets
|
# Edit .env if needed for development
|
||||||
```
|
```
|
||||||
|
|
||||||
4. **Start MongoDB**
|
|
||||||
Make sure MongoDB is running on your local machine or update the `MONGODB_URI` in your `.env` file to point to your MongoDB Atlas cluster.
|
|
||||||
|
|
||||||
### Development
|
### Development
|
||||||
|
|
||||||
**Option 1: Run both servers with one command**
|
**Option 1: Run both servers with Docker (recommended)**
|
||||||
|
```bash
|
||||||
|
./build-deploy.sh local
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 2: Run development servers separately**
|
||||||
```bash
|
```bash
|
||||||
npm run dev
|
npm run dev
|
||||||
```
|
```
|
||||||
|
|
|
||||||
134
build-deploy.sh
134
build-deploy.sh
|
|
@ -1,29 +1,125 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Build script for Docker deployment with nginx
|
# Build and Deploy script for Etsy Finance Tracker
|
||||||
|
|
||||||
echo "🏗️ Building Etsy Finance Tracker for production..."
|
set -e # Exit on any error
|
||||||
|
|
||||||
# Build the React client
|
echo "🏗️ Etsy Finance Tracker Deployment Script"
|
||||||
echo "📦 Building React client..."
|
echo ""
|
||||||
cd client
|
|
||||||
npm run build
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# Ensure client build directory exists and has correct permissions
|
# Check if Docker is running
|
||||||
if [ ! -d "client/dist" ]; then
|
if ! docker info > /dev/null 2>&1; then
|
||||||
echo "❌ Client build failed - dist directory not found"
|
echo "❌ Docker is not running. Please start Docker Desktop and try again."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "📁 Client built successfully in client/dist/"
|
# Parse command line arguments
|
||||||
|
DEPLOYMENT_TYPE=${1:-"local"}
|
||||||
|
|
||||||
# Build and start with Docker Compose
|
case $DEPLOYMENT_TYPE in
|
||||||
echo "🐳 Starting Docker containers..."
|
"local")
|
||||||
docker-compose down
|
echo "📦 Local Build Deployment"
|
||||||
docker-compose up --build -d
|
echo "This will build the application locally and run it."
|
||||||
|
echo ""
|
||||||
|
|
||||||
echo "✅ Deployment complete!"
|
# Build the React client
|
||||||
echo "🌐 Access your app at: http://localhost:3000"
|
echo "<22> Building React client..."
|
||||||
echo "🔍 Health check at: http://localhost:3000/health"
|
cd client
|
||||||
echo "📊 View logs with: docker-compose logs -f"
|
if [ ! -f "package.json" ]; then
|
||||||
|
echo "❌ Client package.json not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
npm ci --silent
|
||||||
|
npm run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Ensure client build directory exists
|
||||||
|
if [ ! -d "client/dist" ]; then
|
||||||
|
echo "❌ Client build failed - dist directory not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Client built successfully"
|
||||||
|
|
||||||
|
# Build and start with Docker Compose
|
||||||
|
echo "🐳 Starting Docker containers (local build)..."
|
||||||
|
docker-compose down --remove-orphans
|
||||||
|
docker-compose up --build -d
|
||||||
|
;;
|
||||||
|
|
||||||
|
"ghcr")
|
||||||
|
echo "📦 GitHub Container Registry Deployment"
|
||||||
|
echo "This will use pre-built images from GitHub Container Registry."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "🔄 Pulling latest images..."
|
||||||
|
docker-compose -f docker-compose.ghcr.yml pull
|
||||||
|
|
||||||
|
echo "🐳 Starting Docker containers (GHCR images)..."
|
||||||
|
docker-compose -f docker-compose.ghcr.yml down --remove-orphans
|
||||||
|
docker-compose -f docker-compose.ghcr.yml up -d
|
||||||
|
;;
|
||||||
|
|
||||||
|
"help"|"--help"|"-h")
|
||||||
|
echo "Usage: $0 [DEPLOYMENT_TYPE]"
|
||||||
|
echo ""
|
||||||
|
echo "DEPLOYMENT_TYPE:"
|
||||||
|
echo " local - Build locally and deploy (default)"
|
||||||
|
echo " ghcr - Use pre-built images from GitHub Container Registry"
|
||||||
|
echo " help - Show this help message"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 # Local build"
|
||||||
|
echo " $0 local # Local build"
|
||||||
|
echo " $0 ghcr # Use GitHub images"
|
||||||
|
echo ""
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "❌ Unknown deployment type: $DEPLOYMENT_TYPE"
|
||||||
|
echo "Run '$0 help' for usage information."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Wait for services to be ready
|
||||||
|
echo "⏳ Waiting for services to be ready..."
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
echo "🔍 Checking application health..."
|
||||||
|
for i in {1..10}; do
|
||||||
|
if curl -s http://localhost:3000/health > /dev/null; then
|
||||||
|
echo "✅ Application is healthy!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ $i -eq 10 ]; then
|
||||||
|
echo "⚠️ Health check failed, but services may still be starting..."
|
||||||
|
else
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🎉 Deployment complete!"
|
||||||
|
echo ""
|
||||||
|
echo "📍 Access Points:"
|
||||||
|
echo " 🌐 Web Application: http://localhost:3000"
|
||||||
|
echo " 🔍 Health Check: http://localhost:3000/health"
|
||||||
|
echo " 📊 API Endpoints: http://localhost:3000/api/"
|
||||||
|
echo ""
|
||||||
|
echo "📋 Management Commands:"
|
||||||
|
if [ "$DEPLOYMENT_TYPE" = "ghcr" ]; then
|
||||||
|
echo " 📊 View logs: docker-compose -f docker-compose.ghcr.yml logs -f"
|
||||||
|
echo " 🔄 Restart: docker-compose -f docker-compose.ghcr.yml restart"
|
||||||
|
echo " 🛑 Stop: docker-compose -f docker-compose.ghcr.yml down"
|
||||||
|
echo " 🔄 Update: docker-compose -f docker-compose.ghcr.yml pull && docker-compose -f docker-compose.ghcr.yml up -d"
|
||||||
|
else
|
||||||
|
echo " 📊 View logs: docker-compose logs -f"
|
||||||
|
echo " 🔄 Restart: docker-compose restart"
|
||||||
|
echo " 🛑 Stop: docker-compose down"
|
||||||
|
echo " 🔄 Rebuild: docker-compose up --build -d"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
82
docker-compose.ghcr.yml
Normal file
82
docker-compose.ghcr.yml
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Nginx reverse proxy and static file server
|
||||||
|
nginx:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: etsy-nginx
|
||||||
|
ports:
|
||||||
|
- "3000:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- client_dist:/usr/share/nginx/html:ro
|
||||||
|
depends_on:
|
||||||
|
- etsy-tracker
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- etsy-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 10s
|
||||||
|
|
||||||
|
# Etsy Finance Tracker API Server (from GitHub Container Registry)
|
||||||
|
etsy-tracker:
|
||||||
|
image: ghcr.io/dlawler489/etsy-finance-tracker:main
|
||||||
|
container_name: etsy-finance-tracker
|
||||||
|
expose:
|
||||||
|
- "8080"
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
- PORT=8080
|
||||||
|
- CLIENT_URL=http://nginx
|
||||||
|
volumes:
|
||||||
|
# Mount data directory for persistent storage
|
||||||
|
- ./data:/app/data
|
||||||
|
# Optional: Mount uploads directory if needed
|
||||||
|
- etsy_uploads:/app/uploads
|
||||||
|
# Share client build with nginx
|
||||||
|
- client_dist:/usr/share/nginx/html
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- etsy-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
command: >
|
||||||
|
sh -c "
|
||||||
|
if [ ! -f /usr/share/nginx/html/index.html ]; then
|
||||||
|
echo 'Extracting client files...';
|
||||||
|
cp -r /app/client/dist/* /usr/share/nginx/html/ 2>/dev/null || true;
|
||||||
|
fi;
|
||||||
|
exec node server/index.js
|
||||||
|
"
|
||||||
|
|
||||||
|
# Optional: MongoDB for future database needs
|
||||||
|
# mongodb:
|
||||||
|
# image: mongo:6.0
|
||||||
|
# container_name: etsy-mongo
|
||||||
|
# ports:
|
||||||
|
# - "27017:27017"
|
||||||
|
# environment:
|
||||||
|
# MONGO_INITDB_ROOT_USERNAME: admin
|
||||||
|
# MONGO_INITDB_ROOT_PASSWORD: changeme
|
||||||
|
# volumes:
|
||||||
|
# - etsy_mongodb_data:/data/db
|
||||||
|
# networks:
|
||||||
|
# - etsy-network
|
||||||
|
# restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
etsy_uploads:
|
||||||
|
client_dist:
|
||||||
|
# etsy_mongodb_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
etsy-network:
|
||||||
|
driver: bridge
|
||||||
Loading…
Reference in a new issue