feat: removing framework, pure go implementation
This commit is contained in:
parent
63c52f19e2
commit
f643438420
5 changed files with 24 additions and 90 deletions
27
README.md
27
README.md
|
@ -1,17 +1,20 @@
|
|||
# goStatic
|
||||
A really small static web server for Docker
|
||||
|
||||
[](https://imagelayers.io/?images=pierrezemb/gostatic:latest 'Get your own badge on imagelayers.io')
|
||||
[](https://godoc.org/github.com/PierreZ/goStatic)
|
||||
|
||||
### The goal
|
||||
My goal is to create to smallest docker container for my web static files. The advantage of Go is that you can generate a fully static binary, so that you don't need anything else.
|
||||
|
||||
### Wait, I've been using old versions of GoStatic and things have changed!
|
||||
|
||||
Yeah, decided to drop support of unsecured HTTPS. Two-years ago, when I started GoStatic, there was no automatic HTTPS available. Nowadays, thanks to Let's Encrypt, it's really easy to do so. If you need HTTPS, I recommend [caddy](https://caddyserver.com).
|
||||
|
||||
### Features
|
||||
* A fully static web server in 5MB
|
||||
* A fully static web server in 6MB
|
||||
* No frameworkw
|
||||
* Web server build for Docker
|
||||
* HTTPS by default
|
||||
* Can generate certificate on his onw
|
||||
* Can generate certificate on his own
|
||||
* Light container
|
||||
* More security than official images (see below)
|
||||
* Log enabled
|
||||
|
@ -31,20 +34,22 @@ Many links should provide you with additionnal info to see my point of view:
|
|||
|
||||
### How to use
|
||||
```
|
||||
// HTTPS server
|
||||
docker run -d -p 443:8043 -v path/to/website:/srv/http --name goStatic pierrezemb/gostatic
|
||||
// HTTP server
|
||||
docker run -d -p 80:8043 -v path/to/website:/srv/http --name goStatic pierrezemb/gostatic --forceHTTP
|
||||
docker run -d -p 80:8043 -v path/to/website:/srv/http --name goStatic pierrezemb/gostatic
|
||||
```
|
||||
|
||||
### Wow, such container! What are you using?
|
||||
|
||||
I'm using [echo](http://echo.labstack.com/) as a micro web framework because he has great performance, and [golang-builder](https://github.com/CenturyLinkLabs/golang-builder) to generate the static binary (command line in the makefile)
|
||||
|
||||
I'm also using the centurylink/ca-certs image instead of the scratch image to avoid this error:
|
||||
I'm using the centurylink/ca-certs image instead of the scratch image to avoid this error:
|
||||
|
||||
```
|
||||
x509: failed to load system roots and no roots provided
|
||||
```
|
||||
|
||||
The centurylink/ca-certs image is simply the scratch image with the most common root CA certificates pre-installed. The resulting image is only 258 kB which is still a good starting point for creating your own minimal images.
|
||||
|
||||
### How to build
|
||||
|
||||
```bash
|
||||
GOARCH=amd64 GOOS=linux go build -ldflags "-linkmode external -extldflags -static -w"
|
||||
```
|
||||
|
||||
|
|
37
glide.lock
generated
37
glide.lock
generated
|
@ -1,37 +0,0 @@
|
|||
hash: ff8a32679991a0939800d56b0b34ade1a46ed2f6d9a6f21a95e07196b5e16fbe
|
||||
updated: 2017-05-27T20:48:09.06190059+02:00
|
||||
imports:
|
||||
- name: github.com/dgrijalva/jwt-go
|
||||
version: 6c8dedd55f8a2e41f605de6d5d66e51ed1f299fc
|
||||
- name: github.com/labstack/echo
|
||||
version: 1049c9613cd371b7ea8f219404c9a821734781ed
|
||||
subpackages:
|
||||
- '...'
|
||||
- middleware
|
||||
- name: github.com/labstack/gommon
|
||||
version: 1121fd3e243c202482226a7afe4dcd07ffc4139a
|
||||
subpackages:
|
||||
- bytes
|
||||
- color
|
||||
- log
|
||||
- random
|
||||
- name: github.com/mattn/go-colorable
|
||||
version: ded68f7a9561c023e790de24279db7ebf473ea80
|
||||
- name: github.com/mattn/go-isatty
|
||||
version: fc9e8d8ef48496124e79ae0df75490096eccf6fe
|
||||
- name: github.com/PierreZ/tlscert
|
||||
version: 132262881d39c577835ab78f179abd2de116cb32
|
||||
- name: github.com/valyala/bytebufferpool
|
||||
version: e746df99fe4a3986f4d4f79e13c1e0117ce9c2f7
|
||||
- name: github.com/valyala/fasttemplate
|
||||
version: dcecefd839c4193db0d35b88ec65b4c12d360ab0
|
||||
- name: golang.org/x/crypto
|
||||
version: 7e9105388ebff089b3f99f0ef676ea55a6da3a7e
|
||||
subpackages:
|
||||
- acme
|
||||
- acme/autocert
|
||||
- name: golang.org/x/sys
|
||||
version: a55a76086885b80f79961eacb876ebd8caf3868d
|
||||
subpackages:
|
||||
- unix
|
||||
testImports: []
|
|
@ -1,8 +0,0 @@
|
|||
package: github.com/PierreZ/goStatic
|
||||
import:
|
||||
- package: github.com/labstack/echo
|
||||
version: ^3.1.0
|
||||
subpackages:
|
||||
- '...'
|
||||
- middleware
|
||||
- package: github.com/PierreZ/tlscert
|
BIN
goStatic
BIN
goStatic
Binary file not shown.
40
main.go
40
main.go
|
@ -1,56 +1,30 @@
|
|||
// This small program is just a small web server created in static mode
|
||||
// in order to provide the smallest docker image possible
|
||||
|
||||
package main // import "github.com/PierreZ/goStatic"
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/PierreZ/tlscert"
|
||||
"github.com/labstack/echo"
|
||||
"github.com/labstack/echo/middleware"
|
||||
)
|
||||
|
||||
var (
|
||||
// Def of flags
|
||||
portPtr = flag.Int("p", 8043, "The listening port")
|
||||
pathPtr = flag.String("static", "/srv/http", "The path for the static files")
|
||||
crtPtr = flag.String("crt", "/etc/ssl/server", "Folder for server.pem and key.pem")
|
||||
isUnsecure = flag.Bool("forceHTTP", false, "Forcing HTTP and not HTTPS")
|
||||
path = flag.String("static", "/srv/http", "The path for the static files")
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
flag.Parse()
|
||||
|
||||
e := echo.New()
|
||||
|
||||
// Root level middleware
|
||||
e.Use(middleware.Logger())
|
||||
e.Use(middleware.Recover())
|
||||
|
||||
e.Static("/", *pathPtr) // Serve everything from the current dir
|
||||
port := ":" + strconv.FormatInt(int64(*portPtr), 10)
|
||||
path := *crtPtr
|
||||
|
||||
// Start server with unsecure HTTP
|
||||
if *isUnsecure {
|
||||
log.Println("Starting serving", *pathPtr, "on", *portPtr)
|
||||
e.Start(port)
|
||||
fs := http.FileServer(http.Dir(*path))
|
||||
http.Handle("/", fs)
|
||||
|
||||
} else { // or with awesome TLS
|
||||
if _, err := os.Stat(path + "/cert.pem"); os.IsNotExist(err) {
|
||||
// Generating certificates
|
||||
err := tlscert.GenerateCert(path)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed generating certs: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
log.Println("Starting serving", *pathPtr, "on", *portPtr)
|
||||
e.StartTLS(port, path+"/cert.pem", path+"/key.pem")
|
||||
}
|
||||
log.Println("Listening...")
|
||||
log.Fatalln(http.ListenAndServe(port, nil))
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue