mirror of https://github.com/h44z/wg-portal.git
				
				
				
			wip: dockerfile
This commit is contained in:
		
							parent
							
								
									07e7d1d6e9
								
							
						
					
					
						commit
						3cbc30fe48
					
				|  | @ -27,6 +27,7 @@ | ||||||
| *.iws | *.iws | ||||||
| out/ | out/ | ||||||
| dist/ | dist/ | ||||||
|  | data/ | ||||||
| ssh.key | ssh.key | ||||||
| .testCoverage.txt | .testCoverage.txt | ||||||
| wg_portal.db | wg_portal.db | ||||||
|  |  | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | # Dockerfile References: https://docs.docker.com/engine/reference/builder/ | ||||||
|  | # This dockerfile uses a multi-stage build system to reduce the image footprint. | ||||||
|  | 
 | ||||||
|  | ######- | ||||||
|  | # Start from the latest golang base image as builder image (only used to compile the code) | ||||||
|  | ######- | ||||||
|  | FROM golang:1.15 as builder | ||||||
|  | 
 | ||||||
|  | RUN mkdir /build | ||||||
|  | 
 | ||||||
|  | # Copy the source from the current directory to the Working Directory inside the container | ||||||
|  | ADD . /build/ | ||||||
|  | 
 | ||||||
|  | # Set the Current Working Directory inside the container | ||||||
|  | WORKDIR /build | ||||||
|  | 
 | ||||||
|  | # Build the Go app | ||||||
|  | RUN make build | ||||||
|  | 
 | ||||||
|  | ######- | ||||||
|  | # Here starts the main image | ||||||
|  | ######- | ||||||
|  | FROM debian:buster | ||||||
|  | 
 | ||||||
|  | # Setup timezone | ||||||
|  | ENV TZ=Europe/Vienna | ||||||
|  | 
 | ||||||
