1
0
Fork 0
main
Ambrose Chua 2021-11-17 18:37:38 +08:00
parent aeddf1c9d6
commit 32d5b985b4
19 changed files with 251 additions and 1260 deletions

11
.dockerignore Normal file
View File

@ -0,0 +1,11 @@
cmd/admin/admin
cmd/control/control
cmd/web/web
cmd/preview/preview
cmd/proxy/proxy
# dist is required for Dockerfile.local
env
tilt_modules
build
deployments

3
.gitignore vendored
View File

@ -3,5 +3,6 @@ cmd/control/control
cmd/web/web cmd/web/web
cmd/preview/preview cmd/preview/preview
cmd/proxy/proxy cmd/proxy/proxy
dist
env env
tilt_modules

104
Tiltfile Normal file
View File

@ -0,0 +1,104 @@
load('ext://restart_process', 'docker_build_with_restart')
local_resource(
'control-go-compile',
'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o dist/control ./cmd/control',
deps=['cmd/control', 'pkg', 'internal'],
allow_parallel=True,
)
docker_build_with_restart(
'registry.makerforce.io/photos/control',
'.',
entrypoint=['/control'],
dockerfile='build/control/Dockerfile.local',
only=['dist/control'],
live_update=[
sync('dist/control', '/control'),
],
)
docker_build_with_restart(
'registry.makerforce.io/photos/preview',
'.',
entrypoint=['/preview'],
dockerfile='build/preview/Dockerfile',
target='build',
only=['cmd/preview', 'pkg', 'internal', 'go.mod', 'go.sum'],
live_update=[
sync('cmd/preview', '/src/cmd/preview'),
sync('pkg', '/src/pkg'),
sync('internal', '/src/internal'),
run('go build -o /preview'),
],
)
local_resource(
'proxy-go-compile',
'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o dist/proxy ./cmd/proxy',
deps=['cmd/proxy'],
allow_parallel=True,
)
docker_build_with_restart(
'registry.makerforce.io/photos/proxy',
'.',
entrypoint=['/proxy'],
dockerfile='build/proxy/Dockerfile.local',
only=['dist/proxy'],
live_update=[
sync('dist/proxy', '/proxy'),
],
)
local_resource(
'web-go-compile',
'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o dist/web ./cmd/web',
deps=['cmd/web', 'pkg', 'internal', 'web'],
allow_parallel=True,
)
docker_build_with_restart(
'registry.makerforce.io/photos/web',
'.',
entrypoint=['/web'],
dockerfile='build/web/Dockerfile.local',
only=['dist/web'],
live_update=[
sync('dist/web', '/web'),
],
)
k8s_yaml('deployments/secrets.yml')
k8s_yaml('deployments/minio-basic.yml')
k8s_resource(
'minio',
port_forwards=[
'9000:9000',
'9001:9001',
],
objects=['minio:secret', 'minio:service'],
)
k8s_yaml('deployments/services.yml')
k8s_resource(
'proxy',
port_forwards=[
'8101',
],
)
k8s_resource(
'control',
port_forwards=[
'8100',
],
)
k8s_resource(
'preview',
port_forwards=[
'8103',
],
)
k8s_resource(
'web',
port_forwards=[
'8104',
],
)

View File

@ -1,17 +1,15 @@
FROM golang:alpine AS build FROM golang:1.16-alpine AS build
RUN mkdir /src /dist
WORKDIR /src WORKDIR /src
COPY . ./ COPY . ./
WORKDIR /src/cmd/control/ WORKDIR /src/cmd/control/
ENV CGO_ENABLED=0 ENV CGO_ENABLED=0
RUN go build -o /dist/control RUN go build -o /control
FROM scratch FROM scratch
COPY --from=build /dist/control /control COPY --from=build /control /control
ENTRYPOINT ["/control"] ENTRYPOINT ["/control"]

View File

@ -0,0 +1,3 @@
FROM alpine:latest
COPY ./dist/control /control
ENTRYPOINT ["/control"]

