diff --git a/.gitignore b/.gitignore index 1febf73..09f94a6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,4 @@ lastState.txt lastStatisticsUpdate.txt log.* state.txt -migrations - -# created when running development environment -mariadb/** \ No newline at end of file +migrations \ No newline at end of file diff --git a/README.md b/README.md index 2e35ead..940c6a0 100644 --- a/README.md +++ b/README.md @@ -34,21 +34,12 @@ To run Surveillance using docker, decide between development/testing or producti 1. Clone this repository -2. Run `docker compose -f docker-compose.yml -f docker-compose.dev.yml up` and wait for services to start up +2. Run `docker compose up` and wait for services to start up 3. Visit `http://localhost:8080/` in a browser; you should see an interactive OpenStreetMap -4. You can see most cameras on the map immediately; the `data_handler` background process continuously applies updates from OpenStreetMap which become visible after refrshing the page +_tbd.: Populate camera data_ -5. Appending `-f docker-compose.dev.yml` applies these changes: - - - PHP won't supress any errors; to disable this, remove `return;` in `./web/www/sunders/config.php` - - - Making changes in the `web` will immediately apply them to the running containers; try modifying `web/www/sunders/index.php` - - - Making changes in the `data_handler` will immediately apply them to the running containers (try modifying `data_handler/utils/update_camera.sh`) - - - The host has access to database files at `./mariadb` ### Production 1. Close this repository @@ -57,9 +48,9 @@ To run Surveillance using docker, decide between development/testing or producti 3. Run `docker compose up` and wait for services to start up -3. Visit `http://localhost:8080/` in a browser; you should see an interactive OpenStreetMap +3. Visit `http://localhost:8080/` in a browser to open the web interface -4. You can see most cameras on the map immediately; the `data_handler` background process continuously applies updates from OpenStreetMap which become visible after refrshing the page +_tbd.: Populate camera data_ ## Surveillance nodes diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..28c7c46 --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,72 @@ +services: + db: + image: mariadb:12.0.2 + restart: unless-stopped + command: --max_allowed_packet=3250585600 + environment: + MYSQL_ROOT_PASSWORD: rootpassword # ${{secrets.MYSQL_ROOT_PASSWORD}} + MYSQL_DATABASE: camera # ${{secrets.MYSQL_DATABASE}} + MYSQL_USER: camera # ${{secrets.MYSQL_USER}} + MYSQL_PASSWORD: camerapassword # ${{secrets.MYSQL_PASSWORD}} + volumes: + - ./mariadb:/var/lib/mysql:Z + healthcheck: + test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-uroot", "-prootpassword"] + interval: 10s + timeout: 5s + start_period: 30s + retries: 5 + + web: + image: git.hamburg.ccc.de/ccchh/sunders/web:latest + restart: unless-stopped + environment: + MYSQL_HOST: db + MYSQL_DB: camera # ${{secrets.MYSQL_DATABASE}} + CAMERA_SELECT_USER: camera_select # ${{secrets.CAMERA_SELECT_USER}} + CAMERA_SELECT_USER_PASSWORD: camera_selectpassword # ${{secrets.CAMERA_SELECT_USER_PASSWORD}} + DEFAULT_ZOOM: 12 + DEFAULT_LAT: 0 + DEFAULT_LON: 0 + DEFAULT_LANGUAGE: en + IMPRESSUM_URL: https://hamburg.ccc.de/imprint/ + ports: + - "8081:80" + volumes: + - ./web/www/sunders:/var/www/html:Z + depends_on: + db: + condition: service_started + # all the way zoomed out, with hamburg at the center, at least one camera should be returned + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/sync-state.php"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + data_handler: + image: git.hamburg.ccc.de/ccchh/sunders/data_handler:latest + restart: unless-stopped + environment: + MYSQL_HOST: db + MYSQL_DB: camera # ${{secrets.MYSQL_DATABASE}} + MYSQL_USER: root # ${{secrets.MYSQL_USER}} + MYSQL_PASSWORD: rootpassword # ${{secrets.MYSQL_ROOT_PASSWORD}} + CAMERA_USER: camera # ${{secrets.CAMERA_USER}} + CAMERA_USER_PASSWORD: camerapassword # ${{secrets.CAMERA_USER_PASSWORD}} + CAMERA_SELECT_USER: camera_select # ${{secrets.CAMERA_SELECT_USER}} + CAMERA_SELECT_USER_PASSWORD: camera_selectpassword # ${{secrets.CAMERA_SELECT_USER_PASSWORD}} + depends_on: + db: + condition: service_healthy + restart: true + # if the latest `update_camera_*.log` contains "error", fail the healthcheck + healthcheck: + test: ["CMD", "sh", "-c", "ls /var/log | grep '^update_camera_' | xargs -I {} sh -c 'grep -q error /var/log/{} || exit 0; exit 1'"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + mariadb: \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index 61d0016..0000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,15 +0,0 @@ -services: - db: - volumes: - - ./mariadb:/var/lib/mysql:Z - - web: - volumes: - - ./web/www/sunders:/var/www/html:Z - environment: - APP_ENV: development - - data_handler: - volumes: - - ./data_handler/utils:/opt:Z - - ./data_handler/data_init:/opt/init/init.sql:Z \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6124c1d..0224ddf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,10 +33,12 @@ services: ports: - "8081:80" depends_on: - db: + data_handler: condition: service_started + # all the way zoomed out, with hamburg at the center, at least one camera should be returned healthcheck: - test: ["CMD", "curl", "-f", "http://localhost/sync-state.php"] + test: > + ["CMD", "curl -s 'http://localhost/camera.php?bbox=-92.52991540527346,30.683278176916133,131.7689595947266,72.87186315234298&zoom=4&width=2552&height=867' | grep '^\[.+\]$'"] interval: 10s timeout: 5s start_period: 30s diff --git a/web/www/sunders/add-lists.php b/web/www/sunders/add-lists.php index 12fc0c0..da9f396 100644 --- a/web/www/sunders/add-lists.php +++ b/web/www/sunders/add-lists.php @@ -1,4 +1,5 @@ \ No newline at end of file diff --git a/web/www/sunders/sync-state.php b/web/www/sunders/sync-state.php index 3cb8ef0..095e92c 100644 --- a/web/www/sunders/sync-state.php +++ b/web/www/sunders/sync-state.php @@ -2,29 +2,26 @@ error_reporting(0); include $pathToWebFolder.'config.php'; - try { - $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB); - if($mysqli->connect_errno) { - throw new Exception("Could not connect to database"); + + /* Connect to database */ + $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB); + if($mysqli->connect_errno) { + header('Content-type: application/json'); + $result = '{"error":"error while connecting to db : ' . $mysqli->error . '"}'; + echo $result; + exit; + } + + $syncstate_querry = $mysqli->query("SELECT * FROM sync_state WHERE k = 'sequenceNumber'"); + + while($row = $syncstate_querry->fetch_assoc()) { + $syncstate = array('sequenceNumber' => $row["v"]); } - $syncstate_querry = $mysqli->query("SELECT * FROM sync_state WHERE k = 'sequenceNumber'"); + $result = json_encode($syncstate); - while($row = $syncstate_querry->fetch_assoc()) { - $syncstate = array('sequenceNumber' => $row["v"]); - } + $mysqli->close(); - $result = json_encode($syncstate); - - $mysqli->close(); - - header('Content-type: application/json; Charset : utf-8'); - echo $result; - mysqli_report(MYSQLI_REPORT_OFF); - } catch (Exception $e) { - http_response_code(503); - header('Content-type: application/json'); - $result = '{"error":"Database unavailable"}'; - echo $result; - } + header('Content-type: application/json; Charset : utf-8'); + echo $result; ?>