diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..c9fa5292 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +##### +#### +### Plik - Docker file +## +# + +# Let's start with a fresh debian jessie +FROM debian:jessie + +# Some generic informations +MAINTAINER Charles-Antoine Mathieu +MAINTAINER Mathieu Bodjikian + +# Create user +RUN useradd -U -d /home/plik -m -s /bin/false plik + +# Expose the plik port +EXPOSE 8080 + +# Copy plik +ADD server /home/plik/server/ +ADD clients /home/plik/clients/ +RUN chown -R plik:plik /home/plik +RUN chmod +x /home/plik/server/plikd + +# Launch it +USER plik +WORKDIR /home/plik/server +CMD ./plikd + diff --git a/Makefile b/Makefile index ab11accf..6a8077c2 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,10 @@ RELEASE_VERSION=`cat VERSION` RELEASE_DIR="release/plik-$(RELEASE_VERSION)" -all: clean deps server client +GOHOSTOS=`go env GOHOSTOS` +GOHOSTARCH=`go env GOHOSTARCH` + +all: clean deps frontend server client ### # Install npm build dependencies @@ -36,13 +39,19 @@ all: clean deps server client deps: @cd server/public && npm install + +### +# Build frontend ressources +### +frontend: + @if [ ! -d server/public/bower_components ]; then cd server/public && bower install --allow-root ; fi ; + @if [ ! -d server/public/public ]; then cd server/public && grunt ; fi ; + + ### # Build plik server for the current architecture ### server: - @cd server/public && bower install --allow-root - @cd server/public && grunt - @cd server && go get -v @sed -i -e "s/##VERSION##/$(RELEASE_VERSION)/g" server/common/config.go @cd server && go build -o plikd ./ @sed -i -e "s/$(RELEASE_VERSION)/##VERSION##/g" server/common/config.go @@ -53,24 +62,28 @@ server: servers: @cd server/public && bower install --allow-root @cd server/public && grunt - @cd server && go get -v @server/build.sh servers ### # Build plik client for the current architecture ### client: - @cd client && go get -v @cd client && go build -o plik ./ ### # Build plik client for all architectures ### clients: - @cd client && go get -v @client/build.sh clients @mkdir -p clients/bash && cp client/plik.sh clients/bash +## +# Build docker +## +docker: release + @cp Dockerfile $(RELEASE_DIR) + @cd $(RELEASE_DIR) && docker build -t plik . + ### # Make server and clients Debian packages ### @@ -91,7 +104,7 @@ debs-client: clients ### # Build release archive ### -release: clean server clients +release: clean frontend server clients @mkdir -p $(RELEASE_DIR)/server/public @cp -R clients $(RELEASE_DIR) @@ -106,6 +119,8 @@ release: clean server clients @cp -R server/public/public $(RELEASE_DIR)/server/public @cp -R server/public/index.html $(RELEASE_DIR)/server/public + @cd release && tar czvf plik-`cat ../VERSION`-$(GOHOSTOS)-$(GOHOSTARCH).tar.gz * + ### # Build release archives for all architectures @@ -114,23 +129,23 @@ releases: release servers @mkdir -p releases - @cp -R servers/linux-amd64/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-linux-64bits.tar.gz * - @cp -R servers/linux-386/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-linux-32bits.tar.gz * - @cp -R servers/linux-arm/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-linux-arm.tar.gz * + @cp -R servers/linux-amd64/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-linux-64bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/linux-386/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-linux-32bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/linux-arm/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-linux-arm.tar.gz plik-`cat ../VERSION` - @cp -R servers/freebsd-amd64/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-freebsd-64bits.tar.gz * - @cp -R servers/freebsd-386/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-freebsd-32bits.tar.gz * - @cp -R servers/freebsd-arm/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-freebsd-arm.tar.gz * + @cp -R servers/freebsd-amd64/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-freebsd-64bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/freebsd-386/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-freebsd-32bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/freebsd-arm/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-freebsd-arm.tar.gz plik-`cat ../VERSION` - @cp -R servers/openbsd-amd64/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-openbsd-64bits.tar.gz * - @cp -R servers/openbsd-386/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-openbsd-32bits.tar.gz * + @cp -R servers/openbsd-amd64/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-openbsd-64bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/openbsd-386/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-openbsd-32bits.tar.gz plik-`cat ../VERSION` @rm $(RELEASE_DIR)/server/plikd - @cp -R servers/windows-amd64/plikd.exe $(RELEASE_DIR)/server && cd release && zip -r ../releases/plik-`cat ../VERSION`-windows-64bits.zip . - @cp -R servers/windows-386/plikd.exe $(RELEASE_DIR)/server && cd release && zip -r ../releases/plik-`cat ../VERSION`-windows-32bits.zip . + @cp -R servers/windows-amd64/plikd.exe $(RELEASE_DIR)/server && cd release && zip -r ../releases/plik-`cat ../VERSION`-windows-64bits.zip plik-`cat ../VERSION` + @cp -R servers/windows-386/plikd.exe $(RELEASE_DIR)/server && cd release && zip -r ../releases/plik-`cat ../VERSION`-windows-32bits.zip plik-`cat ../VERSION` - @cp -R servers/darwin-amd64/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-macos-64bits.tar.gz * - @cp -R servers/darwin-386/plikd $(RELEASE_DIR)/server && cd release && tar cvf ../releases/plik-`cat ../VERSION`-macos-32bits.tar.gz * + @cp -R servers/darwin-amd64/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-macos-64bits.tar.gz plik-`cat ../VERSION` + @cp -R servers/darwin-386/plikd $(RELEASE_DIR)/server && cd release && tar czvf ../releases/plik-`cat ../VERSION`-macos-32bits.tar.gz plik-`cat ../VERSION` @md5sum releases/* > releases/md5sum.txt @@ -140,6 +155,7 @@ releases: release servers ### clean: @rm -rf server/public/bower_components + @rm -rf server/public/public @rm -rf server/plikd @rm -rf client/plik @rm -rf clients diff --git a/README.md b/README.md index 3e55319f..e7028562 100644 --- a/README.md +++ b/README.md @@ -64,10 +64,12 @@ $ sudo -c "npm install -g bower grunt-cli" $ sudo -c "client/build.sh env" ``` -To build everything : +To build everything and run it : ```sh -$ make server -$ make clients +$ make deps +$ make release +$ cd server +$ ./plikd ``` To make debian packages : @@ -80,6 +82,34 @@ To make release archives : $ make releases ``` + +### Docker +Plik comes with a simple Dockerfile that allows you to run it in a container. + +First, you need to build the docker image : +```sh +$ make docker +``` + +Then you can run an instance and map the local port 80 to the plik port : +```sh +$ docker run -t -d -p 80:8080 plik +ab9b2c99da1f3e309cd3b12392b9084b5cafcca0325d7d47ff76f5b1e475d1b9 +``` + +You can also use a volume to store uploads on a local folder. +Here, we map local folder /data to the /home/plik/server/files folder of the container (this is the default uploads directory) : +```sh +$ docker run -t -d -p 80:8080 -v /data:/home/plik/server/files plik +ab9b2c99da1f3e309cd3b12392b9084b5cafcca0325d7d47ff76f5b1e475d1b9 +``` + +To use a different config file, you can also map a single file to the container at runtime : +```sh +$ docker run -t -d -p 80:8080 -v plikd.cfg:/home/plik/server/plikd.cfg plik +ab9b2c99da1f3e309cd3b12392b9084b5cafcca0325d7d47ff76f5b1e475d1b9 +``` + ### API Plik server expose a REST-full API to manage uploads and get files : diff --git a/VERSION b/VERSION index d3827e75..7dea76ed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0 +1.0.1 diff --git a/client/crypto/pgp/pgp.go b/client/crypto/pgp/pgp.go index 303c2b21..14b796da 100644 --- a/client/crypto/pgp/pgp.go +++ b/client/crypto/pgp/pgp.go @@ -123,8 +123,15 @@ func (pb *Backend) Configure(arguments map[string]interface{}) (err error) { // Encrypt implementation for PGP Crypto Backend func (pb *Backend) Encrypt(reader io.Reader, writer io.Writer) (err error) { - w, _ := armor.Encode(writer, "PGP MESSAGE", nil) - plaintext, _ := openpgp.Encrypt(w, []*openpgp.Entity{pb.Config.Entity}, nil, &openpgp.FileHints{IsBinary: true}, nil) + w, err := armor.Encode(writer, "PGP MESSAGE", nil) + if err != nil { + return (err) + } + + plaintext, err := openpgp.Encrypt(w, []*openpgp.Entity{pb.Config.Entity}, nil, &openpgp.FileHints{IsBinary: true}, nil) + if err != nil { + return (err) + } _, err = io.Copy(plaintext, reader) if err != nil { diff --git a/client/plik.go b/client/plik.go index e4f1dfec..e8c7877f 100644 --- a/client/plik.go +++ b/client/plik.go @@ -145,8 +145,11 @@ Options: } config.Debug("Got upload info : " + config.Sdump(uploadInfo)) + // Mon, 02 Jan 2006 15:04:05 MST + creationDate := time.Unix(uploadInfo.Creation, 0).Format(time.RFC1123) + // Display upload url - printf("Upload successfully created : \n") + printf("Upload successfully created at %s : \n", creationDate) printf(" %s/#/?id=%s\n\n", config.Config.URL, uploadInfo.ID) // Match file id from server using client reference @@ -432,8 +435,16 @@ func getFileURL(upload *common.Upload, file *common.File) (fileURL string) { if upload.Stream { mode = "stream" } + fileURL += fmt.Sprintf("%s/%s/%s/%s/%s", config.Config.URL, mode, upload.ID, file.ID, file.Name) - return + + // Parse to get a nice escaped url + u, err := url.Parse(fileURL) + if err != nil { + return "" + } + + return u.String() } func updateClient(forceUpdate bool) (err error) { diff --git a/server/common/config.go b/server/common/config.go index f56aea9a..fc9c11ae 100644 --- a/server/common/config.go +++ b/server/common/config.go @@ -47,7 +47,7 @@ type Configuration struct { LogLevel string ListenAddress string ListenPort int - MaxFileSize int + MaxFileSize int64 DefaultTTL int MaxTTL int @@ -92,7 +92,7 @@ func NewConfiguration() (this *Configuration) { this.ListenPort = 8080 this.DataBackend = "file" this.MetadataBackend = "file" - this.MaxFileSize = 1048576 // 1MB + this.MaxFileSize = 10737418240 // 10GB this.DefaultTTL = 2592000 // 30 days this.MaxTTL = 0 this.SslEnabled = false @@ -108,7 +108,7 @@ func NewConfiguration() (this *Configuration) { func LoadConfiguration(file string) { Config = NewConfiguration() if _, err := toml.DecodeFile(file, Config); err != nil { - Log().Warningf("Unable to load config file %s : %s", file, err) + Log().Fatalf("Unable to load config file %s : %s", file, err) } Log().SetMinLevelFromString(Config.LogLevel) Log().Dump(logger.DEBUG, Config) diff --git a/server/plik.go b/server/plik.go index ef7777cb..c1a2f710 100644 --- a/server/plik.go +++ b/server/plik.go @@ -677,7 +677,7 @@ func addFileHandler(resp http.ResponseWriter, req *http.Request) { md5Hash.Write(buf[:bytesRead]) // Check upload max size limit - if totalBytes > common.Config.MaxFileSize { + if int64(totalBytes) > common.Config.MaxFileSize { err = ctx.EWarningf("File too big (limit is set to %d bytes)", common.Config.MaxFileSize) preprocessWriter.CloseWithError(err) return diff --git a/server/plikd.cfg b/server/plikd.cfg index 039506d1..13bf2663 100644 --- a/server/plikd.cfg +++ b/server/plikd.cfg @@ -10,7 +10,7 @@ LogLevel = "INFO" # Other levels : DEBUG, WARNING, CRITICAL, FATAL ListenPort = 8080 ListenAddress = "0.0.0.0" -MaxFileSize = 1073741824 # 1GB +MaxFileSize = 10737418240 # 10GB DefaultTTL = 2592000 # 30 days MaxTTL = 2592000 # 0 => No limit