A mixed-integer linear program (MILP) approach to scheduling a constellation of Earth-imaging satellites is presented. The algorithm optimizes the assignment of imagery collects, image data downlinks, and "health \& safety" contacts, generating schedules for all satellites and ground stations in a network. Hardware-driven constraints (e.g., the limited agility of the satellites) and operations-driven constraints (e.g., guaranteeing a minimum contact frequency for each satellite) are both addressed. Of critical importance to the use of this algorithm in real-world operations, it runs fast enough to allow for human operator interaction. This is achieved by a novel partitioning of the problem into distinct MILPs for downlink scheduling and image scheduling, with a dynamic programming (DP) heuristic providing a stand-in for imaging activity when scheduling the downlinks.