This guide documents how to test BeeCompose services for OCI compatibility and deployment.
# Validate all services for OCI compatibility
./scripts/validate-all-oci.sh
# Dry-run publish for a specific service
./scripts/publish-dry-run.sh gitlab
# Test OCI deployment (requires published artifact)
./scripts/test-oci.sh gitlab v18.8.0Validates all 30 services for OCI compatibility without requiring network access or published artifacts.
Usage:
./scripts/validate-all-oci.shWhat it checks:
| Check | Description | Blocking |
|---|---|---|
| Compose syntax | docker compose config must succeed |
Yes |
| Bind mounts | No bind mounts except /var/run/docker.sock |
Yes |
| Build directives | Warns if build: present (images must be pre-built) |
Warning |
Example output:
=== Validating All Services for OCI Compatibility ===
bitwarden PASS -
gitlab PASS -
traefik PASS -
...
=== Summary ===
Passed: 30
Warnings: 0
Failed: 0
Total: 30
All services are OCI compatible!
Exit codes:
0- All services pass (warnings allowed)1- One or more services failed validation
Performs a comprehensive pre-publish validation for a single service.
Usage:
./scripts/publish-dry-run.sh <service>Example:
./scripts/publish-dry-run.sh gitlabValidation steps:
- Compose syntax validation
- OCI compatibility check (bind mounts)
- Build directive check
- Local config file reference check
- Version extraction from
.env - Required files check (docker-compose.yml, .env)
- DCLint validation (if Docker available)
Example output:
=== OCI Publishing Dry Run ===
Service: gitlab
Directory: /path/to/services/gitlab
=== Step 1: Validating Compose Syntax ===
PASS: Compose syntax is valid
=== Step 2: Checking OCI Compatibility ===
PASS: No problematic bind mounts
PASS: No build directives
PASS: No local config file references
=== Step 3: Extracting Version ===
Extracted version: v18.8.0
=== Step 4: Checking Required Files ===
PASS: docker-compose.yml exists
PASS: .env exists
PASS: .env.example exists (recommended)
=== Step 5: Running DCLint ===
PASS: DCLint validation passed
=== Dry Run Summary ===
Service: gitlab
Version: v18.8.0
Registry: ghcr.io/beevelop
Would publish:
ghcr.io/beevelop/gitlab:v18.8.0
ghcr.io/beevelop/gitlab:latest
To actually publish, run:
docker compose publish -y ghcr.io/beevelop/gitlab:v18.8.0
docker compose publish -y ghcr.io/beevelop/gitlab:latest
=== Dry Run Complete ===
Tests an OCI artifact deployment end-to-end. Requires the artifact to be published to GHCR first.
Usage:
./scripts/test-oci.sh <service> [version]Examples:
# Test latest version
./scripts/test-oci.sh gitlab
# Test specific version
./scripts/test-oci.sh gitlab v18.8.0What it does:
- Creates a temporary test environment file
- Pulls the OCI artifact from GHCR
- Starts all services
- Waits 30 seconds for startup
- Shows service status and health
- Prompts for cleanup (Ctrl+C to keep running)
- Removes containers and volumes
Test environment variables: The script creates minimal test credentials for services:
COMPOSE_PROJECT_NAME=oci-testSERVICE_DOMAIN=localhostDB_PASS/DB_USER/DB_NAME- Database credentials- Service-specific secrets (GitLab, Graylog, etc.)
Use this matrix to verify service functionality:
| Test Case | Command | Pass Criteria |
|---|---|---|
| OCI Validation | ./scripts/validate-all-oci.sh |
All 30 services PASS |
| Dry-run Publish | ./scripts/publish-dry-run.sh <service> |
No FAIL messages |
| OCI Pull & Run | ./scripts/test-oci.sh <service> |
Containers start |
| Health Checks | docker compose ps |
All containers healthy |
| Env Override | --env-file .env.custom |
Custom values applied |
| Volume Persistence | Stop, start, verify data | Data retained |
| Multi-service | traefik + app | Both routable |
| Init Profile | --profile init up traefik-init |
Config generated |
For development, you can test services directly from the repository:
# Navigate to service directory
cd services/gitlab
# Create environment file
cp .env.example .env.local
# Edit .env.local with your values
# Start service
docker compose --env-file .env.local up -d
# Check status
docker compose ps
# View logs
docker compose logs -f
# Stop and cleanup
docker compose down -vThe GitHub Actions pipeline runs these tests automatically:
- docker run --rm -v "$(pwd):/app" zavoloklom/dclint:latest /app/services -r -c /app/.dclintrc.yaml- name: Check for OCI blockers
run: |
for COMPOSE in services/*/docker-compose.yml; do
# Check for bind mounts, build directives, etc.
done- Detects changed services
- Extracts version from
.env - Publishes to
ghcr.io/beevelop/<service>:<version> - Publishes
latesttag
Bind mount detected:
FAIL: Contains bind mounts (not OCI compatible)
./data/app:/app/data
Fix: Convert to named volumes in docker-compose.yml:
volumes:
- app_data:/app/data
volumes:
app_data:
name: ${COMPOSE_PROJECT_NAME:-service}_app_dataFAIL: Compose syntax error
Fix: Run docker compose config in the service directory to see the error:
cd services/<service>
docker compose configERROR: Failed to pull or parse OCI artifact
Possible causes:
- Artifact not published yet (use dry-run first)
- Version tag incorrect
- Authentication required (run
docker login ghcr.io) - Network issues
WARNING: Some containers are unhealthy
Debug steps:
- Check container logs:
docker logs <container> - Verify environment variables
- Check healthcheck definition in compose file
- Increase
start_periodfor slow-starting services
When adding a new service, ensure it passes all validation:
# 1. Validate OCI compatibility
./scripts/publish-dry-run.sh <new-service>
# 2. Test locally
cd services/<new-service>
cp .env.example .env.test
docker compose --env-file .env.test up -d
docker compose ps
docker compose down -v
# 3. Verify all services still pass
./scripts/validate-all-oci.shLast validation run: 2026-01-21
| Service | Status | Notes |
|---|---|---|
| bitwarden | PASS | - |
| cabot | PASS | - |
| confluence | PASS | - |
| crowd | PASS | - |
| dependency-track | PASS | - |
| directus | PASS | - |
| duckling | PASS | - |
| gitlab | PASS | - |
| graylog | PASS | - |
| huginn | PASS | - |
| jira | PASS | - |
| keycloak | PASS | - |
| metabase | PASS | - |
| minio | PASS | - |
| monica | PASS | - |
| mysql | PASS | - |
| nexus | PASS | - |
| openvpn | PASS | - |
| phpmyadmin | PASS | - |
| redash | PASS | - |
| registry | PASS | - |
| rundeck | PASS | - |
| sentry | PASS | - |
| shields | PASS | - |
| sonarqube | PASS | - |
| statping | PASS | - |
| traefik | PASS | docker.sock bind mount allowed |
| tus | PASS | - |
| weblate | PASS | - |
| zabbix | PASS | - |
Summary: 30/30 services OCI compatible