restructure project
This commit is contained in:
parent
49b97c6c4d
commit
38348f7fa2
|
|
@ -1,2 +0,0 @@
|
||||||
node_modules/
|
|
||||||
package-lock.json
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
FROM linuxserver/rdesktop:alpine-icewm
|
|
||||||
# FROM linuxserver/rdesktop:alpine-openbox
|
|
||||||
# FROM alpine:3.18
|
|
||||||
|
|
||||||
RUN apk update --no-cache
|
|
||||||
RUN apk add --no-cache npm chromium
|
|
||||||
|
|
||||||
RUN mkdir /puppeteer
|
|
||||||
WORKDIR /puppeteer
|
|
||||||
|
|
||||||
COPY ./puppeteer.js /puppeteer/puppeteer.js
|
|
||||||
COPY ./server.js /puppeteer/server.js
|
|
||||||
|
|
||||||
USER root
|
|
||||||
COPY ./puppeteer.sh /puppeteer.sh
|
|
||||||
RUN chmod +x /puppeteer.sh
|
|
||||||
|
|
||||||
CMD [ "sh", "/puppeteer.sh" ]
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
sudo chown abc:abc -R /puppeteer/chrome-profiles
|
|
||||||
npm i puppeteer
|
|
||||||
node server.js
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
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}/`);
|
|
||||||
});
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
data/
|
||||||
|
log/
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"svg.preview.background": "editor"
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
You should change the /src/.env.example file name to .env and run
|
You should change the /src/.env.example file name to .env and run
|
||||||
```
|
```
|
||||||
docker network create laravel
|
docker network create producer
|
||||||
docker compose up rabbitmq socketio -d
|
docker compose up rabbitmq socketio -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ Version: 1
|
||||||
http://localhost:8001/horizon
|
http://localhost:8001/horizon
|
||||||
```
|
```
|
||||||
|
|
||||||
Rabbitmq: rabbit/rabbit@123
|
Rabbitmq: rabbit/rabbit123
|
||||||
```
|
```
|
||||||
http://localhost:15672
|
http://localhost:15672
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
node_modules/
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# FROM linuxserver/rdesktop:alpine-icewm
|
||||||
|
# # FROM linuxserver/rdesktop:alpine-openbox
|
||||||
|
FROM alpine:3.18
|
||||||
|
|
||||||
|
RUN apk update --no-cache
|
||||||
|
RUN apk add --no-cache npm chromium
|
||||||
|
|
||||||
|
RUN mkdir /consumer
|
||||||
|
WORKDIR /consumer
|
||||||
|
|
||||||
|
COPY ./consumer.js /consumer/consumer.js
|
||||||
|
COPY ./puppeteer.js /consumer/puppeteer.js
|
||||||
|
COPY ./package.json /consumer/package.json
|
||||||
|
|
||||||
|
USER root
|
||||||
|
COPY ./docker.sh /docker.sh
|
||||||
|
RUN chmod +x /docker.sh
|
||||||
|
|
||||||
|
CMD [ "sh", "/docker.sh" ]
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
const amqplib = require("amqplib");
|
||||||
|
const connectStr = "amqp://rabbit:rabbit123@localhost";
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const conn = await amqplib.connect(connectStr);
|
||||||
|
const channel = await conn.createChannel();
|
||||||
|
const queue = "process1";
|
||||||
|
|
||||||
|
process.once("SIGINT", async () => {
|
||||||
|
await channel.close();
|
||||||
|
await connection.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
await channel.assertQueue(queue);
|
||||||
|
await channel.prefetch(1);
|
||||||
|
|
||||||
|
await channel.consume(
|
||||||
|
queue,
|
||||||
|
async (message) => {
|
||||||
|
try {
|
||||||
|
await processMessage(channel, message);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error processing message:", error.message);
|
||||||
|
// If processing fails, you can choose to requeue or acknowledge the message
|
||||||
|
// Here, we're acknowledging the message even if an error occurs to remove it from the queue
|
||||||
|
channel.ack(message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{noAck: false}
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log("[*] Waiting for messages. To exit press CTRL+C");
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
async function processMessage(channel, message) {
|
||||||
|
try {
|
||||||
|
const response = JSON.parse(message.content.toString())
|
||||||
|
console.log("[x] Received", response);
|
||||||
|
await require('./puppeteer')({})
|
||||||
|
console.log("[x] Done");
|
||||||
|
// After successful processing, acknowledge the message to delete it from the queue
|
||||||
|
channel.ack(message);
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error("Error during processing: " + error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# sudo chown abc:abc -R /puppeteer/chrome-profiles
|
||||||
|
npm i
|
||||||
|
node consumer.js
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"amqplib": "^0.10.3",
|
||||||
|
"bramqp": "^0.6.1",
|
||||||
|
"puppeteer": "^22.3.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,15 +3,14 @@ const puppeteer = require('puppeteer');
|
||||||
const launch = async (
|
const launch = async (
|
||||||
config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 }
|
config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 }
|
||||||
) => {
|
) => {
|
||||||
|
|
||||||
config = Object.assign({
|
config = Object.assign({
|
||||||
url: 'https://scrapingbee.com',
|
url: 'https://www.timeanddate.com/',
|
||||||
screenshotPath: './screenshot.jpg',
|
screenshotPath: `./screenshot/${Date.now()}.jpg`,
|
||||||
executablePath: '/usr/bin/chromium',
|
executablePath: '/usr/bin/chromium',
|
||||||
timeout: 1000,
|
timeout: 1000,
|
||||||
}, config)
|
}, config)
|
||||||
|
|
||||||
const profile = {
|
const PROFILE = {
|
||||||
data: [
|
data: [
|
||||||
// 'wormlazy199210',
|
// 'wormlazy199210',
|
||||||
'wormlazy199211',
|
'wormlazy199211',
|
||||||
|
|
@ -28,7 +27,7 @@ const launch = async (
|
||||||
'--no-sandbox',
|
'--no-sandbox',
|
||||||
'--headless',
|
'--headless',
|
||||||
'--disable-gpu',
|
'--disable-gpu',
|
||||||
`--user-data-dir=/puppeteer/chrome-profiles/${profile.select()}`
|
`--user-data-dir=/puppeteer/chrome-profiles/${PROFILE.select()}`
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
|
|
@ -51,6 +50,9 @@ const launch = async (
|
||||||
console.log(`Error: ${err.message}`);
|
console.log(`Error: ${err.message}`);
|
||||||
} finally {
|
} finally {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
|
await Object.assign(config, {
|
||||||
|
status: true,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
module.exports = launch
|
module.exports = launch
|
||||||
|
|
@ -3,42 +3,28 @@ version : '3'
|
||||||
name: laravel-rabbitmq${VERSION}
|
name: laravel-rabbitmq${VERSION}
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
laravel:
|
producer:
|
||||||
external: true
|
external: true
|
||||||
puppeteer:
|
rabbitmq:
|
||||||
|
driver: bridge
|
||||||
|
socketio:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
redis:
|
redis:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
consumer:
|
||||||
tty: true
|
|
||||||
image: bitnami/laravel:9
|
|
||||||
volumes:
|
|
||||||
- ./src:/app
|
|
||||||
command: "sh /app/laravel-entrypoint.sh"
|
|
||||||
ports:
|
|
||||||
- 800${VERSION}:8000
|
|
||||||
networks:
|
|
||||||
- laravel
|
|
||||||
- puppeteer
|
|
||||||
- redis
|
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
- puppeteer
|
|
||||||
|
|
||||||
puppeteer:
|
|
||||||
build:
|
build:
|
||||||
context: ./.docker/puppeteer
|
context: ./consumer
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
shm_size: '1GB'
|
shm_size: '1GB'
|
||||||
volumes:
|
volumes:
|
||||||
- ./chrome-profiles:/puppeteer/chrome-profiles
|
- ./chrome-profiles:/consumer/chrome-profiles
|
||||||
ports:
|
ports:
|
||||||
- :3389
|
- :3389
|
||||||
- :4000
|
- :4000
|
||||||
networks:
|
networks:
|
||||||
- puppeteer
|
- rabbitmq
|
||||||
privileged: true
|
privileged: true
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
|
|
@ -50,6 +36,21 @@ services:
|
||||||
- redis
|
- redis
|
||||||
|
|
||||||
# ----COMMON---- #
|
# ----COMMON---- #
|
||||||
|
producer:
|
||||||
|
tty: true
|
||||||
|
image: bitnami/laravel:9
|
||||||
|
volumes:
|
||||||
|
- ./producer:/producer
|
||||||
|
command: "sh /producer/producer.sh"
|
||||||
|
ports:
|
||||||
|
- 800${VERSION}:8000
|
||||||
|
networks:
|
||||||
|
- rabbitmq
|
||||||
|
- socketio
|
||||||
|
- redis
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
|
||||||
socketio:
|
socketio:
|
||||||
container_name: socketio
|
container_name: socketio
|
||||||
build:
|
build:
|
||||||
|
|
@ -58,7 +59,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
- laravel
|
- socketio
|
||||||
|
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
image: rabbitmq:3-management
|
image: rabbitmq:3-management
|
||||||
|
|
@ -69,9 +70,9 @@ services:
|
||||||
- 15672:15672
|
- 15672:15672
|
||||||
environment:
|
environment:
|
||||||
- RABBITMQ_DEFAULT_USER=rabbit
|
- RABBITMQ_DEFAULT_USER=rabbit
|
||||||
- RABBITMQ_DEFAULT_PASS=rabbit@123
|
- RABBITMQ_DEFAULT_PASS=rabbit123
|
||||||
volumes:
|
volumes:
|
||||||
- ./.docker/rabbitmq/data:/var/lib/rabbitmq/
|
- ./.docker/rabbitmq/data:/var/lib/rabbitmq/
|
||||||
- ./.docker/rabbitmq/log:/var/log/rabbitmq
|
- ./.docker/rabbitmq/log:/var/log/rabbitmq
|
||||||
networks:
|
networks:
|
||||||
- laravel
|
- rabbitmq
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||||
RABBITMQ_HOST=rabbitmq
|
RABBITMQ_HOST=rabbitmq
|
||||||
RABBITMQ_PORT=5672
|
RABBITMQ_PORT=5672
|
||||||
RABBITMQ_USER=rabbit
|
RABBITMQ_USER=rabbit
|
||||||
RABBITMQ_PASSWORD=rabbit@123
|
RABBITMQ_PASSWORD=rabbit123
|
||||||
RABBITMQ_VHOST=/
|
RABBITMQ_VHOST=/
|
||||||
|
|
||||||
HORIZON_QUEUES='["default", "process1", "process2", "process3"]'
|
HORIZON_QUEUES='["default", "process1", "process2", "process3"]'
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/sh
|
||||||
|
php -v
|
||||||
|
|
||||||
|
# COMPOSER
|
||||||
|
if [ ! -d "/producer/vendor" ]
|
||||||
|
then
|
||||||
|
composer install
|
||||||
|
fi
|
||||||
|
|
||||||
|
# DATABASE
|
||||||
|
if [ ! -f "/producer/database/database.sqlite" ]
|
||||||
|
then
|
||||||
|
touch /producer/database/database.sqlite
|
||||||
|
php artisan migrate
|
||||||
|
fi
|
||||||
|
|
||||||
|
# HORIZON
|
||||||
|
sh /producer/.horizon/horizon.sh
|
||||||
|
|
||||||
|
php /producer/artisan serve --host "0.0.0.0"
|
||||||
|
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 648 B |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue