From 548eb9613c5e3770cb7a3722fb81178633c76ebe Mon Sep 17 00:00:00 2001 From: "kai.t" Date: Fri, 23 Feb 2024 08:45:55 +0000 Subject: [PATCH] update docker --- .docker/puppeteer/.gitignore | 2 + .docker/puppeteer/Dockerfile | 13 ++++ .docker/puppeteer/package.json | 5 ++ .docker/puppeteer/puppeteer.js | 39 ++++++++++ .docker/puppeteer/server.js | 55 ++++++++++++++ .docker/socketio/.gitignore | 2 + .docker/socketio/Dockerfile | 12 +++ .docker/socketio/client.js | 21 ++++++ .docker/socketio/package.json | 6 ++ .docker/socketio/server.js | 29 ++++++++ .github/workflows/codesee-arch-diagram.yml | 87 ---------------------- docker-compose.yml | 14 +++- src/.env.example | 2 + src/app/Console/Commands/Socket.php | 47 ++++++++++++ src/composer.json | 1 + src/composer.lock | 77 ++++++++++++++++++- src/routes/web.php | 6 +- 17 files changed, 327 insertions(+), 91 deletions(-) create mode 100644 .docker/puppeteer/.gitignore create mode 100644 .docker/puppeteer/Dockerfile create mode 100644 .docker/puppeteer/package.json create mode 100644 .docker/puppeteer/puppeteer.js create mode 100644 .docker/puppeteer/server.js create mode 100644 .docker/socketio/.gitignore create mode 100644 .docker/socketio/Dockerfile create mode 100644 .docker/socketio/client.js create mode 100644 .docker/socketio/package.json create mode 100644 .docker/socketio/server.js delete mode 100644 .github/workflows/codesee-arch-diagram.yml create mode 100644 src/app/Console/Commands/Socket.php diff --git a/.docker/puppeteer/.gitignore b/.docker/puppeteer/.gitignore new file mode 100644 index 0000000..504afef --- /dev/null +++ b/.docker/puppeteer/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json diff --git a/.docker/puppeteer/Dockerfile b/.docker/puppeteer/Dockerfile new file mode 100644 index 0000000..848a1b3 --- /dev/null +++ b/.docker/puppeteer/Dockerfile @@ -0,0 +1,13 @@ +FROM alpine:3.18 + +RUN apk update --no-cache +RUN apk add --no-cache npm chromium + +RUN mkdir /app +WORKDIR /app + +COPY ./puppeteer.js /app/puppeteer.js +COPY ./server.js /app/server.js +COPY ./package.json /app/package.json + +CMD sh -c 'npm i && node server.js' diff --git a/.docker/puppeteer/package.json b/.docker/puppeteer/package.json new file mode 100644 index 0000000..c41eabf --- /dev/null +++ b/.docker/puppeteer/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "puppeteer": "^0.11.0" + } +} diff --git a/.docker/puppeteer/puppeteer.js b/.docker/puppeteer/puppeteer.js new file mode 100644 index 0000000..7924d42 --- /dev/null +++ b/.docker/puppeteer/puppeteer.js @@ -0,0 +1,39 @@ +const puppeteer = require('puppeteer'); + +module.exports = async ( + config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 } +) => { + + config = Object.assign({ + url: 'https://scrapingbee.com', + screenshotPath: './screenshot.jpg', + executablePath: '/usr/bin/chromium', + timeout: 1000, + }, config) + + const browser = await puppeteer.launch({ + executablePath: config.executablePath, + args: ['--no-sandbox', '--headless', '--disable-gpu'] + }); + const page = await browser.newPage(); + + // Set the viewport's width and height + await page.setViewport({ width: 1920, height: 1080 }); + + // Open ScrapingBee's home page + await page.goto(config.url); + + // Waiting Dom Ready + await new Promise(r => setTimeout(r, config.timeout)); + + try { + // Capture screenshot and save it in the current folder: + await page.screenshot({ path: config.screenshotPath }); + console.log(`Screenshot has been captured successfully`); + + } catch (err) { + console.log(`Error: ${err.message}`); + } finally { + await browser.close(); + } +}; diff --git a/.docker/puppeteer/server.js b/.docker/puppeteer/server.js new file mode 100644 index 0000000..1081bbd --- /dev/null +++ b/.docker/puppeteer/server.js @@ -0,0 +1,55 @@ +const http = require('http'); +const url = require('url'); +const fs = require('fs'); +const puppeteer = require('./puppeteer'); + +// Create an HTTP server +const server = http.createServer((req, res) => { + const parseUrl = url.parse(req.url, true); + + const fail = (error) => { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify({ + status: false, + message: error + })) + } + + const config = { + screenshotPath: './screenshot2.jpg' + } + + if (parseUrl.query.url) { + config.url = parseUrl.query.url + } + + + try { + puppeteer(config) + .then(function() { + fs.readFile(config.screenshotPath, (err, data) => { + if (err) { + res.writeHead(500); + res.end('Internal Server Error'); + } else { + res.writeHead(200, {'Content-Type': 'image/jpeg'}); + res.end(data); + } + }); + }) + .catch(function(error) { + fail(error.toString()) + }); + } catch (error) { + fail(error.toString()) + } +}); + +// Set the port to listen to +const port = process.env.PORT || 4000; +const host = '0.0.0.0'; // Listen on all network interfaces + +// Start the server +server.listen(port, host, () => { + console.log(`Server running at http://${host}:${port}/`); +}); diff --git a/.docker/socketio/.gitignore b/.docker/socketio/.gitignore new file mode 100644 index 0000000..504afef --- /dev/null +++ b/.docker/socketio/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json diff --git a/.docker/socketio/Dockerfile b/.docker/socketio/Dockerfile new file mode 100644 index 0000000..a17e490 --- /dev/null +++ b/.docker/socketio/Dockerfile @@ -0,0 +1,12 @@ +FROM alpine:3.18 + +RUN apk update +RUN apk add --no-cache npm + +RUN mkdir /socketio +WORKDIR /socketio +COPY ./server.js /socketio +COPY ./package.json /socketio + +EXPOSE 3000 +CMD sh -c 'npm i && node server.js' diff --git a/.docker/socketio/client.js b/.docker/socketio/client.js new file mode 100644 index 0000000..a87871c --- /dev/null +++ b/.docker/socketio/client.js @@ -0,0 +1,21 @@ +// Import Socket.IO client library +const io = require('socket.io-client'); + +// URL of the Socket.IO server +const serverUrl = 'http://localhost:3000'; + +// Connect to the server +const socket = io(serverUrl); + +// Event handler for successful connection +socket.on('connect', () => { + console.log('Connected to server'); +}); + +// Event handler for receiving messages from the server +socket.on('message', (data) => { + console.log('Received message from server:', data); +}); + +// Sending a message to the server +socket.emit('message', 'Hello, server!'); diff --git a/.docker/socketio/package.json b/.docker/socketio/package.json new file mode 100644 index 0000000..9c6c370 --- /dev/null +++ b/.docker/socketio/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "socket.io": "^4.7.4", + "socket.io-client": "^4.7.4" + } +} diff --git a/.docker/socketio/server.js b/.docker/socketio/server.js new file mode 100644 index 0000000..fe6bd58 --- /dev/null +++ b/.docker/socketio/server.js @@ -0,0 +1,29 @@ +const httpServer = require("http").createServer(); +const io = require("socket.io")(httpServer, { + // ... +}); + +io.on("connection", (socket) => { + + console.log('Connected'); + + // Handle data received from the client + socket.on('data', (data) => { + console.log('Received:', data.toString()); + }); + + socket.on('message', (data) => { + console.log('Received:', data.toString()); + }); + + // Handle when the client disconnects + socket.on('end', () => { + console.log('Client disconnected'); + }); +}); + +const port = process.env.PORT || 3000; +const host = '0.0.0.0'; +httpServer.listen(port, host, () => { + console.log(`Server running on port ${host}:${port}`); +}); diff --git a/.github/workflows/codesee-arch-diagram.yml b/.github/workflows/codesee-arch-diagram.yml deleted file mode 100644 index f02cc13..0000000 --- a/.github/workflows/codesee-arch-diagram.yml +++ /dev/null @@ -1,87 +0,0 @@ -on: - push: - branches: - - master - pull_request_target: - types: [opened, synchronize, reopened] - -name: CodeSee Map - -jobs: - test_map_action: - runs-on: ubuntu-latest - continue-on-error: true - name: Run CodeSee Map Analysis - steps: - - name: checkout - id: checkout - uses: actions/checkout@v2 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.ref }} - fetch-depth: 0 - - # codesee-detect-languages has an output with id languages. - - name: Detect Languages - id: detect-languages - uses: Codesee-io/codesee-detect-languages-action@latest - - - name: Configure JDK 16 - uses: actions/setup-java@v2 - if: ${{ fromJSON(steps.detect-languages.outputs.languages).java }} - with: - java-version: '16' - distribution: 'zulu' - - # CodeSee Maps Go support uses a static binary so there's no setup step required. - - - name: Configure Node.js 14 - uses: actions/setup-node@v2 - if: ${{ fromJSON(steps.detect-languages.outputs.languages).javascript }} - with: - node-version: '14' - - - name: Configure Python 3.x - uses: actions/setup-python@v2 - if: ${{ fromJSON(steps.detect-languages.outputs.languages).python }} - with: - python-version: '3.10' - architecture: 'x64' - - - name: Configure Ruby '3.x' - uses: ruby/setup-ruby@v1 - if: ${{ fromJSON(steps.detect-languages.outputs.languages).ruby }} - with: - ruby-version: '3.0' - - # We need the rust toolchain because it uses rustc and cargo to inspect the package - - name: Configure Rust 1.x stable - uses: actions-rs/toolchain@v1 - if: ${{ fromJSON(steps.detect-languages.outputs.languages).rust }} - with: - toolchain: stable - - - name: Generate Map - id: generate-map - uses: Codesee-io/codesee-map-action@latest - with: - step: map - api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} - github_ref: ${{ github.ref }} - languages: ${{ steps.detect-languages.outputs.languages }} - - - name: Upload Map - id: upload-map - uses: Codesee-io/codesee-map-action@latest - with: - step: mapUpload - api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} - github_ref: ${{ github.ref }} - - - name: Insights - id: insights - uses: Codesee-io/codesee-map-action@latest - with: - step: insights - api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }} - github_ref: ${{ github.ref }} diff --git a/docker-compose.yml b/docker-compose.yml index 5c75c88..1cd1ceb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,10 @@ version : '3' + +name: laravel-rabbitmq + networks: laravel: + services: app: tty: true @@ -12,10 +16,18 @@ services: - 1000:8000 - 1001:8001 networks: - - laravel + laravel: depends_on: - redis + puppeteer: + build: + context: ./.docker/puppeteer + dockerfile: Dockerfile + ports: + - 4000:4000 + shm_size: '256M' + redis: image: redis container_name: redis diff --git a/src/.env.example b/src/.env.example index 9411ff3..247e39e 100644 --- a/src/.env.example +++ b/src/.env.example @@ -4,6 +4,8 @@ APP_KEY=base64:S0K/eYkvLZYwMvP7CDU6HoII9UmcTGmif9lZepsoSFs= APP_DEBUG=true APP_URL=http://localhost +SOCKET_IO=http://socketio:3000 + LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug diff --git a/src/app/Console/Commands/Socket.php b/src/app/Console/Commands/Socket.php new file mode 100644 index 0000000..c68e510 --- /dev/null +++ b/src/app/Console/Commands/Socket.php @@ -0,0 +1,47 @@ +connect(); + + // Sending a message to the server + $client->emit('message', ['Hello, server!']); + + // Close the connection when done + $client->disconnect(); + } +} diff --git a/src/composer.json b/src/composer.json index 7fa8dcf..9b4f86a 100644 --- a/src/composer.json +++ b/src/composer.json @@ -6,6 +6,7 @@ "license": "MIT", "require": { "php": "^8.0.2", + "elephantio/elephant.io": "^4.7", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^9.19", "laravel/horizon": "^5.22", diff --git a/src/composer.lock b/src/composer.lock index e24439c..ccad120 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "97efdeb4e149ae370ca39b1992647562", + "content-hash": "25b944829f758ab8566122440a9ef34e", "packages": [ { "name": "brick/math", @@ -501,6 +501,81 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "elephantio/elephant.io", + "version": "v4.7.0", + "source": { + "type": "git", + "url": "https://github.com/ElephantIO/elephant.io.git", + "reference": "4b2f8f044c815c6c5b7c989cc2e18a370718e55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ElephantIO/elephant.io/zipball/4b2f8f044c815c6c5b7c989cc2e18a370718e55f", + "reference": "4b2f8f044c815c6c5b7c989cc2e18a370718e55f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.2", + "psr/log": "^1.1 || ^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "monolog/monolog": "^2.8 || ^3.0", + "phpunit/phpunit": "^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ElephantIO\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Baptiste ClaviƩ", + "email": "baptiste@wisembly.com", + "homepage": "http://baptiste.xn--clavi-fsa.net/", + "role": "Maintainer" + }, + { + "name": "Guillaume Potier", + "email": "guillaume@wisembly.com", + "role": "Maintainer" + }, + { + "name": "Toha", + "email": "tohenk@yahoo.com", + "role": "Maintainer" + }, + { + "name": "Ludovic Barreca", + "email": "ludogp2@gmail.com", + "role": "Project Founder" + }, + { + "name": "Elephant.IO Community", + "role": "Contributors :)" + } + ], + "description": "Send events to a socket.io server through PHP", + "homepage": "https://elephantio.github.io/elephant.io/", + "keywords": [ + "Socket.io", + "dialog", + "nodejs", + "real time", + "websocket" + ], + "support": { + "source": "https://github.com/ElephantIO/elephant.io/tree/v4.7.0" + }, + "time": "2024-02-16T19:40:38+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.3.0", diff --git a/src/routes/web.php b/src/routes/web.php index a47c33d..0c59f4e 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -1,5 +1,6 @@