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
|
||||
```
|
||||
docker network create laravel
|
||||
docker network create producer
|
||||
docker compose up rabbitmq socketio -d
|
||||
```
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ Version: 1
|
|||
http://localhost:8001/horizon
|
||||
```
|
||||
|
||||
Rabbitmq: rabbit/rabbit@123
|
||||
Rabbitmq: rabbit/rabbit123
|
||||
```
|
||||
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 (
|
||||
config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 }
|
||||
) => {
|
||||
|
||||
config = Object.assign({
|
||||
url: 'https://scrapingbee.com',
|
||||
screenshotPath: './screenshot.jpg',
|
||||
url: 'https://www.timeanddate.com/',
|
||||
screenshotPath: `./screenshot/${Date.now()}.jpg`,
|
||||
executablePath: '/usr/bin/chromium',
|
||||
timeout: 1000,
|
||||
}, config)
|
||||
|
||||
const profile = {
|
||||
const PROFILE = {
|
||||
data: [
|
||||
// 'wormlazy199210',
|
||||
'wormlazy199211',
|
||||
|
|
@ -28,7 +27,7 @@ const launch = async (
|
|||
'--no-sandbox',
|
||||
'--headless',
|
||||
'--disable-gpu',
|
||||
`--user-data-dir=/puppeteer/chrome-profiles/${profile.select()}`
|
||||
`--user-data-dir=/puppeteer/chrome-profiles/${PROFILE.select()}`
|
||||
]
|
||||
});
|
||||
const page = await browser.newPage();
|
||||
|
|
@ -51,6 +50,9 @@ const launch = async (
|
|||
console.log(`Error: ${err.message}`);
|
||||
} finally {
|
||||
await browser.close();
|
||||
await Object.assign(config, {
|
||||
status: true,
|
||||
})
|
||||
}
|
||||
};
|
||||
module.exports = launch
|
||||
|
|
@ -3,42 +3,28 @@ version : '3'
|
|||
name: laravel-rabbitmq${VERSION}
|
||||
|
||||
networks:
|
||||
laravel:
|
||||
producer:
|
||||
external: true
|
||||
puppeteer:
|
||||
rabbitmq:
|
||||
driver: bridge
|
||||
socketio:
|
||||
driver: bridge
|
||||
redis:
|
||||
driver: bridge
|
||||
|
||||
services:
|
||||
app:
|
||||
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:
|
||||
consumer:
|
||||
build:
|
||||
context: ./.docker/puppeteer
|
||||
context: ./consumer
|
||||
dockerfile: Dockerfile
|
||||
shm_size: '1GB'
|
||||
volumes:
|
||||
- ./chrome-profiles:/puppeteer/chrome-profiles
|
||||
- ./chrome-profiles:/consumer/chrome-profiles
|
||||
ports:
|
||||
- :3389
|
||||
- :4000
|
||||
networks:
|
||||
- puppeteer
|
||||
- rabbitmq
|
||||
privileged: true
|
||||
restart: always
|
||||
|
||||
|
|
@ -50,6 +36,21 @@ services:
|
|||
- redis
|
||||
|
||||
# ----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:
|
||||
container_name: socketio
|
||||
build:
|
||||
|
|
@ -58,7 +59,7 @@ services:
|
|||
ports:
|
||||
- 3000:3000
|
||||
networks:
|
||||
- laravel
|
||||
- socketio
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:3-management
|
||||
|
|
@ -69,9 +70,9 @@ services:
|
|||
- 15672:15672
|
||||
environment:
|
||||
- RABBITMQ_DEFAULT_USER=rabbit
|
||||
- RABBITMQ_DEFAULT_PASS=rabbit@123
|
||||
- RABBITMQ_DEFAULT_PASS=rabbit123
|
||||
volumes:
|
||||
- ./.docker/rabbitmq/data:/var/lib/rabbitmq/
|
||||
- ./.docker/rabbitmq/log:/var/log/rabbitmq
|
||||
networks:
|
||||
- laravel
|
||||
- rabbitmq
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
|||
RABBITMQ_HOST=rabbitmq
|
||||
RABBITMQ_PORT=5672
|
||||
RABBITMQ_USER=rabbit
|
||||
RABBITMQ_PASSWORD=rabbit@123
|
||||
RABBITMQ_PASSWORD=rabbit123
|
||||
RABBITMQ_VHOST=/
|
||||
|
||||
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