Docker compose içerisine Mongodb eklendi ve bağlantıları yapıldı.
This commit is contained in:
14
.env.example
14
.env.example
@@ -5,4 +5,16 @@ VITE_API=http://localhost:3001
|
|||||||
TMDB_API_KEY="..."
|
TMDB_API_KEY="..."
|
||||||
TVDB_API_KEY="..."
|
TVDB_API_KEY="..."
|
||||||
VIDEO_THUMBNAIL_TIME=10
|
VIDEO_THUMBNAIL_TIME=10
|
||||||
FANART_TV_API_KEY=".."
|
FANART_TV_API_KEY=".."
|
||||||
|
|
||||||
|
# MongoDB
|
||||||
|
MONGO_HOST=mongo
|
||||||
|
MONGO_PORT=27017
|
||||||
|
MONGO_DB=dupe
|
||||||
|
MONGO_AUTH_SOURCE=admin
|
||||||
|
MONGO_INITDB_ROOT_USERNAME=dupe
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD=dupe
|
||||||
|
MONGO_USER=dupe
|
||||||
|
MONGO_PASS=dupe
|
||||||
|
# Opsiyonel özel bağlantı stringi (MONGO_HOST/PORT yerine geçer)
|
||||||
|
# MONGO_URI=mongodb://dupe:dupe@mongo:27017/dupe?authSource=admin
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
# Node modules
|
# Node modules
|
||||||
*/node_modules/
|
*/node_modules/
|
||||||
jspm_packages/
|
jspm_packages/
|
||||||
|
/data
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
version: "3.9"
|
version: "3.9"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
mongo:
|
||||||
|
image: mongo:7
|
||||||
|
container_name: mongo
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-dupe}
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:-dupe}
|
||||||
|
MONGO_INITDB_DATABASE: ${MONGO_DB:-dupe}
|
||||||
|
volumes:
|
||||||
|
- ./data/mongo:/data/db
|
||||||
|
- ./mongo-init:/docker-entrypoint-initdb.d:ro
|
||||||
|
ports:
|
||||||
|
- "27017:27017"
|
||||||
|
|
||||||
dupe:
|
dupe:
|
||||||
build: .
|
build: .
|
||||||
container_name: app
|
container_name: app
|
||||||
|
depends_on:
|
||||||
|
- mongo
|
||||||
ports:
|
ports:
|
||||||
- "3001:3001"
|
- "3001:3001"
|
||||||
volumes:
|
volumes:
|
||||||
@@ -18,3 +34,9 @@ services:
|
|||||||
TVDB_API_KEY: ${TVDB_API_KEY}
|
TVDB_API_KEY: ${TVDB_API_KEY}
|
||||||
FANART_TV_API_KEY: ${FANART_TV_API_KEY}
|
FANART_TV_API_KEY: ${FANART_TV_API_KEY}
|
||||||
VIDEO_THUMBNAIL_TIME: ${VIDEO_THUMBNAIL_TIME}
|
VIDEO_THUMBNAIL_TIME: ${VIDEO_THUMBNAIL_TIME}
|
||||||
|
MONGO_HOST: ${MONGO_HOST:-mongo}
|
||||||
|
MONGO_PORT: ${MONGO_PORT:-27017}
|
||||||
|
MONGO_DB: ${MONGO_DB:-dupe}
|
||||||
|
MONGO_USER: ${MONGO_INITDB_ROOT_USERNAME:-dupe}
|
||||||
|
MONGO_PASS: ${MONGO_INITDB_ROOT_PASSWORD:-dupe}
|
||||||
|
MONGO_AUTH_SOURCE: ${MONGO_AUTH_SOURCE:-admin}
|
||||||
|
|||||||
24
mongo-init/init.js
Normal file
24
mongo-init/init.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// MongoDB başlangıç scripti: istenen veritabanını açar ve boş bir koleksiyonla başlatır
|
||||||
|
(async () => {
|
||||||
|
const dbName =
|
||||||
|
process.env.MONGO_DB ||
|
||||||
|
process.env.MONGO_INITDB_DATABASE ||
|
||||||
|
"dupe";
|
||||||
|
|
||||||
|
// Mevcut bağlantı, root kullanıcı ile admin DB üzerinden geliyor
|
||||||
|
const db = db.getSiblingDB(dbName);
|
||||||
|
|
||||||
|
const marker = "dupe_init_marker";
|
||||||
|
const collections = await db.getCollectionNames();
|
||||||
|
|
||||||
|
if (!collections.includes(marker)) {
|
||||||
|
db.createCollection(marker);
|
||||||
|
db[marker].insertOne({
|
||||||
|
createdAt: new Date(),
|
||||||
|
note: "dupe init marker"
|
||||||
|
});
|
||||||
|
print(`📦 '${dbName}' veritabanı için init marker oluşturuldu.`);
|
||||||
|
} else {
|
||||||
|
print(`ℹ️ '${dbName}' veritabanı zaten başlatılmış.`);
|
||||||
|
}
|
||||||
|
})();
|
||||||
39
server/modules/db.js
Normal file
39
server/modules/db.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { MongoClient } from "mongodb";
|
||||||
|
|
||||||
|
const MONGO_HOST = process.env.MONGO_HOST || "mongo";
|
||||||
|
const MONGO_PORT = process.env.MONGO_PORT || "27017";
|
||||||
|
const MONGO_DB = process.env.MONGO_DB || "dupe";
|
||||||
|
const MONGO_USER = process.env.MONGO_USER || "dupe";
|
||||||
|
const MONGO_PASS = process.env.MONGO_PASS || "dupe";
|
||||||
|
const MONGO_AUTH_SOURCE = process.env.MONGO_AUTH_SOURCE || "admin";
|
||||||
|
|
||||||
|
const DEFAULT_URI = `mongodb://${encodeURIComponent(MONGO_USER)}:${encodeURIComponent(
|
||||||
|
MONGO_PASS
|
||||||
|
)}@${MONGO_HOST}:${MONGO_PORT}/${encodeURIComponent(MONGO_DB)}?authSource=${encodeURIComponent(
|
||||||
|
MONGO_AUTH_SOURCE
|
||||||
|
)}`;
|
||||||
|
|
||||||
|
const MONGO_URI = process.env.MONGO_URI || DEFAULT_URI;
|
||||||
|
|
||||||
|
let client = null;
|
||||||
|
let db = null;
|
||||||
|
|
||||||
|
export async function connectMongo() {
|
||||||
|
if (client && db) return { client, db };
|
||||||
|
|
||||||
|
const mongoClient = new MongoClient(MONGO_URI, {
|
||||||
|
maxPoolSize: 10,
|
||||||
|
serverSelectionTimeoutMS: 5000
|
||||||
|
});
|
||||||
|
|
||||||
|
await mongoClient.connect();
|
||||||
|
client = mongoClient;
|
||||||
|
db = mongoClient.db(MONGO_DB);
|
||||||
|
|
||||||
|
console.log(`📦 MongoDB bağlantısı hazır (db: ${db.databaseName})`);
|
||||||
|
return { client, db };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDb() {
|
||||||
|
return db;
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"express": "^4.19.2",
|
"express": "^4.19.2",
|
||||||
|
"mongodb": "^6.9.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import { createAuth } from "./modules/auth.js";
|
|||||||
import { buildHealthReport, healthRouter } from "./modules/health.js";
|
import { buildHealthReport, healthRouter } from "./modules/health.js";
|
||||||
import { restoreTorrentsFromDisk } from "./modules/state.js";
|
import { restoreTorrentsFromDisk } from "./modules/state.js";
|
||||||
import { createWebsocketServer, broadcastJson } from "./modules/websocket.js";
|
import { createWebsocketServer, broadcastJson } from "./modules/websocket.js";
|
||||||
|
import { connectMongo, getDb } from "./modules/db.js";
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = path.dirname(__filename);
|
const __dirname = path.dirname(__filename);
|
||||||
@@ -97,6 +98,16 @@ app.use(express.json());
|
|||||||
app.use(express.urlencoded({ extended: true }));
|
app.use(express.urlencoded({ extended: true }));
|
||||||
app.use("/downloads", express.static(DOWNLOAD_DIR));
|
app.use("/downloads", express.static(DOWNLOAD_DIR));
|
||||||
|
|
||||||
|
// MongoDB bağlantısını başlat
|
||||||
|
connectMongo()
|
||||||
|
.then(({ db }) => {
|
||||||
|
app.locals.db = db;
|
||||||
|
app.locals.getDb = getDb;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error("❌ MongoDB bağlantısı kurulamadı:", err.message);
|
||||||
|
});
|
||||||
|
|
||||||
// --- En uygun video dosyasını seç ---
|
// --- En uygun video dosyasını seç ---
|
||||||
function pickBestVideoFile(torrent) {
|
function pickBestVideoFile(torrent) {
|
||||||
const videos = torrent.files
|
const videos = torrent.files
|
||||||
|
|||||||
Reference in New Issue
Block a user