|  | # GOSS for container health checks | ||||||
|  | ENV GOSS_VERSION v0.3.14 | ||||||
|  | RUN apt-get update && apt-get upgrade -y && \ | ||||||
|  |         apt-get install --no-install-recommends -y moreutils ca-certificates curl && \ | ||||||
|  |         rm -rf /var/cache/apt /var/lib/apt/lists/*; \ | ||||||
|  |         curl -L https://github.com/aelsabbahy/goss/releases/download/$GOSS_VERSION/goss-linux-amd64 -o /usr/local/bin/goss && \ | ||||||
|  |         chmod +rx /usr/local/bin/goss && \ | ||||||
|  |         goss --version | ||||||
|  | 
 | ||||||
|  | COPY --from=builder /build/dist/wg-portal /app/ | ||||||
|  | COPY --from=builder /build/dist/assets /app/assets | ||||||
|  | COPY --from=builder /build/scripts /app/ | ||||||
|  | 
 | ||||||
|  | # Set the Current Working Directory inside the container | ||||||
|  | WORKDIR /app | ||||||
|  | 
 | ||||||
|  | # Command to run the executable | ||||||
|  | CMD [ "/app/wg-portal" ] | ||||||
|  | 
 | ||||||
|  | HEALTHCHECK --interval=1m --timeout=10s \ | ||||||
|  |     CMD /app/docker-healthcheck.sh | ||||||
|  | @ -61,6 +61,7 @@ type Config struct { | ||||||
| 		MailFrom         string `yaml:"mailfrom" envconfig:"MAIL_FROM"` | 		MailFrom         string `yaml:"mailfrom" envconfig:"MAIL_FROM"` | ||||||
| 		AdminUser        string `yaml:"adminUser" envconfig:"ADMIN_USER"` // optional, non LDAP admin user
 | 		AdminUser        string `yaml:"adminUser" envconfig:"ADMIN_USER"` // optional, non LDAP admin user
 | ||||||
| 		AdminPassword    string `yaml:"adminPass" envconfig:"ADMIN_PASS"` | 		AdminPassword    string `yaml:"adminPass" envconfig:"ADMIN_PASS"` | ||||||
|  | 		DatabasePath     string `yaml:"database" envconfig:"DATABASE_PATH"` | ||||||
| 	} `yaml:"core"` | 	} `yaml:"core"` | ||||||
| 	Email          MailConfig       `yaml:"email"` | 	Email          MailConfig       `yaml:"email"` | ||||||
| 	LDAP           ldap.Config      `yaml:"ldap"` | 	LDAP           ldap.Config      `yaml:"ldap"` | ||||||
|  | @ -79,12 +80,14 @@ func NewConfig() *Config { | ||||||
| 	cfg.Core.MailFrom = "WireGuard VPN <noreply@company.com>" | 	cfg.Core.MailFrom = "WireGuard VPN <noreply@company.com>" | ||||||
| 	cfg.Core.AdminUser = "" // non-ldap admin access is disabled by default
 | 	cfg.Core.AdminUser = "" // non-ldap admin access is disabled by default
 | ||||||
| 	cfg.Core.AdminPassword = "" | 	cfg.Core.AdminPassword = "" | ||||||
|  | 	cfg.Core.DatabasePath = "data/wg_portal.db" | ||||||
| 	cfg.LDAP.URL = "ldap://srv-ad01.company.local:389" | 	cfg.LDAP.URL = "ldap://srv-ad01.company.local:389" | ||||||
| 	cfg.LDAP.BaseDN = "DC=COMPANY,DC=LOCAL" | 	cfg.LDAP.BaseDN = "DC=COMPANY,DC=LOCAL" | ||||||
| 	cfg.LDAP.StartTLS = true | 	cfg.LDAP.StartTLS = true | ||||||
| 	cfg.LDAP.BindUser = "company\\\\ldap_wireguard" | 	cfg.LDAP.BindUser = "company\\\\ldap_wireguard" | ||||||
| 	cfg.LDAP.BindPass = "SuperSecret" | 	cfg.LDAP.BindPass = "SuperSecret" | ||||||
| 	cfg.WG.DeviceName = "wg0" | 	cfg.WG.DeviceName = "wg0" | ||||||
|  | 	cfg.WG.WireGuardConfig = "/etc/wireguard/wg0.conf" | ||||||
| 	cfg.AdminLdapGroup = "CN=WireGuardAdmins,OU=_O_IT,DC=COMPANY,DC=LOCAL" | 	cfg.AdminLdapGroup = "CN=WireGuardAdmins,OU=_O_IT,DC=COMPANY,DC=LOCAL" | ||||||
| 	cfg.Email.Host = "127.0.0.1" | 	cfg.Email.Host = "127.0.0.1" | ||||||
| 	cfg.Email.Port = 25 | 	cfg.Email.Port = 25 | ||||||
|  |  | ||||||
|  | @ -79,6 +79,11 @@ type Server struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *Server) Setup() error { | func (s *Server) Setup() error { | ||||||
|  | 	dir := s.getExecutableDirectory() | ||||||
|  | 	rDir, _ := filepath.Abs(filepath.Dir(os.Args[0])) | ||||||
|  | 	log.Infof("Real working directory: %s", rDir) | ||||||
|  | 	log.Infof("Current working directory: %s", dir) | ||||||
|  | 
 | ||||||
| 	// Init rand
 | 	// Init rand
 | ||||||
| 	rand.Seed(time.Now().UnixNano()) | 	rand.Seed(time.Now().UnixNano()) | ||||||
| 
 | 
 | ||||||
|  | @ -102,7 +107,7 @@ func (s *Server) Setup() error { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Setup user manager
 | 	// Setup user manager
 | ||||||
| 	if s.users = NewUserManager(s.wg, s.ldapUsers); s.users == nil { | 	if s.users = NewUserManager(filepath.Join(dir, s.config.Core.DatabasePath), s.wg, s.ldapUsers); s.users == nil { | ||||||
| 		return errors.New("unable to setup user manager") | 		return errors.New("unable to setup user manager") | ||||||
| 	} | 	} | ||||||
| 	if err := s.users.InitFromCurrentInterface(); err != nil { | 	if err := s.users.InitFromCurrentInterface(); err != nil { | ||||||
|  | @ -112,10 +117,7 @@ func (s *Server) Setup() error { | ||||||
| 		return errors.New("unable to restore wirguard state") | 		return errors.New("unable to restore wirguard state") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dir := s.getExecutableDirectory() | 	// Setup mail template
 | ||||||
| 	rDir, _ := filepath.Abs(filepath.Dir(os.Args[0])) |  | ||||||
| 	log.Infof("Real working directory: %s", rDir) |  | ||||||
| 	log.Infof("Current working directory: %s", dir) |  | ||||||
| 	var err error | 	var err error | ||||||
| 	s.mailTpl, err = template.New("email.html").ParseFiles(filepath.Join(dir, "/assets/tpl/email.html")) | 	s.mailTpl, err = template.New("email.html").ParseFiles(filepath.Join(dir, "/assets/tpl/email.html")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -6,6 +6,8 @@ import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" | 	"net" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"sort" | 	"sort" | ||||||
|  | @ -281,12 +283,19 @@ type UserManager struct { | ||||||
| 	ldapUsers *ldap.SynchronizedUserCacheHolder | 	ldapUsers *ldap.SynchronizedUserCacheHolder | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewUserManager(wg *wireguard.Manager, ldapUsers *ldap.SynchronizedUserCacheHolder) *UserManager { | func NewUserManager(dbPath string, wg *wireguard.Manager, ldapUsers *ldap.SynchronizedUserCacheHolder) *UserManager { | ||||||
|  | 
 | ||||||
| 	um := &UserManager{wg: wg, ldapUsers: ldapUsers} | 	um := &UserManager{wg: wg, ldapUsers: ldapUsers} | ||||||
| 	var err error | 	var err error | ||||||
| 	um.db, err = gorm.Open(sqlite.Open("wg_portal.db"), &gorm.Config{}) | 	if _, err = os.Stat(filepath.Dir(dbPath)); os.IsNotExist(err) { | ||||||
|  | 		if err = os.MkdirAll(filepath.Dir(dbPath), 0700); err != nil { | ||||||
|  | 			log.Errorf("failed to create database directory (%s): %v", filepath.Dir(dbPath), err) | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	um.db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Errorf("failed to open sqlite database: %v", err) | 		log.Errorf("failed to open sqlite database (%s): %v", dbPath, err) | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue