Compare commits

..

No commits in common. "develop" and "main" have entirely different histories.

11 changed files with 93 additions and 50 deletions

View File

@ -3,10 +3,10 @@ BIN_INSTALL = $(shell whereis $(BIN_NAME) | cut -d ' ' -f2)
VERSION = 0.1.1
run: check
run: lint
@go run main.go
build: check
build: lint
@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
check:
lint:
@echo "format and lint..."
@golangci-lint fmt ./...
@golangci-lint run ./...

View File

@ -38,27 +38,51 @@ 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
{
"swarm": {
"ip": "<swarm-ip>",
"ssh": {
"user": "<ssh-user>",
"privkey": "<path-to-ssh-private-key>",
"port": <swarm-ssh-port>
"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": {
"user": "<ssh-user>",
"privkey": "<path-to-ssh-private-key>",
"port": <swarm-ssh-port>
}
}
},
"nginx": {
"ip": "<nginx-ip>",
"web_url": "https://<nginx-ip>",
"ssh": {
"user": "<ssh-user>",
"privkey": "<path-to-ssh-private-key>",
"port": <nginx-ssh-port>
}
}
"lxc": {
"nginx": {
"ip": "<nginx-ip>",
"web_url": "https://<nginx-ip>",
"ssh": {
"user": "<ssh-user>",
"privkey": "<path-to-ssh-private-key>",
"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
{
@ -87,7 +111,7 @@ If you have a Docker registry with the target image available, you can thus leav
* Clone the repository
```bash
git clone https://gitea.sonak.fr/rmanach/hmdeploy
git clone https://gitea.thegux.fr/rmanach/hmdeploy
```
* Install the binary
```bash
@ -100,7 +124,7 @@ The binary is then installed in your **$GOPATH/bin**.
hmdeploy --help
Usage of hmdeploy:
-config string
define the configuration directory (default "/home/<user>/.homeserver")
define the configuration directory (default "/home/romain/.homeserver")
-confirm
do not ask for confirmation, you're the best, you don't need confirmation
-debug

View File

@ -9,8 +9,8 @@ import (
"sync/atomic"
"time"
"gitea.sonak.fr/hmdeploy/connection"
"gitea.sonak.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/models"
"github.com/rs/zerolog/log"
)

View File

@ -5,8 +5,8 @@ import (
"fmt"
"path/filepath"
"gitea.sonak.fr/hmdeploy/models"
"gitea.sonak.fr/hmdeploy/utils"
"gitea.thegux.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/utils"
"github.com/rs/zerolog/log"
)

View File

@ -7,10 +7,10 @@ import (
"os"
"path/filepath"
"gitea.sonak.fr/hmdeploy/connection"
"gitea.sonak.fr/hmdeploy/docker"
"gitea.sonak.fr/hmdeploy/models"
"gitea.sonak.fr/hmdeploy/utils"
"gitea.thegux.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/docker"
"gitea.thegux.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/utils"
"github.com/rs/zerolog/log"
)

View File

@ -11,8 +11,8 @@ import (
"sync"
"time"
"gitea.sonak.fr/hmdeploy/connection"
"gitea.sonak.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/models"
"github.com/rs/zerolog/log"
)

View File

@ -188,11 +188,6 @@ 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{
@ -204,7 +199,7 @@ func (s *Service) UnmarshalJSON(data []byte) error {
Tag string
}{
Name: imageName,
Tag: tag,
Tag: imageNameParts[1],
},
Networks: networks,
Ports: ci.Details[0].Endpoint.Ports,

2
go.mod
View File

@ -1,4 +1,4 @@
module gitea.sonak.fr/hmdeploy
module gitea.thegux.fr/hmdeploy
go 1.23.0

20
main.go
View File

@ -13,11 +13,11 @@ import (
"strings"
"sync"
"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"
"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"
"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.sd.Build)
rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.sd.Deploy))
rootTask := scheduler.NewTask("swarm-build", d.nd.Build)
rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.nd.Deploy))
tasks = append(tasks, rootTask)
return tasks
@ -293,7 +293,7 @@ func initDeployers(
}
if !opt.noSwarm && project.GetComposePath() != "" {
swarmNet := hmmap.Swarm
swarmNet := hmmap.GetSwarmNetInfo()
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.Nginx
nginxNet := hmmap.GetNginxNetInfo()
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.Swarm
swarmNet := hm.GetSwarmNetInfo()
if swarmNet == nil {
return fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound)
}

View File

@ -14,8 +14,32 @@ 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 {
Nginx *HMNetInfo `json:"nginx,omitempty"`
Swarm *HMNetInfo `json:"swarm,omitempty"`
*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
}

View File

@ -339,7 +339,7 @@ func (t *Table) Render() {
)
}
if idx < len(t.rows) {
if idx+1 < len(t.rows) {
if t.rows[idx].next != nil {
table = append(table, strings.Join(lineParts, t.colSeparator))
} else {