+23
@@ -0,0 +1,23 @@
|
||||
FROM node:20-alpine
|
||||
|
||||
RUN apk add --no-cache python3 make g++ ffmpeg \
|
||||
&& ln -sf python3 /usr/bin/python
|
||||
|
||||
ENV FS_DIRECTORY=/data/
|
||||
ENV TEMP_DIRECTORY=/temp/
|
||||
|
||||
WORKDIR /usr/app-production
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm install
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# Default Ports
|
||||
EXPOSE 8080
|
||||
EXPOSE 3000
|
||||
|
||||
CMD [ "npm", "run", "start"]
|
||||
@@ -1,17 +0,0 @@
|
||||
FROM node:20
|
||||
|
||||
WORKDIR /usr/app-production
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm install
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# Default Ports
|
||||
EXPOSE 8080
|
||||
EXPOSE 3000
|
||||
|
||||
CMD [ "npm", "run", "start"]
|
||||
@@ -1,6 +1,9 @@
|
||||
# Either remove the .example from the end of this filename.
|
||||
# Or create a new file with the same name, but without the .example extension.
|
||||
|
||||
# NOTE: If you are using docker, you should provide these env variables during the docker run command instead.
|
||||
# But you can still use this file as a guide.
|
||||
|
||||
# MongoDB URL: Connection string for your MongoDB database
|
||||
# example: mongodb://localhost:27017/mydrive
|
||||
MONGODB_URL=
|
||||
@@ -34,8 +37,7 @@ HTTP_PORT=
|
||||
HTTPS_PORT=
|
||||
|
||||
# URL (optional): The URL to run the server on.
|
||||
# Most likely not needed, but useful if you are running docker or such
|
||||
# And need to bind to 0.0.0.0 instead.
|
||||
# Most likely not needed, this changes the ip address/url express listens on.
|
||||
URL=
|
||||
|
||||
# Email verifcation (optional): If you want to enable email verification configure as so.
|
||||
@@ -84,4 +86,11 @@ SECURE_COOKIES=
|
||||
# SSL=true
|
||||
# Place your SSL certificate files in the root directory of the project
|
||||
# With the names: certificate.crt, certificate.key, and certificate.ca-bundle;
|
||||
SSL=
|
||||
SSL=
|
||||
|
||||
# HTTPS cert paths (optional): If you need to change the paths of the https certs
|
||||
# You can do so with these env variables.
|
||||
# By default myDrive looks for certificate.crt, certificate.ca-bundle and certificate.key on the root of the project
|
||||
HTTPS_KEY_PATH=
|
||||
HTTPS_CA_PATH=
|
||||
HTTPS_CRT_PATH=
|
||||
@@ -1,6 +1,9 @@
|
||||
# Either remove the .example from the end of this filename.
|
||||
# Or create a new file with the same name, but without the .example extension.
|
||||
|
||||
# NOTE: If you are using docker, you should provide these env variables during the docker run command instead.
|
||||
# But you can still use this file as a guide.
|
||||
|
||||
# MongoDB URL: Connection string for your MongoDB database
|
||||
# example: mongodb://localhost:27017/mydrive
|
||||
MONGODB_URL=
|
||||
@@ -34,8 +37,7 @@ HTTP_PORT=
|
||||
HTTPS_PORT=
|
||||
|
||||
# URL (optional): The URL to run the server on.
|
||||
# Most likely not needed, but useful if you are running docker or such
|
||||
# And need to bind to 0.0.0.0 instead.
|
||||
# Most likely not needed, this changes the ip address/url express listens on.
|
||||
URL=
|
||||
|
||||
# Email verifcation (optional): If you want to enable email verification configure as so.
|
||||
@@ -84,4 +86,11 @@ SECURE_COOKIES=
|
||||
# SSL=true
|
||||
# Place your SSL certificate files in the root directory of the project
|
||||
# With the names: certificate.crt, certificate.key, and certificate.ca-bundle;
|
||||
SSL=
|
||||
SSL=
|
||||
|
||||
# HTTPS cert paths (optional): If you need to change the paths of the https certs
|
||||
# You can do so with these env variables.
|
||||
# By default myDrive looks for certificate.crt, certificate.ca-bundle and certificate.key on the root of the project
|
||||
HTTPS_KEY_PATH=
|
||||
HTTPS_CA_PATH=
|
||||
HTTPS_CRT_PATH=
|
||||
@@ -1,6 +1,9 @@
|
||||
# Either remove the .example from the end of this filename.
|
||||
# Or create a new file with the same name, but without the .example extension.
|
||||
|
||||
# NOTE: If you are using docker, you should provide these env variables during the docker run command instead.
|
||||
# But you can still use this file as a guide.
|
||||
|
||||
# MongoDB URL: Connection string for your MongoDB database
|
||||
# example: mongodb://localhost:27017/mydrive
|
||||
MONGODB_URL=
|
||||
@@ -34,8 +37,7 @@ HTTP_PORT=
|
||||
HTTPS_PORT=
|
||||
|
||||
# URL (optional): The URL to run the server on.
|
||||
# Most likely not needed, but useful if you are running docker or such
|
||||
# And need to bind to 0.0.0.0 instead.
|
||||
# Most likely not needed, this changes the ip address/url express listens on.
|
||||
URL=
|
||||
|
||||
# Email verifcation (optional): If you want to enable email verification configure as so.
|
||||
@@ -84,4 +86,11 @@ SECURE_COOKIES=
|
||||
# SSL=true
|
||||
# Place your SSL certificate files in the root directory of the project
|
||||
# With the names: certificate.crt, certificate.key, and certificate.ca-bundle;
|
||||
SSL=
|
||||
SSL=
|
||||
|
||||
# HTTPS cert paths (optional): If you need to change the paths of the https certs
|
||||
# You can do so with these env variables.
|
||||
# By default myDrive looks for certificate.crt, certificate.ca-bundle and certificate.key on the root of the project
|
||||
HTTPS_KEY_PATH=
|
||||
HTTPS_CA_PATH=
|
||||
HTTPS_CRT_PATH=
|
||||
@@ -31,6 +31,9 @@ export default {
|
||||
? +process.env.TEMP_VIDEO_THUMBNAIL_LIMIT
|
||||
: 0,
|
||||
docker: process.env.DOCKER === "true",
|
||||
httpsKeyPath: process.env.HTTPS_KEY_PATH,
|
||||
httpsCaPath: process.env.HTTPS_CA_PATH,
|
||||
httpsCrtPath: process.env.HTTPS_CRT_PATH,
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
@@ -66,4 +69,7 @@ module.exports = {
|
||||
? +process.env.TEMP_VIDEO_THUMBNAIL_LIMIT
|
||||
: 0,
|
||||
docker: process.env.DOCKER === "true",
|
||||
httpsKeyPath: process.env.HTTPS_KEY_PATH,
|
||||
httpsCaPath: process.env.HTTPS_CA_PATH,
|
||||
httpsCrtPath: process.env.HTTPS_CRT_PATH,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import mongoose, { Document } from "mongoose";
|
||||
import validator from "validator";
|
||||
import crypto from "crypto";
|
||||
import bcrypt from "bcrypt";
|
||||
import bcrypt from "bcryptjs";
|
||||
import jwt from "jsonwebtoken";
|
||||
import env from "../enviroment/env";
|
||||
import NotAuthorizedError from "../utils/NotAuthorizedError";
|
||||
|
||||
@@ -10,25 +10,24 @@ const serverStart = async () => {
|
||||
|
||||
console.log("ENV", process.env.NODE_ENV);
|
||||
|
||||
const httpPort = process.env.HTTP_PORT || process.env.PORT || 3000;
|
||||
const httpsPort = process.env.HTTPS_PORT || 8080
|
||||
|
||||
if (process.env.NODE_ENV === "production" && process.env.SSL === "true") {
|
||||
server.listen(process.env.HTTP_PORT, process.env.URL, () => {
|
||||
console.log("Http Server Running On Port:", process.env.HTTP_PORT);
|
||||
server.listen(httpPort, process.env.URL, () => {
|
||||
console.log("Http Server Running On Port:", httpPort);
|
||||
});
|
||||
|
||||
serverHttps.listen(process.env.HTTPS_PORT, function () {
|
||||
console.log("Https Server Running On Port:", process.env.HTTPS_PORT);
|
||||
serverHttps.listen(httpsPort, function () {
|
||||
console.log("Https Server Running On Port:", httpsPort);
|
||||
});
|
||||
} else if (process.env.NODE_ENV === "production") {
|
||||
const port = process.env.HTTP_PORT || process.env.PORT;
|
||||
|
||||
server.listen(port, process.env.URL, () => {
|
||||
console.log("Http Server (No-SSL) Running On Port:", port);
|
||||
server.listen(httpPort, process.env.URL, () => {
|
||||
console.log("Http Server (No-SSL) Running On Port:", httpPort);
|
||||
});
|
||||
} else {
|
||||
const port = process.env.HTTP_PORT || process.env.PORT;
|
||||
|
||||
server.listen(port, process.env.URL, () => {
|
||||
console.log("\nDevelopment Backend Server Running On :", port);
|
||||
server.listen(httpPort, process.env.URL, () => {
|
||||
console.log("\nDevelopment Backend Server Running On :", httpPort);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -23,9 +23,12 @@ let server: any;
|
||||
let serverHttps: any;
|
||||
|
||||
if (process.env.SSL === "true") {
|
||||
const cert = fs.readFileSync("certificate.crt");
|
||||
const ca = fs.readFileSync("certificate.ca-bundle");
|
||||
const key = fs.readFileSync("certificate.key");
|
||||
const certPath = env.httpsCrtPath || "certificate.crt"
|
||||
const caPath = env.httpsCaPath || "certificate.ca-bundle"
|
||||
const keyPath = env.httpsKeyPath || "certificate.key"
|
||||
const cert = fs.readFileSync(certPath);
|
||||
const ca = fs.readFileSync(caPath);
|
||||
const key = fs.readFileSync(keyPath);
|
||||
|
||||
const options = {
|
||||
cert,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import User, { UserInterface } from "../../models/user-model";
|
||||
import bcrypt from "bcrypt";
|
||||
import bcrypt from "bcryptjs";
|
||||
import NotFoundError from "../../utils/NotFoundError";
|
||||
import InternalServerError from "../../utils/InternalServerError";
|
||||
import sendEmailVerification from "../../utils/sendVerificationEmail";
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
import env from "../enviroment/env";
|
||||
|
||||
export const getFSStoragePath = () => {
|
||||
if (env.docker) {
|
||||
return "/data/";
|
||||
} else {
|
||||
return env.fsDirectory;
|
||||
}
|
||||
return env.fsDirectory
|
||||
};
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.production
|
||||
container_name: mydrive_production
|
||||
env_file:
|
||||
- ./backend/config/.env.production
|
||||
volumes:
|
||||
- .:/usr/app-production
|
||||
- /usr/app-production/node_modules
|
||||
- ${FS_DIRECTORY}:/data
|
||||
ports:
|
||||
- "${HTTP_PORT:-3000}:3000"
|
||||
- "${HTTPS_PORT:-8080}:8080"
|
||||
environment:
|
||||
- DOCKER=true
|
||||
@@ -0,0 +1,39 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: mydrive
|
||||
image: mydrive-image
|
||||
volumes:
|
||||
- /user/example/:/data
|
||||
ports:
|
||||
- "${HTTP_PORT:-3000}:3000"
|
||||
- "${HTTPS_PORT:-8080}:8080"
|
||||
environment:
|
||||
- DOCKER=true
|
||||
- MONGODB_URL=
|
||||
- DB_TYPE=
|
||||
- FS_DIRECTORY=/data # Change this if you change the volume
|
||||
- S3_ID=
|
||||
- S3_KEY=
|
||||
- S3_BUCKET=
|
||||
- KEY=
|
||||
- HTTP_PORT=
|
||||
- HTTPS_PORT=
|
||||
- URL=
|
||||
- EMAIL_VERIFICATION=
|
||||
- EMAIL_DOMAIN=
|
||||
- EMAIL_ADDRESS=
|
||||
- EMAIL_API_KEY=
|
||||
- EMAIL_HOST=
|
||||
- REMOTE_URL=
|
||||
- PASSWORD_ACCESS=
|
||||
- PASSWORD_REFRESH=
|
||||
- PASSWORD_COOKIE=
|
||||
- VIDEO_THUMBNAILS_ENABLED=
|
||||
- TEMP_DIRECTORY=
|
||||
- TEMP_VIDEO_THUMBNAIL_LIMIT=
|
||||
- SECURE_COOKIES=
|
||||
- SSL=
|
||||
+2
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mydrive",
|
||||
"version": "4.0.0",
|
||||
"version": "4.0.1",
|
||||
"main": "index.js",
|
||||
"license": "GNU General Public License v3.0",
|
||||
"engines": {
|
||||
@@ -38,7 +38,6 @@
|
||||
"@babel/preset-react": "^7.8.3",
|
||||
"@babel/types": "^7.9.5",
|
||||
"@reduxjs/toolkit": "^2.2.5",
|
||||
"@types/bcrypt": "^3.0.0",
|
||||
"@types/compression": "^1.7.0",
|
||||
"@types/concat-stream": "^1.6.0",
|
||||
"@types/connect-busboy": "0.0.2",
|
||||
@@ -61,7 +60,7 @@
|
||||
"aws-sdk": "^2.657.0",
|
||||
"axios": "^1.7.2",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"bcrypt": "^5.1.1",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"body-parser": "^1.20.2",
|
||||
"bytes": "^3.1.0",
|
||||
"classnames": "^2.5.1",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 
|
||||
# 
|
||||
|
||||
# ☁️ MyDrive
|
||||
|
||||
@@ -12,8 +12,8 @@ MyDrive is an Open Source cloud file storage server (Similar To Google Drive). H
|
||||
|
||||
- [Features](#features)
|
||||
- [Tech stack](#tech-stack)
|
||||
- [Installation (non docker)](#installation)
|
||||
- [Docker installation](#docker)
|
||||
- [Docker image](#docker)
|
||||
- [Manual installation](#installation)
|
||||
- [Common installation issues](#common-installation-issues)
|
||||
- [Screenshots](#screenshots)
|
||||
- [Video](#video)
|
||||
@@ -56,7 +56,55 @@ MyDrive is an Open Source cloud file storage server (Similar To Google Drive). H
|
||||
|
||||
<span id="installation"></span>
|
||||
|
||||
## 💻 Installation
|
||||
## 🐳 Docker image
|
||||
|
||||
Required:
|
||||
|
||||
- Docker
|
||||
- MongoDB (Unless using a service like Atlas)
|
||||
<br/>
|
||||
|
||||
Run the following command to download the latest docker image:
|
||||
|
||||
```javascript
|
||||
docker pull kylehoell/mydrive:latest
|
||||
```
|
||||
|
||||
You must provide enviroment variables for the docker image to work. You can supply these during the docker run command instead of creating the env file. <br />
|
||||
|
||||
> [backend/config](backend/config) -> Backend Enviroment Variables
|
||||
|
||||
You must also provide a volume for the image if you are using a filesystem database or if you want to use the generate video thumbnails feature. Volumes should be mounted to /data/ and /temp/ For example:
|
||||
|
||||
```javascript
|
||||
-v /path/example/mydrive/data/:/data/ -v /path/example/mydrive/temp/:/temp/
|
||||
```
|
||||
|
||||
/data/: This is where the encrypted files will be stored.
|
||||
/temp/: Where files will temporary be stored to generate video thumbnails as a fallback.
|
||||
|
||||
The docker image will by default run on port 3000.
|
||||
|
||||
Here is an example of the full docker command:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 3000:3000 \
|
||||
-e MONGODB_URL=mongodb://127.0.0.1:27017/mydrive \
|
||||
-e DB_TYPE=fs \
|
||||
-e PASSWORD_ACCESS=secretaccesspassword \
|
||||
-e PASSWORD_REFRESH=secretrefreshpassword \
|
||||
-e PASSWORD_COOKIE=secretcookiepassword \
|
||||
-e KEY=encryptionkey \
|
||||
-e VIDEO_THUMBNAILS_ENABLED=true \
|
||||
-e TEMP_VIDEO_THUMBNAIL_LIMIT=5000000000 \
|
||||
-v /path/example/mydrive/data/:/data/ \
|
||||
-v /path/example/mydrive/temp/:/temp/ \
|
||||
--name mydrive \
|
||||
kylehoell/mydrive:latest
|
||||
```
|
||||
|
||||
## 💻 Manual Installation
|
||||
|
||||
Required:
|
||||
|
||||
@@ -136,72 +184,45 @@ You can read more about this issue [here](https://stackoverflow.com/questions/38
|
||||
|
||||
<span id="docker"></span>
|
||||
|
||||
## 🐳 Docker
|
||||
|
||||
Setup:
|
||||
|
||||
> Create Environment Variables:
|
||||
|
||||
> You can find enviroment variable examples under: <br />
|
||||
> [backend/config](backend/config) -> Backend Enviroment Variables
|
||||
> [src/config](src/config) -> Frontend Enviroment Variables
|
||||
|
||||
> Simply remove the .example from the end of the filename, and fill in the values.
|
||||
> Note: In most cases you will only have to change FE enviroment variables for development purposes.
|
||||
|
||||
<br />
|
||||
|
||||
> Start the Docker image
|
||||
|
||||
```javascript
|
||||
npm run docker:production
|
||||
```
|
||||
|
||||
NOTE: I made an oversight in the docker command, since it requires npm to be installed in order to run the above command, I am working on a fix for this, but here is the command itself that npm runs for now.
|
||||
|
||||
```javascript
|
||||
docker-compose -p mydrive-production -f docker-compose-production.yml --env-file ./backend/config/.env.production up
|
||||
```
|
||||
|
||||
<span id="screenshots"></span>
|
||||
|
||||
## 📸 Screenshots
|
||||
|
||||
Modern and colorful design
|
||||

|
||||

|
||||
|
||||
Upload Files
|
||||

|
||||

|
||||
|
||||
Download Files
|
||||

|
||||

|
||||
|
||||
Image Viewer
|
||||

|
||||

|
||||
|
||||
Video Viewer
|
||||

|
||||

|
||||
|
||||
Media Gallery
|
||||

|
||||

|
||||
|
||||
Share Files
|
||||

|
||||

|
||||
|
||||
Search For Files/Folders
|
||||

|
||||

|
||||
|
||||
Move File/Folders
|
||||

|
||||

|
||||
|
||||
Multi-select
|
||||

|
||||

|
||||
|
||||
Custom context menu
|
||||

|
||||

|
||||
|
||||
Trash
|
||||

|
||||

|
||||
|
||||
<span id="video"></span>
|
||||
|
||||
@@ -210,7 +231,7 @@ Trash
|
||||
I created a short YouTube video, showing off myDrives design and features:
|
||||
|
||||
[](https://www.youtube.com/watch?v=IqmTvAFBszg "myDrive 4 (open source Google Drive alternative) - UI and feature overview
|
||||
](https://github.com/subnub/myDrive/blob/master/github_images/youtube-video.jpeg?raw=true)](https://www.youtube.com/watch?v=IqmTvAFBszg "myDrive 4 (open source Google Drive alternative) - UI and feature overview
|
||||
")
|
||||
|
||||
<span id="live-demo"></span>
|
||||
|
||||
Reference in New Issue
Block a user