View File

@ -1,23 +1,21 @@
FROM golang:buster AS build FROM golang:1.16-bullseye AS build
RUN apt-get update RUN apt-get update \
RUN apt-get install -y libvips-dev && apt-get install -y libvips-dev
RUN mkdir /src /dist
WORKDIR /src WORKDIR /src
COPY . ./ COPY . ./
WORKDIR /src/cmd/preview/ WORKDIR /src/cmd/preview/
RUN go build -o /dist/preview RUN go build -o /preview
FROM debian:buster FROM debian:bullseye
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y libvips42 \ && apt-get install -y libvips42 \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
COPY --from=build /dist/preview /preview COPY --from=build /preview /preview
ENTRYPOINT ["/preview"] ENTRYPOINT ["/preview"]

View File

@ -1,17 +1,15 @@
FROM golang:alpine AS build FROM golang:1.16-alpine AS build
RUN mkdir /src /dist
WORKDIR /src WORKDIR /src
COPY . ./ COPY . ./
WORKDIR /src/cmd/proxy/ WORKDIR /src/cmd/proxy/
ENV CGO_ENABLED=0 ENV CGO_ENABLED=0
RUN go build -o /dist/proxy RUN go build -o /proxy
FROM scratch FROM scratch
COPY --from=build /dist/proxy /proxy COPY --from=build /proxy /proxy
ENTRYPOINT ["/proxy"] ENTRYPOINT ["/proxy"]

View File

@ -0,0 +1,3 @@
FROM alpine:latest
COPY ./dist/proxy /proxy
ENTRYPOINT ["/proxy"]

View File

@ -1,17 +1,15 @@
FROM golang:buster AS build FROM golang:1.16-alpine AS build
RUN mkdir /src /dist
WORKDIR /src WORKDIR /src
COPY . ./ COPY . ./
WORKDIR /src/cmd/web/ WORKDIR /src/cmd/web/
ENV CGO_ENABLED=0 ENV CGO_ENABLED=0
RUN go build -o /dist/web RUN go build -o /web
FROM debian:buster FROM scratch
COPY --from=build /dist/web /web COPY --from=build /web /web
ENTRYPOINT ["/web"] ENTRYPOINT ["/web"]

View File

@ -0,0 +1,3 @@
FROM alpine:latest
COPY ./dist/web /web
ENTRYPOINT ["/web"]

View File

