Compare commits
	
		
			5 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c22d505aed | ||
|   | cff1c96394 | ||
|   | 9918c0c363 | ||
|   | c7dc3d4402 | ||
|   | 999e80ae2f | 
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,10 +3,10 @@ BIN_INSTALL = $(shell whereis $(BIN_NAME) | cut -d ' ' -f2) | ||||
| 
 | ||||
| VERSION = 0.1.1 | ||||
| 
 | ||||
| run: lint | ||||
| run: check | ||||
| 	@go run main.go | ||||
| 
 | ||||
| build: lint | ||||
| build: check | ||||
| 	@echo "building binary..." | ||||
| 	@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.Version=$(VERSION)" -o $(BIN_NAME) main.go && echo "$(BIN_NAME) v$(VERSION) built" | ||||
| 
 | ||||
| @ -16,7 +16,7 @@ install: build | ||||
| 	@echo "program installed: $(GOPATH)/bin/hmdeploy" | ||||
| 	@$(GOPATH)/bin/hmdeploy --version | ||||
| 
 | ||||
| lint: | ||||
| check: | ||||
| 	@echo "format and lint..." | ||||
| 	@golangci-lint fmt ./... | ||||
| 	@golangci-lint run ./... | ||||
							
								
								
									
										28
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
									
									
									
									
								
							| @ -38,14 +38,6 @@ It has a nice logging and clean all the ressources (succeed or failed). | ||||
| * Create a file inside named: `map.json`. This file will contain all network informations of your instances. | ||||
| ```json | ||||
| { | ||||
| 	"ip": "<proxmox-ip>", | ||||
| 	"web_url": "https://<proxmox-ip>:8006", | ||||
| 	"ssh": { | ||||
| 		"user": "<ssh-user>", | ||||
| 		"privkey": "<path-to-ssh-private-key>", | ||||
| 		"port": <proxmox-ssh-port> | ||||
| 	}, | ||||
| 	"vm": { | ||||
| 	"swarm": { | ||||
| 		"ip": "<swarm-ip>", | ||||
| 		"ssh": { | ||||
| @ -53,9 +45,7 @@ It has a nice logging and clean all the ressources (succeed or failed). | ||||
|                   "privkey": "<path-to-ssh-private-key>", | ||||
|                   "port": <swarm-ssh-port> | ||||
| 		} | ||||
| 		} | ||||
| 	}, | ||||
| 	"lxc": { | ||||
| 	"nginx": { | ||||
| 		"ip": "<nginx-ip>", | ||||
| 		"web_url": "https://<nginx-ip>", | ||||
| @ -65,24 +55,10 @@ It has a nice logging and clean all the ressources (succeed or failed). | ||||
|                   "port": <nginx-ssh-port> | ||||
| 	      } | ||||
|       } | ||||
| 	} | ||||
| } | ||||
| ``` | ||||
| Below an example of a configuration. Of course you must ensure that the user public key has been deployed on the `<ssh-user>` server. | ||||
| 
 | ||||
| You may notice the configuration has two distincts keys: **vm** and **lxc**. And, obviously, it refers to a virtual machine and a linux container. | ||||
| For convience, **Docker Swarm** is installed on a **vm** to ensure a strong isolated environment. If you decided for an LXC, you have to update this section of the code and rebuild the binary: | ||||
| ```go | ||||
| func (hm *HMMap) GetSwarmNetInfo() *HMNetInfo { | ||||
| 	data, ok := hm.VM["swarm"] // update to hm.LXC["swarm] | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	return data | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| * In your project root directory, create a `.homeserver` directory with a configuration file: `hmdeploy.json`: | ||||
| ```json | ||||
| { | ||||
| @ -111,7 +87,7 @@ If you have a Docker registry with the target image available, you can thus leav | ||||
| 
 | ||||
| * Clone the repository | ||||
| ```bash | ||||
| git clone https://gitea.thegux.fr/rmanach/hmdeploy | ||||
| git clone https://gitea.sonak.fr/rmanach/hmdeploy | ||||
| ``` | ||||
| * Install the binary | ||||
| ```bash | ||||
| @ -124,7 +100,7 @@ The binary is then installed in your **$GOPATH/bin**. | ||||
| hmdeploy --help | ||||
| Usage of hmdeploy: | ||||
|   -config string | ||||
|         define the configuration directory (default "/home/romain/.homeserver") | ||||
|         define the configuration directory (default "/home/<user>/.homeserver") | ||||
|   -confirm | ||||
|         do not ask for confirmation, you're the best, you don't need confirmation | ||||
|   -debug | ||||
|  | ||||
| @ -9,8 +9,8 @@ import ( | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"gitea.thegux.fr/hmdeploy/connection" | ||||
| 	"gitea.thegux.fr/hmdeploy/models" | ||||
| 	"gitea.sonak.fr/hmdeploy/connection" | ||||
| 	"gitea.sonak.fr/hmdeploy/models" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -5,8 +5,8 @@ import ( | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 
 | ||||
| 	"gitea.thegux.fr/hmdeploy/models" | ||||
| 	"gitea.thegux.fr/hmdeploy/utils" | ||||
| 	"gitea.sonak.fr/hmdeploy/models" | ||||
| 	"gitea.sonak.fr/hmdeploy/utils" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -7,10 +7,10 @@ import ( | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 
 | ||||
| 	"gitea.thegux.fr/hmdeploy/connection" | ||||
| 	"gitea.thegux.fr/hmdeploy/docker" | ||||
| 	"gitea.thegux.fr/hmdeploy/models" | ||||
| 	"gitea.thegux.fr/hmdeploy/utils" | ||||
| 	"gitea.sonak.fr/hmdeploy/connection" | ||||
| 	"gitea.sonak.fr/hmdeploy/docker" | ||||
| 	"gitea.sonak.fr/hmdeploy/models" | ||||
| 	"gitea.sonak.fr/hmdeploy/utils" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -11,8 +11,8 @@ import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"gitea.thegux.fr/hmdeploy/connection" | ||||
| 	"gitea.thegux.fr/hmdeploy/models" | ||||
| 	"gitea.sonak.fr/hmdeploy/connection" | ||||
| 	"gitea.sonak.fr/hmdeploy/models" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -188,6 +188,11 @@ func (s *Service) UnmarshalJSON(data []byte) error { | ||||
| 		imageName = imageNameParts[0] | ||||
| 	} | ||||
| 
 | ||||
| 	tag := "..." | ||||
| 	if len(imageNameParts) > 1 { | ||||
| 		tag = imageNameParts[1] | ||||
| 	} | ||||
| 
 | ||||
| 	appName := ci.Details[0].Spec.Labels.Namespace | ||||
| 
 | ||||
| 	*s = Service{ | ||||
| @ -199,7 +204,7 @@ func (s *Service) UnmarshalJSON(data []byte) error { | ||||
| 			Tag  string | ||||
| 		}{ | ||||
| 			Name: imageName, | ||||
| 			Tag:  imageNameParts[1], | ||||
| 			Tag:  tag, | ||||
| 		}, | ||||
| 		Networks: networks, | ||||
| 		Ports:    ci.Details[0].Endpoint.Ports, | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | ||||
| module gitea.thegux.fr/hmdeploy | ||||
| module gitea.sonak.fr/hmdeploy | ||||
| 
 | ||||
| go 1.23.0 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										20
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								main.go
									
									
									
									
									
								
							| @ -13,11 +13,11 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"gitea.thegux.fr/hmdeploy/deployers" | ||||
| 	"gitea.thegux.fr/hmdeploy/docker" | ||||
| 	"gitea.thegux.fr/hmdeploy/models" | ||||
| 	"gitea.thegux.fr/hmdeploy/scheduler" | ||||
| 	"gitea.thegux.fr/hmdeploy/utils" | ||||
| 	"gitea.sonak.fr/hmdeploy/deployers" | ||||
| 	"gitea.sonak.fr/hmdeploy/docker" | ||||
| 	"gitea.sonak.fr/hmdeploy/models" | ||||
| 	"gitea.sonak.fr/hmdeploy/scheduler" | ||||
| 	"gitea.sonak.fr/hmdeploy/utils" | ||||
| 	"github.com/rs/zerolog" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| @ -108,8 +108,8 @@ func (d *Deployers) generateDeployTasks() scheduler.Tasks { | ||||
| 
 | ||||
| 	// only swarm deployer | ||||
| 	if d.sd != nil && d.nd == nil { | ||||
| 		rootTask := scheduler.NewTask("swarm-build", d.nd.Build) | ||||
| 		rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.nd.Deploy)) | ||||
| 		rootTask := scheduler.NewTask("swarm-build", d.sd.Build) | ||||
| 		rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.sd.Deploy)) | ||||
| 
 | ||||
| 		tasks = append(tasks, rootTask) | ||||
| 		return tasks | ||||
| @ -293,7 +293,7 @@ func initDeployers( | ||||
| 	} | ||||
| 
 | ||||
| 	if !opt.noSwarm && project.GetComposePath() != "" { | ||||
| 		swarmNet := hmmap.GetSwarmNetInfo() | ||||
| 		swarmNet := hmmap.Swarm | ||||
| 		if swarmNet == nil { | ||||
| 			return deps, fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound) | ||||
| 		} | ||||
| @ -307,7 +307,7 @@ func initDeployers( | ||||
| 	} | ||||
| 
 | ||||
| 	if !opt.noNginx && project.GetNginxConfPath() != "" { | ||||
| 		nginxNet := hmmap.GetNginxNetInfo() | ||||
| 		nginxNet := hmmap.Nginx | ||||
| 		if nginxNet == nil { | ||||
| 			return deps, fmt.Errorf("%w, nginx net info does not exist", ErrNetInfoNotFound) | ||||
| 		} | ||||
| @ -332,7 +332,7 @@ func initDeployers( | ||||
| 
 | ||||
| //nolint:funlen,mnd // TODO(rmanach): could be splitted | ||||
| func getSwarmServicesDetails(hm *models.HMMap) error { | ||||
| 	swarmNet := hm.GetSwarmNetInfo() | ||||
| 	swarmNet := hm.Swarm | ||||
| 	if swarmNet == nil { | ||||
| 		return fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound) | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										28
									
								
								models/hm.go
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								models/hm.go
									
									
									
									
									
								
							| @ -14,32 +14,8 @@ type HMNetInfo struct { | ||||
| 	} `json:"ssh,omitempty"` | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	HMVM  map[string]*HMNetInfo | ||||
| 	HMLXC map[string]*HMNetInfo | ||||
| ) | ||||
| 
 | ||||
| // HMMap handles all the informations of your home server instances. | ||||
| type HMMap struct { | ||||
| 	*HMNetInfo | ||||
| 	VM  HMVM  `json:"vm,omitempty"` | ||||
| 	LXC HMLXC `json:"lxc,omitempty"` | ||||
| } | ||||
| 
 | ||||
| func (hm *HMMap) GetSwarmNetInfo() *HMNetInfo { | ||||
| 	data, ok := hm.VM["swarm"] | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	return data | ||||
| } | ||||
| 
 | ||||
| func (hm *HMMap) GetNginxNetInfo() *HMNetInfo { | ||||
| 	data, ok := hm.LXC["nginx"] | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	return data | ||||
| 	Nginx *HMNetInfo `json:"nginx,omitempty"` | ||||
| 	Swarm *HMNetInfo `json:"swarm,omitempty"` | ||||
| } | ||||
|  | ||||
| @ -339,7 +339,7 @@ func (t *Table) Render() { | ||||
| 			) | ||||
| 		} | ||||
| 
 | ||||
| 		if idx+1 < len(t.rows) { | ||||
| 		if idx < len(t.rows) { | ||||
| 			if t.rows[idx].next != nil { | ||||
| 				table = append(table, strings.Join(lineParts, t.colSeparator)) | ||||
| 			} else { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user