This is a containerized Shooter Timer web application for competitive shooters. The app is deployed using Docker with automated CI/CD via GitHub Actions.
URL: https://shooters.fabo011-cloud.de/
- Docker Desktop installed
- Docker Compose installed
# Navigate to the project directory
cd ShooterApp
# Build and start the container
docker-compose up --build
# Access the app
Open your browser and go to: http://localhost:8066docker-compose downdocker build -t shooter-timer:latest .docker run -p 8066:8066 --name shooter-timer shooter-timer:latestdocker-compose up -d- The GitHub Actions workflow automatically builds and pushes your image to GHCR on every push to
mainbranch - Images are tagged with:
latest(for main branch)- Branch name
- Git SHA
- Semantic versioning (if you use tags)
# Login to GHCR
docker login ghcr.io -u <username> -p <personal_access_token>
# Build and tag image
docker build -t ghcr.io/fabo011/shooter-app:latest .
# Push to GHCR
docker push ghcr.io/fabo011/shooter-app:latest# Login to GHCR
docker login ghcr.io
# Run the container
docker run -p 8066:8066 ghcr.io/fabo011/shooter-app:latestTo use the GHCR image in docker-compose:
services:
shooter-app:
image: ghcr.io/fabo011/shooter-app:latest
container_name: shooter-timer
ports:
- "8066:8066"
restart: unless-stopped- The app runs on port 8066 (configurable in docker-compose.yml and nginx.conf)
- Lightweight nginx:alpine base image (~150MB)
- Gzip compression enabled
- Static file caching optimized
- Health checks enabled
- Mobile-first responsive design
- Shooter timer with countdown
- Leaderboard with rankings
- Burger menu for navigation
- Add/manage shooters
- Full reset functionality
- Local storage for persistence
- Lightweight Alpine Linux base
- Health checks
- Auto-restart on failure
- Optimized for production