@ -1,9 +0,0 @@
# Creating embedded data
```bash
go get -u github.com/go-bindata/go-bindata/v3/...
go generate
```
<!-- vim: set conceallevel=2 et ts=2 sw=2: -->

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,7 @@ import (
"strings" "strings"
lib "git.makerforce.io/photos/photos/pkg/bucket" lib "git.makerforce.io/photos/photos/pkg/bucket"
"git.makerforce.io/photos/photos/web"
) )
var funcs = template.FuncMap{ var funcs = template.FuncMap{
@ -38,7 +39,7 @@ var viewTemplate = mustTemplateAsset("view/index.tmpl")
var manageTemplate = mustTemplateAsset("manage/index.tmpl") var manageTemplate = mustTemplateAsset("manage/index.tmpl")
func mustTemplateAsset(name string) *template.Template { func mustTemplateAsset(name string) *template.Template {
buf, err := Asset(name) buf, err := web.FS.ReadFile(name)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,7 +1,5 @@
package main package main
//go:generate go-bindata -fs -prefix "../../web/" "../../web/..."
import ( import (
"bytes" "bytes"
"fmt" "fmt"
@ -13,6 +11,7 @@ import (
lib "git.makerforce.io/photos/photos/pkg/bucket" lib "git.makerforce.io/photos/photos/pkg/bucket"
"git.makerforce.io/photos/photos/pkg/credentials" "git.makerforce.io/photos/photos/pkg/credentials"
"git.makerforce.io/photos/photos/pkg/signer" "git.makerforce.io/photos/photos/pkg/signer"
"git.makerforce.io/photos/photos/web"
) )
var creds *credentials.Client var creds *credentials.Client
@ -51,7 +50,7 @@ func main() {
endpoint = os.Getenv("WEB_ENDPOINT") endpoint = os.Getenv("WEB_ENDPOINT")
controlEndpoint = os.Getenv("CONTROL_ENDPOINT") controlEndpoint = os.Getenv("CONTROL_ENDPOINT")
sharedFileServer = http.FileServer(AssetFile()) sharedFileServer = http.FileServer(http.FS(web.FS))
server := &http.Server{ server := &http.Server{
Addr: ":8004", Addr: ":8004",
@ -101,14 +100,17 @@ func update(w http.ResponseWriter, req *http.Request) {
title, err := getBucketMetadataTitle(bucket, cred) title, err := getBucketMetadataTitle(bucket, cred)
if err != nil { if err != nil {
err := fmt.Errorf("bucket title: %w", err.Error()) /*
httphelpers.ErrorResponse(w, err) err := fmt.Errorf("bucket title: %w", err)
return httphelpers.ErrorResponse(w, err)
return
*/
title = ""
} }
photos, err := getPhotos(bucket, cred) photos, err := getPhotos(bucket, cred)
if err != nil { if err != nil {
err := fmt.Errorf("cannot list bucket: %w", err.Error()) err := fmt.Errorf("cannot list bucket: %w", err)
httphelpers.ErrorResponse(w, err) httphelpers.ErrorResponse(w, err)
return return
} }

View File

@ -0,0 +1,40 @@
apiVersion: v1
kind: Pod
metadata:
name: minio
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:RELEASE.2021-11-09T03-21-45Z
command: ["minio", "server", "/data", "--console-address", ":9001"]
env:
- name: MINIO_ROOT_USER
valueFrom:
secretKeyRef:
key: accesskey
name: minio
- name: MINIO_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: secretkey
name: minio
ports:
- containerPort: 9000
- containerPort: 9001
---
apiVersion: v1
kind: Service
metadata:
name: minio
spec:
selector:
app: minio
ports:
- name: api
protocol: TCP
port: 9000
- name: console
protocol: TCP
port: 9001

9
deployments/secrets.yml Normal file
View File

@ -0,0 +1,9 @@
apiVersion: v1
kind: Secret
metadata:
name: minio
labels:
app: minio
data:
accesskey: bWluaW9hZG1pbg==
secretkey: bWluaW9hZG1pbg==

View File

@ -1,18 +1,18 @@
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: photos-proxy name: proxy
labels: labels:
app: photos-proxy app: proxy
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: photos-proxy app: proxy
template: template:
metadata: metadata:
labels: labels:
app: photos-proxy app: proxy
spec: spec:
containers: containers:
- name: proxy - name: proxy
@ -20,7 +20,7 @@ spec:
imagePullPolicy: Always imagePullPolicy: Always
env: env:
- name: MINIO_ENDPOINT - name: MINIO_ENDPOINT
value: api.ambrose.photos:9000 value: minio:9000
- name: MINIO_DOMAIN - name: MINIO_DOMAIN
value: "" value: ""
- name: MINIO_ENDPOINT_SECURE - name: MINIO_ENDPOINT_SECURE
@ -29,35 +29,33 @@ spec:
value: "false" value: "false"
ports: ports:
- containerPort: 80 - containerPort: 80
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: photos-proxy name: proxy
spec: spec:
selector: selector:
app: photos-proxy app: proxy
ports: ports:
- protocol: TCP - protocol: TCP
port: 80 port: 80
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: photos-control name: control
labels: labels:
app: photos-control app: control
spec: spec:
replicas: 1 replicas: 2
selector: selector:
matchLabels: matchLabels:
app: photos-control app: control
template: template:
metadata: metadata:
labels: labels:
app: photos-control app: control
spec: spec:
containers: containers:
- name: control - name: control
@ -65,7 +63,7 @@ spec:
imagePullPolicy: Always imagePullPolicy: Always
env: env:
- name: MINIO_ENDPOINT - name: MINIO_ENDPOINT
value: api.ambrose.photos:9000 value: minio:9000
- name: MINIO_ACCESS_KEY - name: MINIO_ACCESS_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
@ -82,38 +80,40 @@ spec:
value: "false" value: "false"
- name: MINIO_CREDENTIALS_BUCKET - name: MINIO_CREDENTIALS_BUCKET
value: "credentials" value: "credentials"
- name: EXPIRATION_READ
value: "5m"
- name: EXPIRATION_WRITE
value: "1m"
ports: ports:
- containerPort: 8000 - containerPort: 8000
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: photos-control name: control
spec: spec:
selector: selector:
app: photos-control app: control
ports: ports:
- protocol: TCP - protocol: TCP
port: 80 port: 80
targetPort: 8000 targetPort: 8000
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: photos-preview name: preview
labels: labels:
app: photos-preview app: preview
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: photos-preview app: preview
template: template:
metadata: metadata:
labels: labels:
app: photos-preview app: preview
spec: spec:
containers: containers:
- name: preview - name: preview
@ -121,7 +121,7 @@ spec:
imagePullPolicy: Always imagePullPolicy: Always
env: env:
- name: MINIO_ENDPOINT - name: MINIO_ENDPOINT
value: api.ambrose.photos:9000 value: minio:9000
- name: MINIO_ACCESS_KEY - name: MINIO_ACCESS_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
@ -138,38 +138,40 @@ spec:
value: "false" value: "false"
- name: MINIO_CREDENTIALS_BUCKET - name: MINIO_CREDENTIALS_BUCKET
value: "credentials" value: "credentials"
- name: EXPIRATION_READ
value: "5m"
- name: EXPIRATION_WRITE
value: "1m"
ports: ports:
- containerPort: 8003 - containerPort: 8003
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: photos-preview name: preview
spec: spec:
selector: selector:
app: photos-preview app: preview
ports: ports:
- protocol: TCP - protocol: TCP
port: 80 port: 80
targetPort: 8003 targetPort: 8003
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: photos-web name: web
labels: labels:
app: photos-web app: web
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: photos-web app: web
template: template:
metadata: metadata:
labels: labels:
app: photos-web app: web
spec: spec:
containers: containers:
- name: web - name: web
@ -177,7 +179,7 @@ spec:
imagePullPolicy: Always imagePullPolicy: Always
env: env:
- name: MINIO_ENDPOINT - name: MINIO_ENDPOINT
value: api.ambrose.photos:9000 value: minio:9000
- name: MINIO_ACCESS_KEY - name: MINIO_ACCESS_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
@ -195,18 +197,21 @@ spec:
- name: MINIO_CREDENTIALS_BUCKET - name: MINIO_CREDENTIALS_BUCKET
value: "credentials" value: "credentials"
- name: WEB_ENDPOINT - name: WEB_ENDPOINT
value: "http://web.ambrose.photos" value: "http://localhost:8104"
- name: EXPIRATION_READ
value: "5m"
- name: EXPIRATION_WRITE
value: "1m"
ports: ports:
- containerPort: 8004 - containerPort: 8004
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: photos-web name: web
spec: spec:
selector: selector:
app: photos-web app: web
ports: ports:
- protocol: TCP - protocol: TCP
port: 80 port: 80

2
go.mod
View File

@ -1,6 +1,6 @@
module git.makerforce.io/photos/photos module git.makerforce.io/photos/photos
go 1.14 go 1.16
require ( require (
github.com/davidbyttow/govips v0.0.0-20200412130214-cbefdd8c639a github.com/davidbyttow/govips v0.0.0-20200412130214-cbefdd8c639a

6
web/assets.go Normal file
View File

@ -0,0 +1,6 @@
package web
import "embed"
//go:embed manage shared view
var FS embed.FS