View RawView Markdown # 5q12 Indexer - Build System
This directory contains the Docker build system for the 5q12 Indexer application. The build system uses Alpine Linux with s6-overlay for process management.
## Directory Structure
```
.
├── build.sh # Main build script (includes all functionality)
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Development compose file
├── README.md # This file
├── docker/ # Docker configuration files
│ ├── nginx.conf # Nginx main configuration
│ ├── 5q12-indexer.conf # Nginx site configuration
│ ├── php-fpm.conf # PHP-FPM configuration
│ ├── s6-services/ # S6-overlay service definitions
│ │ ├── nginx/ # Nginx service
│ │ │ ├── dependencies.d/
│ │ │ │ └── init-indexer
│ │ │ ├── run
│ │ │ └── type
│ │ ├── php-fpm/ # PHP-FPM service
│ │ │ ├── dependencies.d/
│ │ │ │ └── init-indexer
│ │ │ ├── run
│ │ │ └── type
│ │ ├── init-indexer/ # Initialization service
│ │ │ ├── run
│ │ │ ├── type
│ │ │ └── up
│ │ ├── user/ # User bundle (nginx + php-fpm)
│ │ │ ├── contents.d/
│ │ │ │ ├── nginx
│ │ │ │ └── php-fpm
│ │ │ └── type
│ │ └── user2/ # User2 bundle (contains user)
│ │ ├── contents.d/
│ │ │ └── user
│ │ └── type
│ └── scripts/ # Initialization scripts
│ └── init-indexer.sh # Main initialization script
└── source/ # Application source code
├── index.php # Main application file
└── config/ # Default configuration
```
## Version System
The project uses a revision-based versioning system for security patches:
- **Base Version**: `X.Y.Z` (e.g., `1.1.19`)
- **Security Patches**: `X.Y.Z-rN` (e.g., `1.1.19-r1`, `1.1.19-r2`)
Where:
- `X.Y.Z` represents major.minor.patch versions for feature releases
- `rN` represents revision number for security patches and hotfixes
## Build Scripts
### build.sh
The main build script that handles all build system functionality including Docker image creation, s6-overlay setup, and deployment operations.
**Usage:**
```bash
./build.sh # Build with default version
./build.sh 1.1.19-r1 # Build with custom version
./build.sh --no-cache # Build with no cache
./build.sh 1.1.19-r1 --no-cache # Build custom version with no cache
```
**Generated Tags:**
- `5q12/5q12-indexer:VERSION`
- `5q12/5q12-indexer:latest`
- `5q12/5q12-indexer:VERSION-s6`
**Prerequisites:**
- Docker installed and running
- All required files present (automatically checked)
- S6-overlay services configured (automatically set up if needed)
## Docker Configuration
### Process Management
The build system uses s6-overlay v3 instead of supervisor for better security and container-native process management.
**Services:**
- `init-indexer`: Initialization and configuration setup
- `nginx`: Web server (depends on init-indexer)
- `php-fpm`: PHP FastCGI Process Manager (depends on init-indexer)
- `user`: Service bundle containing nginx and php-fpm
- `user2`: Service bundle containing user
### Environment Variables
The build system supports comprehensive environment variable configuration:
**Main Configuration:**
- `INDEXER_ACCESS_URL`: Base URL for the application
- `INDEXER_CACHE_TYPE`: Cache type (sqlite/json)
- `INDEXER_ICON_TYPE`: Icon display type
- `INDEXER_INDEX_ALL`: Index all files
- `INDEXER_INDEX_HIDDEN`: Include hidden files
- `INDEXER_DISABLE_FILE_DOWNLOADS`: Disable file downloads
- `INDEXER_DISABLE_FOLDER_DOWNLOADS`: Disable folder downloads
**Filetype Controls:**
- `INDEXER_VIEW_FILETYPE_*`: Control file viewing (use underscores for hyphens)
- `INDEXER_INDEX_FILETYPE_*`: Control file indexing
**System Settings:**
- `TZ`: Timezone setting
- `S6_VERBOSITY`: S6-overlay logging level
## Building Images
### Prerequisites Check
The build script automatically verifies:
- Required files exist
- Directory structure is correct
- S6 services are configured
- Script permissions are set
- Environment variable processing is present
### Build Process
1. **Validation**: Checks all required files and directories
2. **Permission Setup**: Makes scripts executable
3. **Docker Build**: Creates multi-tagged images
4. **Verification**: Shows build results and usage examples
### Development Workflow
```bash
# Clean build environment
docker system prune -a --volumes --force
# Build development image
./build.sh devtest-r1 --no-cache
# Test locally
mkdir -p test-indexer/{config,files}
docker run -d --name test-indexer-s6 -p 5012:5012 \
-v $(pwd)/test-indexer/config:/config \
-v $(pwd)/test-indexer/files:/files \
-e INDEXER_CACHE_TYPE=json \
5q12/5q12-indexer:devtest-r1
# Test environment variables
docker exec test-indexer-s6 cat /config/config.json | grep cache_type
# Check logs
docker logs test-indexer-s6
# Clean up
docker rm -f test-indexer-s6
rm -rf test-indexer/
```
## Security Features
### Process Management
- No supervisor vulnerabilities
- Reduced Python attack surface
- Container-native s6-overlay
- Proper signal handling
### Environment Variable Processing
- Multiple fallback methods for reading variables
- Support for s6-overlay environment files
- Enhanced debugging and error reporting
- Secure configuration merging
### Container Hardening
- Non-root user execution
- Minimal Alpine Linux base
- Position-independent executables
- Stack-smashing protection
## Troubleshooting
### Common Build Issues
**Missing s6-services directory:**
The build script will check for this automatically and warn you if the s6-overlay structure is missing.
**Permission errors:**
```bash
chmod +x build.sh
chmod +x docker/scripts/*.sh
```
**Missing files:**
- Check that all files in the build script's validation exist
- Verify source directory structure
- Ensure Docker configuration files are present
**Environment variables not working:**
- Verify `init-indexer.sh` contains enhanced processing
- Check s6-overlay environment files in `/var/run/s6/container_environment/`
- Use `S6_VERBOSITY=2` for debugging
### Build Script Validation
The build script performs comprehensive validation:
- File and directory existence
- Script permissions
- S6 service structure
- Environment variable processing presence
### Testing Environment Variables
```bash
# Test specific variable
docker run --rm -e INDEXER_CACHE_TYPE=json IMAGE_NAME \
sh -c 'cat /config/config.json | grep cache_type'
# Test multiple variables
docker run --rm \
-e INDEXER_CACHE_TYPE=json \
-e INDEXER_INDEX_ALL=true \
IMAGE_NAME sh -c 'cat /config/config.json | grep -E "(cache_type|index_all)"'
```
## Migration Notes
### From Supervisor to S6-Overlay
If migrating from supervisor-based builds:
1. Run `./s6.sh` to set up s6 services
2. Remove any supervisor configuration references
3. Update any custom scripts to use s6-overlay patterns
4. Test thoroughly with environment variables
### Legacy Compatibility
The build system maintains backward compatibility for:
- Volume mount points (`/config`, `/files`)
- Port configuration (5012)
- Environment variable names
- Health check endpoints
## Development Guidelines
### Adding New Environment Variables
1. Update `init-indexer.sh` environment mapping
2. Add to build script documentation
3. Test with fallback methods
4. Update docker-compose examples
### Modifying S6 Services
1. Edit service definitions in `docker/s6-services/`
2. Ensure proper dependencies are set
3. Test service startup order
4. Verify logging and error handling
### Security Considerations
- Always validate input from environment variables
- Use proper file permissions
- Test with minimal privileges
- Regular security updates for base image