mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
feat: use env to predefine admin user #214
This commit is contained in:
parent
13c4eb04a3
commit
4c74bc8619
10 changed files with 89 additions and 28 deletions
|
@ -20,7 +20,7 @@ COPY nginx-ui-$TARGETOS-$TARGETARCH$TARGETVARIANT/nginx-ui /usr/local/bin/nginx-
|
||||||
|
|
||||||
# remove default nginx config
|
# remove default nginx config
|
||||||
RUN rm -f /etc/nginx/conf.d/default.conf \
|
RUN rm -f /etc/nginx/conf.d/default.conf \
|
||||||
&& rm -f /usr/etc/nginx/conf.d/default.conf
|
&& rm -f /usr/local/etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
# recreate access.log and error.log
|
# recreate access.log and error.log
|
||||||
RUN rm -f /var/log/nginx/access.log && \
|
RUN rm -f /var/log/nginx/access.log && \
|
||||||
|
|
|
@ -49,7 +49,6 @@ func InstallNginxUI(c *gin.Context) {
|
||||||
if "" != json.Database {
|
if "" != json.Database {
|
||||||
settings.ServerSettings.Database = json.Database
|
settings.ServerSettings.Database = json.Database
|
||||||
}
|
}
|
||||||
settings.ReflectFrom()
|
|
||||||
|
|
||||||
err := settings.Save()
|
err := settings.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -72,6 +71,7 @@ func InstallNginxUI(c *gin.Context) {
|
||||||
api.ErrHandler(c, err)
|
api.ErrHandler(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"message": "ok",
|
"message": "ok",
|
||||||
})
|
})
|
||||||
|
|
|
@ -40,8 +40,6 @@ func SaveSettings(c *gin.Context) {
|
||||||
fillSettings(&settings.OpenAISettings, &json.Openai)
|
fillSettings(&settings.OpenAISettings, &json.Openai)
|
||||||
fillSettings(&settings.LogrotateSettings, &json.Logrotate)
|
fillSettings(&settings.LogrotateSettings, &json.Logrotate)
|
||||||
|
|
||||||
settings.ReflectFrom()
|
|
||||||
|
|
||||||
err := settings.Save()
|
err := settings.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
api.ErrHandler(c, err)
|
api.ErrHandler(c, err)
|
||||||
|
|
|
@ -14,6 +14,7 @@ PageSize = 10
|
||||||
HttpHost = 0.0.0.0
|
HttpHost = 0.0.0.0
|
||||||
CertRenewalInterval = 7
|
CertRenewalInterval = 7
|
||||||
RecursiveNameservers =
|
RecursiveNameservers =
|
||||||
|
SkipInstallation = false
|
||||||
|
|
||||||
[nginx]
|
[nginx]
|
||||||
AccessLogPath = /var/log/nginx/access.log
|
AccessLogPath = /var/log/nginx/access.log
|
||||||
|
|
|
@ -41,6 +41,7 @@ func Boot() {
|
||||||
|
|
||||||
func InitAfterDatabase() {
|
func InitAfterDatabase() {
|
||||||
syncs := []func(){
|
syncs := []func(){
|
||||||
|
registerPredefinedUser,
|
||||||
cert.InitRegister,
|
cert.InitRegister,
|
||||||
InitCronJobs,
|
InitCronJobs,
|
||||||
analytic.RetrieveNodesStatus,
|
analytic.RetrieveNodesStatus,
|
||||||
|
@ -60,14 +61,9 @@ func recovery() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitDatabase() {
|
func InitDatabase() {
|
||||||
|
// Skip install
|
||||||
// Skip installation
|
if settings.ServerSettings.SkipInstallation {
|
||||||
if settings.ServerSettings.SkipInstallation && settings.ServerSettings.JwtSecret == "" {
|
skipInstall()
|
||||||
settings.ServerSettings.JwtSecret = uuid.New().String()
|
|
||||||
err := settings.Save()
|
|
||||||
if err != nil {
|
|
||||||
logger.Error(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if "" != settings.ServerSettings.JwtSecret {
|
if "" != settings.ServerSettings.JwtSecret {
|
||||||
|
@ -82,7 +78,6 @@ func InitNodeSecret() {
|
||||||
if "" == settings.ServerSettings.NodeSecret {
|
if "" == settings.ServerSettings.NodeSecret {
|
||||||
logger.Warn("NodeSecret is empty, generating...")
|
logger.Warn("NodeSecret is empty, generating...")
|
||||||
settings.ServerSettings.NodeSecret = uuid.New().String()
|
settings.ServerSettings.NodeSecret = uuid.New().String()
|
||||||
settings.ReflectFrom()
|
|
||||||
|
|
||||||
err := settings.Save()
|
err := settings.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
74
internal/kernal/skip_install.go
Normal file
74
internal/kernal/skip_install.go
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
package kernal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||||
|
"github.com/0xJacky/Nginx-UI/model"
|
||||||
|
"github.com/0xJacky/Nginx-UI/query"
|
||||||
|
"github.com/0xJacky/Nginx-UI/settings"
|
||||||
|
"github.com/caarlos0/env/v11"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type predefinedUser struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func skipInstall() {
|
||||||
|
logger.Info("Skip installation mode enabled")
|
||||||
|
|
||||||
|
if settings.ServerSettings.JwtSecret == "" {
|
||||||
|
settings.ServerSettings.JwtSecret = uuid.New().String()
|
||||||
|
}
|
||||||
|
|
||||||
|
if settings.ServerSettings.NodeSecret == "" {
|
||||||
|
settings.ServerSettings.NodeSecret = uuid.New().String()
|
||||||
|
logger.Infof("NodeSecret: %s", settings.ServerSettings.NodeSecret)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := settings.Save()
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerPredefinedUser() {
|
||||||
|
// when skip installation mode is enabled, the predefined user will be created
|
||||||
|
if !settings.ServerSettings.SkipInstallation {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pUser := &predefinedUser{}
|
||||||
|
|
||||||
|
err := env.ParseWithOptions(pUser, env.Options{
|
||||||
|
Prefix: "NGINX_UI_PREDEFINED_USER_",
|
||||||
|
UseFieldNameByDefault: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
u := query.Auth
|
||||||
|
|
||||||
|
_, err = u.First()
|
||||||
|
|
||||||
|
// Only effect when there is no user in the database
|
||||||
|
if !errors.Is(err, gorm.ErrRecordNotFound) || pUser.Name == "" || pUser.Password == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new user with the predefined name and password
|
||||||
|
pwd, _ := bcrypt.GenerateFromPassword([]byte(pUser.Password), bcrypt.DefaultCost)
|
||||||
|
|
||||||
|
err = u.Create(&model.Auth{
|
||||||
|
Name: pUser.Name,
|
||||||
|
Password: string(pwd),
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,2 +1,3 @@
|
||||||
#!/bin/sh
|
#!/command/with-contenv sh
|
||||||
|
env
|
||||||
nginx-ui --config /etc/nginx-ui/app.ini
|
nginx-ui --config /etc/nginx-ui/app.ini
|
||||||
|
|
|
@ -69,12 +69,6 @@ func MapTo() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReflectFrom() {
|
|
||||||
for k, v := range sections {
|
|
||||||
reflectFrom(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func mapTo(section string, v interface{}) {
|
func mapTo(section string, v interface{}) {
|
||||||
err := Conf.Section(section).MapTo(v)
|
err := Conf.Section(section).MapTo(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -90,6 +84,10 @@ func reflectFrom(section string, v interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Save() (err error) {
|
func Save() (err error) {
|
||||||
|
for k, v := range sections {
|
||||||
|
reflectFrom(k, v)
|
||||||
|
}
|
||||||
|
|
||||||
err = Conf.SaveTo(ConfPath)
|
err = Conf.SaveTo(ConfPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
|
|
@ -52,6 +52,7 @@ func TestSetup(t *testing.T) {
|
||||||
_ = os.Setenv("NGINX_UI_LOGROTATE_CMD", "logrotate /custom/logrotate.conf")
|
_ = os.Setenv("NGINX_UI_LOGROTATE_CMD", "logrotate /custom/logrotate.conf")
|
||||||
_ = os.Setenv("NGINX_UI_LOGROTATE_INTERVAL", "60")
|
_ = os.Setenv("NGINX_UI_LOGROTATE_INTERVAL", "60")
|
||||||
|
|
||||||
|
ConfPath = "app.testing.ini"
|
||||||
Setup()
|
Setup()
|
||||||
|
|
||||||
assert.Equal(t, "8080", ServerSettings.HttpPort)
|
assert.Equal(t, "8080", ServerSettings.HttpPort)
|
||||||
|
@ -96,4 +97,5 @@ func TestSetup(t *testing.T) {
|
||||||
assert.Equal(t, 60, LogrotateSettings.Interval)
|
assert.Equal(t, 60, LogrotateSettings.Interval)
|
||||||
|
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
|
_ = os.Remove("app.testing.ini")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
package settings
|
|
||||||
|
|
||||||
type PredefinedUser struct {
|
|
||||||
User string `json:"user"`
|
|
||||||
Password string `json:"password"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var PredefinedUserSettings = &PredefinedUser{}
|
|
Loading…
Add table
Add a link
Reference in a new issue