feat: as docker mirror registry
feat: add global proxy config upgrade: upgrade front(angular) to 19 chore: deployment staff 1. Dockerfile: build frontend, backend, and run in nginx base image
This commit is contained in:
@ -3,17 +3,19 @@ package blobs
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/verify"
|
||||
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
"github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/verify"
|
||||
"strings"
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
)
|
||||
|
||||
type s3Handler struct {
|
||||
@ -76,22 +78,17 @@ func (s *s3Handler) Put(ctx context.Context, repo string, hash model.Hash, rc io
|
||||
ACL: types.ObjectCannedACLPublicRead,
|
||||
Body: bytes.NewReader(bs),
|
||||
}, s3.WithAPIOptions(
|
||||
//v4.AddUnsignedPayloadMiddleware,
|
||||
//v4.RemoveComputePayloadSHA256Middleware,
|
||||
// v4.AddUnsignedPayloadMiddleware,
|
||||
// v4.RemoveComputePayloadSHA256Middleware,
|
||||
)); err != nil {
|
||||
logrus.
|
||||
WithField("path", "s3Handler.Put").
|
||||
WithField("err", err).
|
||||
Debug()
|
||||
log.Debug("s3Handler: put object err, err = %s", err.Error())
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *s3Handler) Delete(ctx context.Context, repo string, hash model.Hash) error {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
var err error
|
||||
|
||||
if _, err = s.client.DeleteObject(ctx, &s3.DeleteObjectInput{
|
||||
Bucket: aws.String(s.bucket),
|
||||
@ -128,7 +125,7 @@ func NewS3BlobHandler(
|
||||
Value: aws.Credentials{AccessKeyID: accessKey, SecretAccessKey: secretKey},
|
||||
}),
|
||||
); err != nil {
|
||||
logrus.Panicf("init s3 client err: %v", err)
|
||||
log.Panic("init s3 client err: %v", err)
|
||||
}
|
||||
|
||||
client = s3.NewFromConfig(cfg, func(options *s3.Options) {
|
||||
@ -139,16 +136,16 @@ func NewS3BlobHandler(
|
||||
Bucket: aws.String(bucket),
|
||||
}); err != nil {
|
||||
if !strings.Contains(err.Error(), "404") {
|
||||
logrus.Panicf("init s3 bucket err: %v", err)
|
||||
log.Panic("init s3 bucket err: %v", err)
|
||||
}
|
||||
|
||||
logrus.Info("s3 bucket not found, start create...")
|
||||
log.Info("s3 bucket not found, start create...")
|
||||
|
||||
if _, err = client.CreateBucket(ctx, &s3.CreateBucketInput{
|
||||
Bucket: aws.String(bucket),
|
||||
ACL: types.BucketCannedACLPublicRead,
|
||||
}); err != nil {
|
||||
logrus.Panicf("create s3 bucket err: %v", err)
|
||||
log.Panic("create s3 bucket err: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,13 +2,15 @@ package dbs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/glebarez/sqlite"
|
||||
"github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/opt"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/opt"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type tx struct {
|
||||
@ -18,7 +20,7 @@ type tx struct {
|
||||
func (t *tx) TX(ctx context.Context) *gorm.DB {
|
||||
db := t.db.Session(&gorm.Session{}).WithContext(ctx)
|
||||
|
||||
if opt.Debug {
|
||||
if opt.Cfg.Debug {
|
||||
db = db.Debug()
|
||||
}
|
||||
|
||||
@ -31,24 +33,18 @@ func newTX(db *gorm.DB) interfaces.Database {
|
||||
|
||||
func Must(database interfaces.Database, err error) interfaces.Database {
|
||||
if err != nil {
|
||||
logrus.
|
||||
WithField("path", "tx.Must").
|
||||
WithField("err", err.Error()).
|
||||
Panic()
|
||||
log.Panic("tx.Must: err = %s", err.Error())
|
||||
}
|
||||
|
||||
if database == nil {
|
||||
logrus.
|
||||
WithField("path", "tx.Must").
|
||||
WithField("err", "database is nil").
|
||||
Panic()
|
||||
log.Panic("tx.Must: database is nil")
|
||||
}
|
||||
|
||||
return database
|
||||
}
|
||||
|
||||
func NewSqliteTX(filepath string) (interfaces.Database, error) {
|
||||
if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil {
|
||||
if err := os.MkdirAll(path.Dir(filepath), 0o755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,9 @@ package interfaces
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
)
|
||||
|
||||
type ManifestHandler interface {
|
||||
|
@ -6,16 +6,18 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/samber/lo"
|
||||
"github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"nf-repo/internal/util/tools"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
"nf-repo/internal/tool/tools"
|
||||
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
"github.com/samber/lo"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
type pm struct {
|
||||
@ -56,7 +58,7 @@ func (m *dbManifests) Get(ctx context.Context, repo string, target string) (io.R
|
||||
return io.NopCloser(bytes.NewReader(pd.Content)), pd.ContentType, nil
|
||||
}
|
||||
|
||||
var pm = new(model.PackageManifest)
|
||||
pm := new(model.PackageManifest)
|
||||
|
||||
if err = m.db.TX(tools.Timeout(5)).
|
||||
Model(&model.PackageManifest{}).
|
||||
@ -80,11 +82,7 @@ func (m *dbManifests) Get(ctx context.Context, repo string, target string) (io.R
|
||||
Where("id", pm.DigestId).
|
||||
Take(pd).
|
||||
Error; err != nil {
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Get").
|
||||
WithField("digest", pm.DigestId).
|
||||
WithField("err", err.Error()).
|
||||
Error()
|
||||
log.Error("dbManifests: get err, digest = %s, err = %s", pm.Digest, err.Error())
|
||||
return nil, "", rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -92,7 +90,6 @@ func (m *dbManifests) Get(ctx context.Context, repo string, target string) (io.R
|
||||
}
|
||||
|
||||
func (m *dbManifests) Put(ctx context.Context, repo string, tag string, digest string, mf *model.RepoSimpleManifest) *rerr.RepositoryError {
|
||||
|
||||
var (
|
||||
err error
|
||||
pm = &model.PackageManifest{
|
||||
@ -132,13 +129,11 @@ func (m *dbManifests) Put(ctx context.Context, repo string, tag string, digest s
|
||||
Column: clause.Column{Name: "size"},
|
||||
Value: pd.Size,
|
||||
},
|
||||
}}).
|
||||
},
|
||||
}).
|
||||
Create(pd).
|
||||
Error; err != nil {
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Put.Create").
|
||||
WithField("err", err.Error()).
|
||||
Error()
|
||||
log.Error("dbManifests: put create err, err = %s", err.Error())
|
||||
return rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -156,10 +151,7 @@ func (m *dbManifests) Put(ctx context.Context, repo string, tag string, digest s
|
||||
"digest_id": pm.DigestId,
|
||||
}).
|
||||
Error; err != nil {
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Put.Updates").
|
||||
WithField("err", err.Error()).
|
||||
Debug()
|
||||
log.Debug("dbManifests: put updates err, err = %s", err.Error())
|
||||
return rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -167,9 +159,7 @@ func (m *dbManifests) Put(ctx context.Context, repo string, tag string, digest s
|
||||
}
|
||||
|
||||
func (m *dbManifests) Delete(ctx context.Context, repo string, target string) *rerr.RepositoryError {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
var err error
|
||||
|
||||
if err = m.db.TX(tools.Timeout(5)).
|
||||
Where("repo", repo).
|
||||
@ -286,12 +276,7 @@ func (m *dbManifests) Referrers(ctx context.Context, repo string, target string)
|
||||
}
|
||||
}
|
||||
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Referrers.Take").
|
||||
WithField("repo", repo).
|
||||
WithField("target", target).
|
||||
WithField("err", err.Error()).
|
||||
Debug()
|
||||
log.Debug("dbManifests: referrers take err, repo = %s, target = %s, err = %s", repo, target, err.Error())
|
||||
|
||||
return nil, rerr.ErrInternal(err)
|
||||
}
|
||||
@ -309,11 +294,7 @@ func (m *dbManifests) Referrers(ctx context.Context, repo string, target string)
|
||||
}
|
||||
}
|
||||
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Referrers.Take").
|
||||
WithField("repo", repo).
|
||||
WithField("target", target).
|
||||
Error()
|
||||
log.Error("dbManifests: referrers take err, repo = %s, target = %s, err = %s", repo, target, err.Error())
|
||||
|
||||
return nil, rerr.ErrInternal(err)
|
||||
}
|
||||
@ -323,23 +304,14 @@ func (m *dbManifests) Referrers(ctx context.Context, repo string, target string)
|
||||
Take(pd).
|
||||
Error; err != nil {
|
||||
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Referrers.Take").
|
||||
WithField("repo", repo).
|
||||
WithField("target", target).
|
||||
Error()
|
||||
log.Error("dbManifests: referrers take err, repo = %s, target = %s, err = %s", repo, target, err.Error())
|
||||
|
||||
return nil, rerr.ErrInternal(err)
|
||||
}
|
||||
}
|
||||
|
||||
if err = json.Unmarshal(pd.Content, manifest); err != nil {
|
||||
logrus.
|
||||
WithField("path", "dbManifests.Referrers.Unmarshal").
|
||||
WithField("repo", repo).
|
||||
WithField("target", target).
|
||||
WithField("err", err.Error()).
|
||||
Debug()
|
||||
log.Debug("dbManifests: referrers unmarshal err, repo %s, target = %s, err = %s", repo, target, err.Error())
|
||||
return nil, rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -347,18 +319,13 @@ func (m *dbManifests) Referrers(ctx context.Context, repo string, target string)
|
||||
}
|
||||
|
||||
func NewManifestDBHandler(tx interfaces.Database) interfaces.ManifestHandler {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
var err error
|
||||
|
||||
if err = tx.TX(tools.Timeout(5)).AutoMigrate(
|
||||
&model.PackageManifest{},
|
||||
&model.PackageDigest{},
|
||||
); err != nil {
|
||||
logrus.
|
||||
WithField("path", "NewManifestDBHandler").
|
||||
WithField("method", "AutoMigrate").
|
||||
Panic(err)
|
||||
log.Panic("NewManifestDBHandler: db auto_migrate failed, err = %s", err.Error())
|
||||
}
|
||||
|
||||
return &dbManifests{db: tx}
|
||||
|
@ -5,16 +5,18 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"net/http"
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/model/types"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/model/types"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
)
|
||||
|
||||
type memManifest struct {
|
||||
@ -203,7 +205,7 @@ func (m *memManifest) Put(ctx context.Context, repo string, target string, diges
|
||||
}
|
||||
} else {
|
||||
// TODO: Probably want to do an existence check for blobs.
|
||||
logrus.Warnf("TODO: Check blobs for %q", desc.Digest)
|
||||
log.Warn("TODO: Check blobs for %q", desc.Digest)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
@ -3,8 +3,9 @@ package interfaces
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
)
|
||||
|
||||
type UploadHandler interface {
|
||||
|
@ -4,17 +4,19 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"net/http"
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"nf-repo/internal/verify"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
"nf-repo/internal/verify"
|
||||
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
)
|
||||
|
||||
type localUploader struct {
|
||||
@ -52,10 +54,9 @@ func (l *localUploader) Write(ctx context.Context, id string, reader io.ReadClos
|
||||
|
||||
if start > 0 {
|
||||
flag = os.O_APPEND | os.O_RDWR
|
||||
|
||||
}
|
||||
|
||||
if f, err = os.OpenFile(filename, flag, 0644); err != nil {
|
||||
if f, err = os.OpenFile(filename, flag, 0o644); err != nil {
|
||||
return 0, rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -84,7 +85,7 @@ func (l *localUploader) Done(ctx context.Context, bh interfaces.BlobHandler, id
|
||||
filename = path.Join(l.basedir, id)
|
||||
)
|
||||
|
||||
if f, err = os.OpenFile(filename, os.O_RDONLY, 0644); err != nil {
|
||||
if f, err = os.OpenFile(filename, os.O_RDONLY, 0o644); err != nil {
|
||||
return rerr.ErrInternal(err)
|
||||
}
|
||||
|
||||
@ -96,19 +97,11 @@ func (l *localUploader) Done(ctx context.Context, bh interfaces.BlobHandler, id
|
||||
}
|
||||
defer vrc.Close()
|
||||
|
||||
logrus.
|
||||
WithField("path", "localUploader.Done").
|
||||
WithField("id", id).
|
||||
WithField("size", size).
|
||||
Error()
|
||||
log.Error("localUploader: upload done, id = %s, size = %d", id, size)
|
||||
|
||||
if err := bh.Put(ctx, repo, hash, vrc); err != nil {
|
||||
if errors.As(err, &verify.Error{}) {
|
||||
logrus.
|
||||
WithField("path", "handleBlobs.Put").
|
||||
WithField("repo", repo).
|
||||
WithField("hash", hash.String()).
|
||||
WithField("err", fmt.Sprintf("Digest mismatch: %v", err)).Debug()
|
||||
log.Debug("localUploader: blob handler put err, repo = %s, hash = %s, err = %s", repo, hash.String(), fmt.Sprintf("Digest mismatch: %v", err))
|
||||
return rerr.ErrDigestMismatch
|
||||
}
|
||||
return rerr.ErrInternal(err)
|
||||
@ -118,27 +111,17 @@ func (l *localUploader) Done(ctx context.Context, bh interfaces.BlobHandler, id
|
||||
f.Close()
|
||||
|
||||
if err = os.Remove(filename); err != nil {
|
||||
logrus.
|
||||
WithField("path", "localUploader.Done.Remove").
|
||||
WithField("filename", filename).
|
||||
WithField("err", err.Error()).
|
||||
Warn()
|
||||
log.Warn("localUploader: os remove err, filename = %s, err = %s", filename, err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewLocalUploader(basedir string) interfaces.UploadHandler {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
var err error
|
||||
|
||||
if err = os.MkdirAll(basedir, 0755); err != nil {
|
||||
logrus.
|
||||
WithField("path", "uploads.localUploader.NewLocalUploader").
|
||||
WithField("basedir", basedir).
|
||||
WithField("err", err.Error()).
|
||||
Panic()
|
||||
if err = os.MkdirAll(basedir, 0o755); err != nil {
|
||||
log.Panic("NewLocalUploader: os MkdirAll err, basedir = %s, err = %s", basedir, err.Error())
|
||||
}
|
||||
|
||||
return &localUploader{lock: sync.Mutex{}, basedir: basedir, sizeMap: make(map[string]int)}
|
||||
|
@ -5,16 +5,18 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"net/http"
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/util/rerr"
|
||||
"nf-repo/internal/verify"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"nf-repo/internal/interfaces"
|
||||
"nf-repo/internal/model"
|
||||
"nf-repo/internal/tool/rerr"
|
||||
"nf-repo/internal/verify"
|
||||
|
||||
"github.com/loveuer/nf/nft/log"
|
||||
)
|
||||
|
||||
type memUploader struct {
|
||||
@ -77,11 +79,7 @@ func (m *memUploader) Done(ctx context.Context, bh interfaces.BlobHandler, id st
|
||||
|
||||
if err := bh.Put(ctx, repo, hash, vrc); err != nil {
|
||||
if errors.As(err, &verify.Error{}) {
|
||||
logrus.
|
||||
WithField("path", "handleBlobs.Put").
|
||||
WithField("repo", repo).
|
||||
WithField("hash", hash.String()).
|
||||
WithField("err", fmt.Sprintf("Digest mismatch: %v", err)).Debug()
|
||||
log.Debug("memUploader: handle blob put err, repo = %s, hash = %s, err = %s", repo, hash.String(), fmt.Sprintf("Digest mismatch: %v", err))
|
||||
return rerr.ErrDigestMismatch
|
||||
}
|
||||
return rerr.ErrInternal(err)
|
||||
|
Reference in New Issue
Block a user