-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: 117503445 <[email protected]>
- Loading branch information
Showing
6 changed files
with
130 additions
and
126 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,181 +1,132 @@ | ||
# GoWebdav | ||
# GoWebDAV | ||
|
||
> Share local files with WebDAV, lightweight and very easy to use. | ||
> Share local files using WebDAV, lightweight and easy to use | ||
English | [中文](./README_zh_CN.md) | ||
English | [简体中文](./README_zh_CN.md) | ||
|
||
## feature | ||
## Features | ||
|
||
- Based on Golang implementation, high performance | ||
- Implemented in Golang for high performance. | ||
|
||
- Finally compiled into a single binary file, no need for Apache and other environments, more stable | ||
- Finally compiled into a single binary file, no need for Apache or similar environments, with few dependencies. | ||
|
||
- Support browser access | ||
- Supports browser access. | ||
|
||
- Multiple WebDAV services can be enabled under the same port, each with a different mount directory, user name, and password | ||
- Multiple WebDAV services can be enabled on the same port, each with different mount directories, usernames, and passwords. | ||
|
||
- Docker is well supported | ||
- Good Docker support. | ||
|
||
## quickstart | ||
## Quick Start | ||
|
||
### bin | ||
Download the binary file from <https://github.com/117503445/GoWebDAV/releases> | ||
|
||
Go to <https://github.com/117503445/GoWebDAV/releases> to download the latest binaries. | ||
Run | ||
|
||
Then run `. /gowebdav` | ||
```sh | ||
./gowebdav | ||
``` | ||
|
||
GoWebDAV will automatically create the example file under the `./data` path with the following file structure | ||
GoWebDAV will automatically create sample files under the `./data` path, with the following file structure | ||
|
||
```sh | ||
> tree ./data | ||
./data | ||
├── public-writable | ||
│ └── 1.txt | ||
│ └── 1.txt | ||
├── public-readonly | ||
│ └── 2.txt | ||
│ └── 1.txt | ||
└── private-writable | ||
└── 3.txt | ||
└── 1.txt | ||
``` | ||
|
||
Visit <http://localhost:80> with your browser and you will see 3 different GoWebDAV services. | ||
Access <http://localhost:80> in your browser to see the 3 different GoWebDAV services. | ||
|
||
![index](./doc/index.png) | ||
|
||
where <http://localhost:80/public-writable> is the `public-writable` service that maps the local `./data/public-writable` folder. It is Anonymizable and writable. You can view the contents of the file in the browser, as well as perform operations such as uploading and deleting. | ||
Among them, <http://localhost:80/public-writable> is the `public-writable` service, mapping to the local `./data/public-writable` folder. It is unauthenticated and writable. You can view file contents in the browser and perform operations like upload and delete. | ||
|
||
![public-writable](./doc/public-writable.png) | ||
|
||
<http://localhost:80/public-readonly> is the `public-readonly` service that maps the local `./data/public-readonly` folder. It is Anonymizable and read-only. You can view the contents of the file in your browser, but you cannot upload, delete, etc. | ||
<http://localhost:80/public-readonly> is the `public-readonly` service, mapping to the local `./data/public-readonly` folder. It is unauthenticated and read-only. You can view file contents in the browser but cannot upload, delete, etc. | ||
|
||
![public-readonly](./doc/public-readonly.png) | ||
|
||
<http://localhost:80/private-writable> is the `private-writable` service that maps the local `./data/private-writable` folder. It is user-authenticated and writable. After logging in with `user1` and `pass1`, you can view the contents of the files in the browser, as well as upload, delete, etc. | ||
<http://localhost:80/private-writable> is the `private-writable` service, mapping to the local `./data/private-writable` folder. It requires user authentication and is writable. After logging in with `user1` and `pass1`, you can view file contents in the browser and perform operations like upload and delete. | ||
|
||
![private-writable](./doc/private-writable.png) | ||
|
||
The `dav` parameter can also be specified to configure the local path, user authentication, read-only, etc. properties of the WebDAV service, as described in the *Configuration Strings Description* section. When `dav` is not specified, the default `dav` parameter used by GoWebDAV is `/public-writable,./data/public-writable,null,null,false;/public-readonly,./data/public-readonly,null,null,true;/private-writable,./data/private-writable,user1,pass1,false`. | ||
|
||
### Docker | ||
Besides using a browser, you can also access it using other WebDAV client tools. | ||
|
||
The local file paths to be shared are `/root/dir1` and `/root/dir2`. | ||
You can configure the local path, user authentication, read-only status, and other properties of the WebDAV service by specifying the `dav` parameter. For details, see the *Usage* section. | ||
|
||
```sh | ||
docker run -it --name go_webdav -d -v /root/dir1:/root/dir1 -v /root/dir2:/root/dir2 -e dav="/dav1,/root/dir1,user1,pass1,true;/dav2,/root/dir2,null,null,false" -p 80:80 --restart=unless-stopped 117503445/go_webdav | ||
``` | ||
## Usage | ||
|
||
```sh | ||
-e dav="/dav1,/root/dir1,user1,pass1,true;/dav2,/root/dir2,null,null,false" | ||
``` | ||
|
||
Indicates passing a configuration string into the Docker image. | ||
|
||
Then open <http://localhost/dav1> and <http://localhost/dav2> in the browser or webdav client like [raidrive](https://www.raidrive.com/). | ||
|
||
## Configuration String | ||
|
||
You can pass the `--dav` parameter to change the configuration. | ||
./gowebdav --help # View help | ||
|
||
On Windows, the same call as quickstart is made as follows | ||
./gowebdav --addr 127.0.0.1 # Listen on 127.0.0.1, default is 0.0.0.0 | ||
./gowebdav --port 8080 # Listen on port 8080, default is port 80 | ||
|
||
./gowebdav --dav "/dir1,/data/dir1,user1,pass1,true" # Configure folder path and properties | ||
``` | ||
// cmd | ||
gowebdav_windows_amd64.exe --dav "/public-writable,./data/public-writable,null,null,false;/public-readonly,./data/public-readonly,null,null,true;/private-writable,./data/private-writable,user1,pass1,false" | ||
// PowerShell | ||
.\gowebdav_windows_amd64.exe --dav "/public-writable,./data/public-writable,null,null,false;/public-readonly,./data/public-readonly,null,null,true;/private-writable,./data/private-writable,user1,pass1,false" | ||
``` | ||
|
||
On Windows, the same call as quickstart is made as follows | ||
|
||
```sh | ||
./gowebdav_linux_amd64 --dav "/public-writable,./data/public-writable,null,null,false;/public-readonly,./data/public-readonly,null,null,true;/private-writable,./data/private-writable,user1,pass1,false" | ||
``` | ||
|
||
The following is a specific explanation of `dav` | ||
|
||
Use a semicolon to separate each WebDAV service configuration, which means that `"/dav1,/root/dir1,user1,pass1,true;/dav2,/root/dir2,null,null,false"` describes 2 services, which are | ||
|
||
> /dav1,/root/dir1,user1,pass1,false | ||
|
||
and | ||
The `dav` parameter can specify the local path, user authentication, read-only status, and other properties of the WebDAV service. | ||
|
||
> /dav2,/root/dir2,null,null,true | ||
Each local path can be configured for a WebDAV service, separated by semicolons. For example: | ||
|
||
The first service will mount the `/root/dir1` directory of the Docker image under `/dav1`. The required username and password for access are `user1` and `pass1` respectively. | ||
- `"/dir1,/data/dir1,user1,pass1,true;/dir2,/data/dir2,null,null,false"` describes 2 services, mapping the folder `/data/dir1` to the WebDAV service `/dir1` and the folder `/data/dir2` to the WebDAV service `/dir2`. | ||
|
||
Then, according to the previous `-v /root/dir1:/root/dir1`, the mapping relationship with `/root/dir1` of the physical machine can be completed and accessed. | ||
For each service, you need to separate 5 parameters with commas: `service path, local path, username, password, read-only status`. When both the username and password are `null`, no authentication is required. For example: | ||
|
||
The fifth parameter `false` indicates that this is a non-read-only service that supports addition, deletion, modification and query. | ||
- `"/dir1,/data/dir1,user1,pass1,true"` describes mapping `/data/dir1` to the `/dir1` service, where access requires the username and password `user1` and `pass1`, respectively, and is read-only (prohibits upload, update, delete). | ||
- `"/dir2,/data/dir2,null,null,false"` describes mapping `/data/dir2` to the `/dir2` service, where no authentication is required and it is read-write. | ||
- `"/dir3,/data/dir3,null,null,true"` describes mapping `/data/dir3` to the `/dir3` service, where no authentication is required and it is read-only. | ||
|
||
The second service will mount the `/root/dir2` directory of the Docker image under `/dav2`. The user name and password required for access are `null` and `null` respectively. At this time, it means that the service can be accessed without a password. . | ||
In particular, if there is only one service named `/`, you can access <http://localhost:80> directly without specifying a service name. For example: | ||
|
||
Then according to the previous `-v /root/dir2:/root/dir2`, you can complete the mapping relationship with `/root/dir2` of the physical machine and access it. | ||
- `"/,/data/dir1,user1,pass1,true"` describes mapping `/data/dir1` to the `/` service, where access requires the username and password `user1` and `pass1`, respectively, and is read-only. | ||
|
||
The fifth parameter `true` indicates that this is a read-only service, only supports GET, does not support additions, deletions and modifications. | ||
When `dav` is not specified, the default `dav` parameter used by GoWebDAV is `/public-writable,./data/public-writable,null,null,false;/public-readonly,./data/public-readonly,null,null,true;/private-writable,./data/private-writable,user1,pass1,false`. | ||
|
||
This method is recommended for file sharing without confidentiality requirements. | ||
## Docker | ||
|
||
You can pass in the `--port` parameter to change the port to listen on. The default listens on port 80. | ||
|
||
You can pass in the `--addr` parameter to change the address to listen on. The default listens on `0.0.0.0`. | ||
Prepare the local folder paths to be shared as `/data/dir1` and `/data/dir2`. | ||
|
||
```sh | ||
# Listening on port 8080 | ||
./gowebdav_linux_amd64 --port 8080 | ||
docker run -it -d -v /data:/data -e dav="/dir1,/data/dir1,user1,pass1,true;/dir2,/data/dir2,null,null,false" -p 80:80 --restart=unless-stopped 117503445/go_webdav | ||
``` | ||
|
||
## Docker Compose | ||
Open <http://localhost/dir1> and <http://localhost/dir2> in your browser to access disk files in WebDAV format. | ||
|
||
Expose `/root/dir1`, which requires authentication, and `/root/dir2`, which does not require authentication. | ||
Pass the `data` parameter through the environment variable `dav` and specify the mapped port with `-p 80:80`. | ||
|
||
## Docker Compose | ||
|
||
```yaml | ||
version: "3.9" | ||
version: "3.8" | ||
services: | ||
go_webdav: | ||
image: 117503445/go_webdav | ||
container_name: go_webdav | ||
restart: unless-stopped | ||
volumes: | ||
- "/root/dir1:/root/dir1" | ||
- "/root/dir2:/root/dir2" | ||
- /data:/data | ||
environment: | ||
- "dav=/dav1,/root/dir1,user1,pass1,true;/dav2,/root/dir2,null,null,false" | ||
- "dav=/dir1,/data/dir1,user1,pass1,true;/dir2,/data/dir2,null,null,false" | ||
ports: | ||
- "80:80" | ||
restart: unless-stopped | ||
image: 117503445/go_webdav | ||
- "80:80" | ||
``` | ||
## Background introduction | ||
`GoWebdav` is used to build a WebDAV-based file sharing server. | ||
|
||
### Reasons to use WebDAV | ||
|
||
1. Samba is inconvenient to use on Windows clients, and it is difficult to use non-default ports. | ||
|
||
2. FTP mount trouble. | ||
|
||
3. NextCloud is too heavy and difficult to share files on the server. | ||
|
||
Because I didn't see a server-side implementation that could meet the above features, this project recreated a WebDAV Server. | ||
|
||
## Local debugging | ||
|
||
Rename `config.yml.example` to `config.yml`, configure in `config.yml` file | ||
|
||
`go run .` | ||
|
||
## Local Docker build | ||
## Security | ||
Using a layered build, the executable app is built through `go build` in the build layer, and then run in the prod layer. If you need to modify the structure of the configuration file later, you will also need to modify the Dockerfile. | ||
GoWebDAV uses HTTP Basic Auth for authentication, with account passwords transmitted in plaintext, lacking security. If dealing with important files or passwords, be sure to use a layer of HTTPS with Nginx or Traefik proxy servers. | ||
````sh | ||
docker build -t 117503445/go_webdav . | ||
docker run --name go_webdav -d -v ${PWD}/TestDir1:/root/TestDir1 -v ${PWD}/TestDir2:/root/TestDir2 -e dav="/dav1,/root/TestDir1,user1,pass1,false;/dav2,/root/TestDir2,user2,pass2,true" -p 80:80 --restart=unless-stopped 117503445/go_webdav | ||
```` | ||
GoWebDAV currently does not have plans to directly support HTTPS, as I believe that tasks like domain names and certificate renewal should be handled at the higher-level proxy server. | ||
## Safety | ||
## Development | ||
HTTP Basic Auth is used for authentication, and the account password is sent in clear text, which has no security at all. If important files or passwords are involved, be sure to use a gateway such as Nginx or Traefik to provide HTTPS. | ||
Refer to [dev.md](./doc/dev.md) | ||
## Acknowledgments | ||
## Acknowledgements | ||
<https://github.com/dom111/webdav-js> provides front-end support | ||
<https://github.com/dom111/webdav-js> provides frontend support |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,21 @@ | ||
# | ||
# Development | ||
|
||
## Setting Up Development Environment | ||
|
||
```sh | ||
docker compose up -d | ||
``` | ||
|
||
Then attach to the `gowebdav-dev` container using VSCode and start development in the `/workspace` directory. | ||
|
||
## Common Development Operations | ||
|
||
```sh | ||
go run . # Run | ||
go run . --port 8080 # Run and specify port | ||
|
||
go build . # Build binary | ||
go test ./... # Test | ||
|
||
docker build -t 117503445/go_webdav . # Build Docker image | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters