Production exports require a different upgrade approach because they are self-contained deployment bundles with independent configurations. Follow these steps to upgrade production exports:

  1. Set the working directory to the OpenEdge MCP Server installation directory:
    cd "$OEMCP_HOME"
  2. Find the timestamped production export directory for the profile:
    # Find the production export directory
    EXPORT_DIR=$(find exports -maxdepth 1 -type d \
      -name "export_${PROFILE}_*" -print -quit)
    test -n "$EXPORT_DIR"
    Note: This command selects the first matching export. If you have multiple exports for the same profile, set EXPORT_DIR explicitly to the target directory.
  3. Stop the running container and back up the export compose file:
    cd "$EXPORT_DIR"
    
    # Stop the running container
    ./run.sh stop --port <port> --name <container-name>
    
    # Back up the compose file
    cp docker-compose.mcp.yml docker-compose.mcp.yml.backup
  4. Confirm the export follows security best practices and does not include disallowed private credentials:
    test ! -e sa/private.pem  # Should not exist
    test ! -e sa/sa.jwt       # Should not exist
    test -f sa/public.pem     # Should exist
    test -f server/mcp_server_config.json  # Should exist
    Production exports intentionally omit the service-account private key and JWT. These credentials must be provided from an external secret-management system. Never copy development credentials into production bundles.
  5. Load the target release images into Docker:
    # Load new Docker images
    cd "$OEMCP_HOME"
    ./load_images.sh
    Note: This procedure assumes that the OpenEdge MCP Server distribution is available on the production machine.
  6. Restart the production export with the upgraded image:
    # Start the upgraded container
    cd "$EXPORT_DIR"
    ./run.sh start --port <port> --name <container-name>
    
  7. Confirm the container image reference and runtime status:
    # Verify deployment - confirm container uses the new image
    CONTAINER_IMAGE_ID=$(docker inspect --format '{{.Image}}' <container-name>)
    EXPECTED_IMAGE_ID=$(docker image inspect openedge-mcp-server:latest --format '{{.Id}}')
    
    if [ "$CONTAINER_IMAGE_ID" = "$EXPECTED_IMAGE_ID" ]; then
        echo "Container is using the upgraded image"
    else
        echo " WARNING: Container image mismatch"
        echo "  Container: $CONTAINER_IMAGE_ID"
        echo "  Expected:  $EXPECTED_IMAGE_ID"
    fi
    # Check runtime status
    ./run.sh status --port <port> --name <container-name>

Production validation checklist:

To confirm the production upgrade completed successfully, verify the following:
  • Verify the deployed container uses the new image
  • Confirm sanitized server configuration is unchanged
  • Test that externally supplied credentials can list tools
  • Verify authorized tool invocation succeeds
  • Compare production tool catalog with pre-upgrade baseline
  • Confirm production networking (DNS, service discovery, network aliases) functions correctly
Note: Production exports remove development-only extra_hosts mappings. Use stable DNS names, service-discovery names, or supported network aliases for downstream OpenEdge services.