Template Project v1.0.0 - Initial setup with Docker configuration
This commit is contained in:
parent
05eb81aa64
commit
3ee83e344e
|
@ -0,0 +1,81 @@
|
|||
{
|
||||
"version": 1,
|
||||
"rules": [
|
||||
{
|
||||
"pattern": "**/*",
|
||||
"rule": "project-structure.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker/template/Dockerfile",
|
||||
"rule": "dockerfiles.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker/template/Dockerfile.production",
|
||||
"rule": "dockerfiles.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker-compose.dev.yml",
|
||||
"rule": "docker-compose-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker-compose.staging.yml",
|
||||
"rule": "docker-compose-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker-compose.production.yml",
|
||||
"rule": "docker-compose-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker-compose.test.yml",
|
||||
"rule": "docker-compose-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/stack.staging.yml",
|
||||
"rule": "stack-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/stack.production.yml",
|
||||
"rule": "stack-files.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/*.sh",
|
||||
"rule": "scripts.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/build-test-run.sh",
|
||||
"rule": "git-workflow.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/temp/**/*",
|
||||
"rule": ["temp-directory.mdc", "gitkeep-handling.mdc"]
|
||||
},
|
||||
{
|
||||
"pattern": "**/.gitignore",
|
||||
"rule": "gitignore.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/.git/**/*",
|
||||
"rule": "git-workflow.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker/template/src/**/*",
|
||||
"rule": ["source-code.mdc", "gitkeep-handling.mdc"]
|
||||
},
|
||||
{
|
||||
"pattern": "**/.gitkeep",
|
||||
"rule": "gitkeep-handling.mdc"
|
||||
},
|
||||
{
|
||||
"pattern": "**/temp/",
|
||||
"rule": ["temp-directory.mdc", "gitkeep-handling.mdc"]
|
||||
},
|
||||
{
|
||||
"pattern": "**/docker/template/src/",
|
||||
"rule": ["source-code.mdc", "gitkeep-handling.mdc"]
|
||||
},
|
||||
{
|
||||
"pattern": "**/.woodpecker.yml",
|
||||
"rule": "project-structure.mdc"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
description:
|
||||
globs: Dockerfile,Dockerfile.*
|
||||
alwaysApply: false
|
||||
---
|
||||
# Docker Files
|
||||
|
||||
## Dockerfiles
|
||||
- [docker/template/Dockerfile](mdc:docker/template/Dockerfile): Development/Base Dockerfile
|
||||
- Used for local development and testing
|
||||
- Referenced in [docker-compose.dev.yml](mdc:docker-compose.dev.yml)
|
||||
|
||||
- [docker/template/Dockerfile.production](mdc:docker/template/Dockerfile.production): Production-optimized Dockerfile
|
||||
- Used for production deployments
|
||||
- Referenced in [docker-compose.production.yml](mdc:docker-compose.production.yml)
|
||||
|
||||
## Docker Compose Files
|
||||
- [docker-compose.dev.yml](mdc:docker-compose.dev.yml): Development setup
|
||||
- Uses volume mounts for live code changes
|
||||
- Configures development environment variables
|
||||
- Mounts the [temp](mdc:temp) directory for local testing
|
||||
|
||||
- [docker-compose.staging.yml](mdc:docker-compose.staging.yml): Staging build configuration
|
||||
- Builds and tags the staging image
|
||||
- Used by CI/CD for staging deployments
|
||||
|
||||
- [docker-compose.production.yml](mdc:docker-compose.production.yml): Production build configuration
|
||||
- Builds and tags the production image
|
||||
- Used by CI/CD for production deployments
|
||||
|
||||
## Stack Files
|
||||
- [stack.staging.yml](mdc:stack.staging.yml): Staging stack deployment
|
||||
- Configures service deployment for staging environment
|
||||
- Sets up Traefik routing rules
|
||||
|
||||
- [stack.production.yml](mdc:stack.production.yml): Production stack deployment
|
||||
- Configures service deployment for production environment
|
||||
- Sets up Traefik routing rules with appropriate security headers
|
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Dockerfiles
|
||||
|
||||
This project uses a multi-stage Dockerfile approach for different environments.
|
||||
|
||||
## Development Dockerfile
|
||||
[docker/template/Dockerfile](mdc:docker/template/Dockerfile): Used for local development
|
||||
- Optimized for fast rebuilds and development workflow
|
||||
- Includes development tools and debugging capabilities
|
||||
- Used by [docker-compose.dev.yml](mdc:docker-compose.dev.yml)
|
||||
- Allows for volume mounting of source code
|
||||
|
||||
## Production Dockerfile
|
||||
[docker/template/Dockerfile.production](mdc:docker/template/Dockerfile.production): Used for production deployments
|
||||
- Optimized for security, size, and performance
|
||||
- Removes development dependencies and tools
|
||||
- Used by [docker-compose.production.yml](mdc:docker-compose.production.yml)
|
||||
- Bakes the source code into the image
|
||||
|
||||
## Guidelines
|
||||
- Keep base images consistent between environments
|
||||
- Use multi-stage builds to optimize image size
|
||||
- Pin specific versions of base images
|
||||
- Include proper healthchecks
|
||||
- Document any environment variables required
|
||||
- Optimize caching by ordering instructions appropriately (dependencies first, code last)
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Gitignore Rules
|
||||
|
||||
The [.gitignore](mdc:.gitignore) file controls which files are tracked by Git.
|
||||
|
||||
## Key Patterns
|
||||
|
||||
- Cruft files (temporary/generated files) should always be ignored
|
||||
- The `./temp` directory should exist in the repository
|
||||
- Contents of `./temp` should be ignored (except for `.gitkeep`)
|
||||
|
||||
## Standard Cruft Files to Ignore
|
||||
|
||||
- `*.log` - Log files
|
||||
- `*.tmp`, `*.bak` - Temporary and backup files
|
||||
- `*.swp`, `*.swo` - Vim swap files
|
||||
- `*.pyc`, `__pycache__/` - Python bytecode
|
||||
- `node_modules/` - Node.js dependencies
|
||||
- `dist/`, `build/` - Build output directories
|
||||
- `*.DS_Store`, `Thumbs.db` - OS-specific files
|
||||
|
||||
## Temp Directory Setup
|
||||
|
||||
```gitignore
|
||||
# Allow temp directory but ignore its contents
|
||||
./temp/*
|
||||
!./temp/.gitkeep
|
||||
```
|
||||
|
||||
## Important Guidelines
|
||||
|
||||
- When adding files to a previously empty directory with a `.gitkeep`, remove the `.gitkeep` file
|
||||
- Never commit sensitive data, temporary build artifacts, or large binary files
|
||||
- Keep the temp directory clean by only using it for local testing
|
|
@ -0,0 +1,47 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# .gitkeep File Handling
|
||||
|
||||
## Purpose of .gitkeep
|
||||
|
||||
The `.gitkeep` file is a convention (not a Git feature) used to:
|
||||
- Track otherwise empty directories in Git
|
||||
- Ensure important directory structures are maintained
|
||||
- Placeholder for directories that will contain files in the future
|
||||
|
||||
## Important Rule
|
||||
|
||||
**When adding content to a directory that contains a `.gitkeep` file, you should delete the `.gitkeep` file.**
|
||||
|
||||
```bash
|
||||
# Example workflow when adding content to a previously empty directory
|
||||
# 1. Check if .gitkeep exists
|
||||
if [ -f directory/.gitkeep ]; then
|
||||
# 2. Remove it when adding actual content
|
||||
rm directory/.gitkeep
|
||||
fi
|
||||
|
||||
# 3. Add your files
|
||||
touch directory/your-new-file.txt
|
||||
|
||||
# 4. Commit both changes together
|
||||
git add directory/
|
||||
git commit -m "Add content to directory and remove .gitkeep"
|
||||
```
|
||||
|
||||
## Why Remove .gitkeep?
|
||||
|
||||
- `.gitkeep` serves no purpose once a directory contains files
|
||||
- Leaving it creates confusion about the directory's status
|
||||
- Proper cleanup maintains a clean repository
|
||||
|
||||
## Locations with .gitkeep
|
||||
|
||||
In this project, the following locations may contain `.gitkeep` files:
|
||||
- [temp/.gitkeep](mdc:temp/.gitkeep) - Keeps the temp directory in the repo
|
||||
- [docker/template/src/.gitkeep](mdc:docker/template/src/.gitkeep) - Keeps the source directory in the repo
|
||||
|
||||
Always check for `.gitkeep` when adding files to these directories and remove it if found.
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
|
@ -0,0 +1,18 @@
|
|||
./temp/*
|
||||
|
||||
# Common cruft files (temporary/generated files)
|
||||
*.log # Log files
|
||||
*.bak # Backup files (e.g., from editors)
|
||||
*.swp # Vim swap files
|
||||
*.swo # Vim swap files
|
||||
*.tmp # Generic temporary files
|
||||
*.pyc # Python bytecode
|
||||
__pycache__/ # Python cache directories
|
||||
*.o # Object files (C/C++ builds)
|
||||
*.a # Static libraries
|
||||
*.so # Shared libraries
|
||||
node_modules/ # Node.js dependencies
|
||||
dist/ # Build output directories
|
||||
build/ # Build output directories
|
||||
*.DS_Store # macOS cruft
|
||||
Thumbs.db # Windows cruft
|
|
@ -0,0 +1,126 @@
|
|||
# Template Project
|
||||
|
||||
This is a template project that follows a standardized structure for Docker-based applications.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
./
|
||||
├── .woodpecker.yml # CI configuration
|
||||
├── build-test-run.sh # Convenience script for local development
|
||||
├── docker/
|
||||
│ └── template/ # Main application container
|
||||
│ ├── Dockerfile # Base Dockerfile
|
||||
│ ├── Dockerfile.production # Production-specific Dockerfile
|
||||
│ └── src/ # Application source code
|
||||
├── tests/ # Test scripts
|
||||
├── temp/ # Local testing scratch space
|
||||
├── docker-compose.dev.yml # Docker Compose for local development
|
||||
├── docker-compose.production.yml
|
||||
├── docker-compose.staging.yml
|
||||
├── docker-compose.test.yml
|
||||
├── stack.staging.yml
|
||||
└── stack.production.yml
|
||||
```
|
||||
|
||||
## Local Development
|
||||
|
||||
### Quick Start
|
||||
|
||||
The easiest way to get started with local development is to use the `build-test-run.sh` script:
|
||||
|
||||
```bash
|
||||
./build-test-run.sh
|
||||
```
|
||||
|
||||
This script will:
|
||||
1. Build the Docker images using docker-compose.dev.yml
|
||||
2. Run tests if available
|
||||
3. Start all services in the background
|
||||
4. Display the URL to access the application
|
||||
|
||||
### Development Compose File
|
||||
|
||||
The `docker-compose.dev.yml` file is designed for local development. It includes:
|
||||
- Volume mounts for code changes without rebuilding
|
||||
- Debug environment variables
|
||||
- Health checks
|
||||
- Local ports for easy access
|
||||
|
||||
To use it directly:
|
||||
```bash
|
||||
# Build and start in one command
|
||||
docker compose -f docker-compose.dev.yml up --build
|
||||
|
||||
# Run in the background
|
||||
docker compose -f docker-compose.dev.yml up -d
|
||||
|
||||
# View logs
|
||||
docker compose -f docker-compose.dev.yml logs -f
|
||||
|
||||
# Stop services
|
||||
docker compose -f docker-compose.dev.yml down
|
||||
```
|
||||
|
||||
### Using the `temp` Directory
|
||||
|
||||
The `./temp/` directory serves as a scratch space for local testing and development. It's designed to store temporary files that shouldn't be committed to version control, such as:
|
||||
|
||||
- Test output logs (e.g., `test_output.log`)
|
||||
- Temporary build artifacts
|
||||
- Local configuration overrides
|
||||
- Mock data for testing
|
||||
- Debug logs and crash reports
|
||||
|
||||
#### Example Usage
|
||||
|
||||
1. Running tests with output:
|
||||
```bash
|
||||
# Test output will be written to ./temp/test_output.log
|
||||
./tests/run_tests.sh > ./temp/test_output.log
|
||||
```
|
||||
|
||||
2. Local configuration:
|
||||
```bash
|
||||
# Create a local config override
|
||||
cp config.yml ./temp/local_config.yml
|
||||
# Edit local_config.yml for testing
|
||||
```
|
||||
|
||||
3. Debug logs:
|
||||
```bash
|
||||
# Application debug logs
|
||||
docker-compose -f docker-compose.test.yml up > ./temp/debug.log
|
||||
```
|
||||
|
||||
### Important Notes
|
||||
|
||||
- The `./temp/` directory is git-ignored
|
||||
- Files in this directory are temporary and can be safely deleted
|
||||
- Use this directory for any files that shouldn't be committed to version control
|
||||
- The directory is mounted in test containers for easy access to test outputs
|
||||
|
||||
## Development Workflow
|
||||
|
||||
1. Start local development:
|
||||
```bash
|
||||
./build-test-run.sh
|
||||
# or
|
||||
docker compose -f docker-compose.dev.yml up --build
|
||||
```
|
||||
|
||||
2. Run tests:
|
||||
```bash
|
||||
./tests/run_tests.sh
|
||||
```
|
||||
|
||||
3. Check test outputs in `./temp/` directory
|
||||
|
||||
4. Clean up temporary files:
|
||||
```bash
|
||||
rm -rf ./temp/*
|
||||
```
|
||||
|
||||
## CI/CD
|
||||
|
||||
The project uses Woodpecker CI for continuous integration. The `temp` directory is not included in CI builds to ensure clean, reproducible builds.
|
|
@ -0,0 +1,83 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Colors for terminal output
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${YELLOW}Starting build-test-run script for local development${NC}"
|
||||
|
||||
# Create temp directory if it doesn't exist
|
||||
mkdir -p ./temp
|
||||
|
||||
# Log file for build output
|
||||
LOG_FILE="./temp/build-test-run.log"
|
||||
echo "Build started at $(date)" > $LOG_FILE
|
||||
|
||||
# Step 1: Build the Docker images
|
||||
echo -e "${GREEN}Step 1: Building Docker images${NC}"
|
||||
echo "Building Docker images..." >> $LOG_FILE
|
||||
docker compose -f docker-compose.dev.yml build >> $LOG_FILE 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}Build failed. Check $LOG_FILE for details.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}Build completed successfully${NC}"
|
||||
|
||||
# Step 2: Run tests if they exist
|
||||
TESTS_PASSED=false
|
||||
if [ -f "./tests/run_tests.sh" ]; then
|
||||
echo -e "${GREEN}Step 2: Running tests${NC}"
|
||||
echo "Running tests..." >> $LOG_FILE
|
||||
chmod +x ./tests/run_tests.sh
|
||||
./tests/run_tests.sh >> $LOG_FILE 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}Tests failed. Check $LOG_FILE for details.${NC}"
|
||||
echo -e "${YELLOW}Please fix the issues before committing your changes.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}Tests completed successfully${NC}"
|
||||
TESTS_PASSED=true
|
||||
else
|
||||
echo -e "${YELLOW}No test script found. Skipping tests.${NC}"
|
||||
fi
|
||||
|
||||
# Step 3: Start the services
|
||||
echo -e "${GREEN}Step 3: Starting services${NC}"
|
||||
echo "Starting services..." >> $LOG_FILE
|
||||
docker compose -f docker-compose.dev.yml up -d >> $LOG_FILE 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}Failed to start services. Check $LOG_FILE for details.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the URL for the service
|
||||
PORT=$(docker compose -f docker-compose.dev.yml port template 3000 2>/dev/null | cut -d: -f2)
|
||||
if [ -n "$PORT" ]; then
|
||||
echo -e "${GREEN}Service is running at: ${YELLOW}http://localhost:$PORT${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}Service is running but couldn't determine the port.${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}All services are up and running!${NC}"
|
||||
echo -e "To view logs: ${YELLOW}docker compose -f docker-compose.dev.yml logs -f${NC}"
|
||||
echo -e "To stop: ${YELLOW}docker compose -f docker-compose.dev.yml down${NC}"
|
||||
echo "Build and run completed at $(date)" >> $LOG_FILE
|
||||
|
||||
# Show Git workflow guidance if tests passed
|
||||
if [ "$TESTS_PASSED" = true ]; then
|
||||
echo -e "\n${BLUE}=== Ready to Commit and Push ===${NC}"
|
||||
echo -e "${GREEN}All tests have passed! You can now commit and push your changes:${NC}"
|
||||
echo -e "${YELLOW}git add .${NC}"
|
||||
echo -e "${YELLOW}git commit -m \"Your descriptive commit message\"${NC}"
|
||||
echo -e "${YELLOW}git push${NC}"
|
||||
echo -e "\n${GREEN}Or use the convenient one-liner:${NC}"
|
||||
echo -e "${YELLOW}git add . && git commit -m \"Your descriptive commit message\" && git push${NC}"
|
||||
echo -e "\n${BLUE}Remember:${NC}"
|
||||
echo -e "- Use descriptive commit messages"
|
||||
echo -e "- Add 'HOTFIX:' prefix for emergency fixes"
|
||||
echo -e "- Document significant changes in your commit message"
|
||||
fi
|
|
@ -0,0 +1,29 @@
|
|||
# Development configuration for local testing
|
||||
services:
|
||||
template:
|
||||
build:
|
||||
context: ./docker/template
|
||||
dockerfile: Dockerfile
|
||||
image: template:dev
|
||||
volumes:
|
||||
- ./docker/template/src:/scratch
|
||||
- ./temp:/temp
|
||||
networks:
|
||||
- dev_network
|
||||
|
||||
# Add any additional services you need here
|
||||
# Example:
|
||||
# db:
|
||||
# image: postgres:14
|
||||
# environment:
|
||||
# - POSTGRES_PASSWORD=postgres
|
||||
# - POSTGRES_USER=postgres
|
||||
# - POSTGRES_DB=template
|
||||
# volumes:
|
||||
# - ./temp/postgres-data:/var/lib/postgresql/data
|
||||
# networks:
|
||||
# - dev_network
|
||||
|
||||
networks:
|
||||
dev_network:
|
||||
driver: bridge
|
|
@ -1,6 +1,7 @@
|
|||
# The only stuff that happens here is template gets replaced and so does possibly nixius
|
||||
services:
|
||||
midtownplaydio:
|
||||
template:
|
||||
build:
|
||||
context: ./docker/midtownplaydio
|
||||
context: ./docker/template
|
||||
dockerfile: Dockerfile.production
|
||||
image: git.nixc.us/colin/midtownplaydio:production
|
||||
image: git.nixc.us/nixius/template:production
|
|
@ -1,6 +1,7 @@
|
|||
# The only stuff that happens here is template gets replaced and so does possibly nixius
|
||||
services:
|
||||
midtownplaydio:
|
||||
template:
|
||||
build:
|
||||
context: ./docker/midtownplaydio
|
||||
dockerfile: Dockerfile
|
||||
image: git.nixc.us/colin/midtownplaydio:staging
|
||||
context: ./docker/template
|
||||
dockerfile: Dockerfile.staging
|
||||
image: git.nixc.us/colin/template:staging
|
|
@ -0,0 +1,10 @@
|
|||
# Test configuration
|
||||
services:
|
||||
template:
|
||||
build:
|
||||
context: ./docker/template
|
||||
dockerfile: Dockerfile
|
||||
image: template:test
|
||||
volumes:
|
||||
- ./docker/template/src:/scratch
|
||||
- ./temp:/temp
|
|
@ -0,0 +1,10 @@
|
|||
FROM alpine:3.18
|
||||
|
||||
# Create directories for volume mounts
|
||||
RUN mkdir -p /scratch /temp
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /scratch
|
||||
|
||||
# Simple command to keep container running
|
||||
CMD ["tail", "-f", "/dev/null"]
|
|
@ -0,0 +1 @@
|
|||
FROM git.nixc.us/nixius/template:staging
|
|
@ -3,8 +3,37 @@ networks:
|
|||
external: true
|
||||
|
||||
services:
|
||||
template:
|
||||
image: git.nixc.us/nixius/template:production
|
||||
deploy:
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
order: start-first
|
||||
rollback_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
order: stop-first
|
||||
networks:
|
||||
- traefik
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.production_template.rule=Host(`template.nixc.us`)
|
||||
- traefik.http.routers.production_template.entrypoints=websecure
|
||||
- traefik.http.routers.production_template.tls=true
|
||||
- traefik.http.routers.production_template.tls.certresolver=letsencryptresolver
|
||||
- traefik.http.services.production_template.loadbalancer.server.port=3000
|
||||
# - traefik.http.services.production_template.loadbalancer.healthcheck.path=/health
|
||||
# - traefik.http.services.production_template.loadbalancer.healthcheck.interval=30s
|
||||
# - traefik.http.services.production_template.loadbalancer.healthcheck.timeout=5s
|
||||
- traefik.http.routers.production_template.middlewares=secure-headers
|
||||
|
||||
midtownplaydio:
|
||||
image: git.nixc.us/colin/midtownplaydio:production
|
||||
image: git.nixc.us/nixius/midtownplaydio:production
|
||||
networks:
|
||||
- traefik
|
||||
deploy:
|
||||
|
@ -23,6 +52,7 @@ services:
|
|||
traefik.http.routers.production_midtownplaydio.entrypoints: "websecure"
|
||||
traefik.http.routers.production_midtownplaydio.tls: "true"
|
||||
traefik.http.routers.production_midtownplaydio.tls.certresolver: "letsencryptresolver"
|
||||
traefik.http.routers.production_midtownplaydio.middlewares: "secure-headers"
|
||||
traefik.http.services.production_midtownplaydio.loadbalancer.server.port: "3000"
|
||||
traefik.docker.network: "traefik"
|
||||
# traefik.http.services.production_midtownplaydio.loadbalancer.healthcheck.path: "/health"
|
||||
|
@ -39,6 +69,3 @@ services:
|
|||
traefik.http.middlewares.secure-headers.headers.browserXssFilter: "true"
|
||||
traefik.http.middlewares.secure-headers.headers.referrerPolicy: "no-referrer"
|
||||
traefik.http.middlewares.secure-headers.headers.featurePolicy: "camera 'none'; geolocation 'none'; microphone 'none'; payment 'none'; usb 'none'; vr 'none'"
|
||||
|
||||
# Attach security headers middleware to the router
|
||||
traefik.http.routers.production_midtownplaydio.middlewares: "secure-headers"
|
||||
|
|
|
@ -1,37 +1,33 @@
|
|||
version: '3.8'
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
default:
|
||||
|
||||
services:
|
||||
midtownplaydio:
|
||||
image: git.nixc.us/colin/midtownplaydio:staging
|
||||
networks:
|
||||
- traefik
|
||||
- default
|
||||
template:
|
||||
image: git.nixc.us/nixius/template:staging
|
||||
deploy:
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.hostname == ingress.nixc.us
|
||||
preferences:
|
||||
- spread: node.id
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
update_config:
|
||||
delay: 20s
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
order: start-first
|
||||
labels:
|
||||
traefik.enable: "true"
|
||||
traefik.http.routers.staging_midtownplaydio.rule: "Host(`staging.midtownplaydio.nixc.us`)"
|
||||
traefik.http.routers.staging_midtownplaydio.entrypoints: "websecure"
|
||||
traefik.http.routers.staging_midtownplaydio.tls: "true"
|
||||
traefik.http.routers.staging_midtownplaydio.tls.certresolver: "letsencryptresolver"
|
||||
traefik.http.services.staging_midtownplaydio.loadbalancer.server.port: "3000"
|
||||
traefik.docker.network: "traefik"
|
||||
# traefik.http.services.staging_midtownplaydio.loadbalancer.healthcheck.path: "/health"
|
||||
# traefik.http.services.staging_midtownplaydio.loadbalancer.healthcheck.interval: "30s"
|
||||
# traefik.http.services.staging_midtownplaydio.loadbalancer.healthcheck.timeout: "5s"
|
||||
rollback_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
order: stop-first
|
||||
networks:
|
||||
- traefik
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.staging_template.rule=Host(`staging.template.nixc.us`)
|
||||
- traefik.http.routers.staging_template.entrypoints=websecure
|
||||
- traefik.http.routers.staging_template.tls=true
|
||||
- traefik.http.routers.staging_template.tls.certresolver=letsencryptresolver
|
||||
- traefik.http.services.staging_template.loadbalancer.server.port=3000
|
||||
# - traefik.http.services.staging_template.loadbalancer.healthcheck.path=/health
|
||||
# - traefik.http.services.staging_template.loadbalancer.healthcheck.interval=30s
|
||||
# - traefik.http.services.staging_template.loadbalancer.healthcheck.timeout=5s
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
Build started at Wed Apr 23 10:27:39 EDT 2025
|
||||
Building Docker images...
|
||||
#0 building with "desktop-linux" instance using docker driver
|
||||
|
||||
#1 [template internal] load build definition from Dockerfile
|
||||
#1 transferring dockerfile: 279B done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [template internal] load metadata for docker.io/library/alpine:3.18
|
||||
#2 DONE 4.5s
|
||||
|
||||
#3 [template internal] load .dockerignore
|
||||
#3 transferring context: 2B done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [template 1/3] FROM docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f
|
||||
#4 resolve docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f 0.0s done
|
||||
#4 sha256:95459497489f07b9d71d294c852a09f9bbf1af51bb35db752a31f6f48935e293 0B / 3.34MB 0.2s
|
||||
#4 sha256:95459497489f07b9d71d294c852a09f9bbf1af51bb35db752a31f6f48935e293 1.05MB / 3.34MB 0.3s
|
||||
#4 sha256:95459497489f07b9d71d294c852a09f9bbf1af51bb35db752a31f6f48935e293 3.34MB / 3.34MB 0.4s done
|
||||
#4 extracting sha256:95459497489f07b9d71d294c852a09f9bbf1af51bb35db752a31f6f48935e293 0.1s done
|
||||
#4 DONE 0.5s
|
||||
|
||||
#5 [template 2/3] RUN mkdir -p /scratch /temp
|
||||
#5 DONE 0.2s
|
||||
|
||||
#6 [template 3/3] WORKDIR /scratch
|
||||
#6 DONE 0.0s
|
||||
|
||||
#7 [template] exporting to image
|
||||
#7 exporting layers 0.0s done
|
||||
#7 exporting manifest sha256:15b202f67217697a010a43b0d8ef636c8bd4a00a7258dc8334ce1220aa5ad10d done
|
||||
#7 exporting config sha256:e4f5b35710a25e9116a133bde6255ccc3f91a39c9b99e4f4a44d7eaf27024e7d done
|
||||
#7 exporting attestation manifest sha256:1381754eaa2ff6ca7277a69421f9a2e9bfd02920098acac0b6d9a0d87b4abe9c done
|
||||
#7 exporting manifest list sha256:59daf10da628c4a24e9396d0656c99dff8d7036f3b29e0ec6d7392c1e72adfc0 done
|
||||
#7 naming to docker.io/library/template:dev done
|
||||
#7 unpacking to docker.io/library/template:dev 0.0s done
|
||||
#7 DONE 0.1s
|
||||
|
||||
#8 [template] resolving provenance for metadata file
|
||||
#8 DONE 0.0s
|
||||
template Built
|
||||
Running tests...
|
||||
Running tests...
|
||||
Test results have been saved to ./temp/test_output.log
|
||||
Test started at Wed Apr 23 10:27:45 EDT 2025
|
||||
Testing Docker build...
|
||||
#0 building with "desktop-linux" instance using docker driver
|
||||
|
||||
#1 [template internal] load build definition from Dockerfile
|
||||
#1 transferring dockerfile: 279B done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [template internal] load metadata for docker.io/library/alpine:3.18
|
||||
#2 DONE 0.2s
|
||||
|
||||
#3 [template internal] load .dockerignore
|
||||
#3 transferring context: 2B done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [template 1/3] FROM docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f
|
||||
#4 resolve docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f done
|
||||
#4 DONE 0.0s
|
||||
|
||||
#5 [template 2/3] RUN mkdir -p /scratch /temp
|
||||
#5 CACHED
|
||||
|
||||
#6 [template 3/3] WORKDIR /scratch
|
||||
#6 CACHED
|
||||
|
||||
#7 [template] exporting to image
|
||||
#7 exporting layers done
|
||||
#7 exporting manifest sha256:15b202f67217697a010a43b0d8ef636c8bd4a00a7258dc8334ce1220aa5ad10d done
|
||||
#7 exporting config sha256:e4f5b35710a25e9116a133bde6255ccc3f91a39c9b99e4f4a44d7eaf27024e7d done
|
||||
#7 exporting attestation manifest sha256:ec2582c7e07cfeaaeb69797430b3d687550c642903473dbe1fbcdea58fefc2cb 0.0s done
|
||||
#7 exporting manifest list sha256:1f3404b565e38ec1490f2d56d612438b611b2fd31e213e39e37c8e3e80c4b3ff done
|
||||
#7 naming to docker.io/library/template:test done
|
||||
#7 unpacking to docker.io/library/template:test done
|
||||
#7 DONE 0.0s
|
||||
|
||||
#8 [template] resolving provenance for metadata file
|
||||
#8 DONE 0.0s
|
||||
template Built
|
||||
Testing container startup...
|
||||
Network template_default Creating
|
||||
Network template_default Created
|
||||
Container template-template-1 Recreate
|
||||
Container template-template-1 Recreated
|
||||
Container template-template-1 Starting
|
||||
Container template-template-1 Started
|
||||
Container status:
|
||||
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
|
||||
Cleaning up...
|
||||
Container template-template-1 Stopping
|
||||
Container template-template-1 Stopped
|
||||
Container template-template-1 Removing
|
||||
Container template-template-1 Removed
|
||||
Network template_default Removing
|
||||
Network template_default Removed
|
||||
Tests completed at Wed Apr 23 10:27:52 EDT 2025
|
||||
Starting services...
|
||||
Container template-template-1 Creating
|
||||
Container template-template-1 Created
|
||||
Container template-template-1 Starting
|
||||
Container template-template-1 Started
|
||||
Build and run completed at Wed Apr 23 10:27:53 EDT 2025
|
|
@ -0,0 +1,55 @@
|
|||
Test started at Wed Apr 23 10:27:45 EDT 2025
|
||||
Testing Docker build...
|
||||
#0 building with "desktop-linux" instance using docker driver
|
||||
|
||||
#1 [template internal] load build definition from Dockerfile
|
||||
#1 transferring dockerfile: 279B done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [template internal] load metadata for docker.io/library/alpine:3.18
|
||||
#2 DONE 0.2s
|
||||
|
||||
#3 [template internal] load .dockerignore
|
||||
#3 transferring context: 2B done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [template 1/3] FROM docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f
|
||||
#4 resolve docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f done
|
||||
#4 DONE 0.0s
|
||||
|
||||
#5 [template 2/3] RUN mkdir -p /scratch /temp
|
||||
#5 CACHED
|
||||
|
||||
#6 [template 3/3] WORKDIR /scratch
|
||||
#6 CACHED
|
||||
|
||||
#7 [template] exporting to image
|
||||
#7 exporting layers done
|
||||
#7 exporting manifest sha256:15b202f67217697a010a43b0d8ef636c8bd4a00a7258dc8334ce1220aa5ad10d done
|
||||
#7 exporting config sha256:e4f5b35710a25e9116a133bde6255ccc3f91a39c9b99e4f4a44d7eaf27024e7d done
|
||||
#7 exporting attestation manifest sha256:ec2582c7e07cfeaaeb69797430b3d687550c642903473dbe1fbcdea58fefc2cb 0.0s done
|
||||
#7 exporting manifest list sha256:1f3404b565e38ec1490f2d56d612438b611b2fd31e213e39e37c8e3e80c4b3ff done
|
||||
#7 naming to docker.io/library/template:test done
|
||||
#7 unpacking to docker.io/library/template:test done
|
||||
#7 DONE 0.0s
|
||||
|
||||
#8 [template] resolving provenance for metadata file
|
||||
#8 DONE 0.0s
|
||||
template Built
|
||||
Testing container startup...
|
||||
Network template_default Creating
|
||||
Network template_default Created
|
||||
Container template-template-1 Recreate
|
||||
Container template-template-1 Recreated
|
||||
Container template-template-1 Starting
|
||||
Container template-template-1 Started
|
||||
Container status:
|
||||
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
|
||||
Cleaning up...
|
||||
Container template-template-1 Stopping
|
||||
Container template-template-1 Stopped
|
||||
Container template-template-1 Removing
|
||||
Container template-template-1 Removed
|
||||
Network template_default Removing
|
||||
Network template_default Removed
|
||||
Tests completed at Wed Apr 23 10:27:52 EDT 2025
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Create temp directory if it doesn't exist
|
||||
mkdir -p ./temp
|
||||
|
||||
# Run tests and capture output
|
||||
echo "Running tests..."
|
||||
echo "Test started at $(date)" > ./temp/test_output.log
|
||||
|
||||
# Example test commands
|
||||
echo "Testing Docker build..." >> ./temp/test_output.log
|
||||
docker compose -f docker-compose.test.yml build >> ./temp/test_output.log 2>&1
|
||||
|
||||
echo "Testing container startup..." >> ./temp/test_output.log
|
||||
docker compose -f docker-compose.test.yml up -d >> ./temp/test_output.log 2>&1
|
||||
|
||||
# Wait for container to be ready
|
||||
sleep 5
|
||||
|
||||
# Check container status
|
||||
echo "Container status:" >> ./temp/test_output.log
|
||||
docker compose -f docker-compose.test.yml ps >> ./temp/test_output.log 2>&1
|
||||
|
||||
# Clean up
|
||||
echo "Cleaning up..." >> ./temp/test_output.log
|
||||
docker compose -f docker-compose.test.yml down >> ./temp/test_output.log 2>&1
|
||||
|
||||
echo "Tests completed at $(date)" >> ./temp/test_output.log
|
||||
|
||||
# Display results
|
||||
echo "Test results have been saved to ./temp/test_output.log"
|
||||
cat ./temp/test_output.log
|
Loading…
Reference in New Issue