detached db67c58

WIP

commit
db67c58b559d1662f8b05a981316b190973fb171
author
bnema · · 2023-09-06 19:43 UTC
parent
fa9fe90
signature
unsigned
4 files · +74 -8
M .env.example +1 -0
@@ -1,3 +1,4 @@
1+VERSION= VERSION OF THE APP
12 ENV=EITHER PRODUCTION OR DEVELOPMENT
23 LOG_LEVEL= DEBUG, INFO, WARN, ERROR
34 PORT= DEFAULT 1323
@@ -1,3 +1,4 @@
1+VERSION= VERSION OF THE APP
1 ENV=EITHER PRODUCTION OR DEVELOPMENT2 ENV=EITHER PRODUCTION OR DEVELOPMENT
2 LOG_LEVEL= DEBUG, INFO, WARN, ERROR3 LOG_LEVEL= DEBUG, INFO, WARN, ERROR
3 PORT= DEFAULT 13234 PORT= DEFAULT 1323
M pkg/docker/commands.go +50 -2
@@ -1,16 +1,19 @@
11 package docker
22
33 import (
4+ "bufio"
45 "context"
56 "fmt"
67 "io"
78 "os"
9+ "os/exec"
810
911 "github.com/docker/docker/api/types"
1012 "github.com/docker/docker/api/types/container"
1113 "github.com/docker/docker/client"
1214 "github.com/docker/docker/pkg/archive"
1315 "github.com/docker/docker/pkg/stdcopy"
16+ "gogs.bnema.dev/gordon-echo/pkg/utils"
1417 )
1518
1619 func DockertPullImageTest() {
@@ -144,7 +147,7 @@ func NetworkExists(name string) (bool, error) {
144147
145148 for _, network := range networks {
146149 if network.Name == name {
147- return true
150+ return true, nil
148151 }
149152 }
150153
@@ -152,7 +155,7 @@ func NetworkExists(name string) (bool, error) {
152155 }
153156
154157 // Create network as a bridge
155-func CreateNetwork(name string) error
158+func CreateNetwork(name string) error {
156159 ctx := context.Background()
157160 cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
158161 if err != nil {
@@ -167,4 +170,49 @@ func CreateNetwork(name string) error
167170 if err != nil {
168171 panic(err)
169172 }
173+
174+ return nil
175+}
176+
177+// CreateContainerFromComposeFile creates containers using docker compose based on the provided compose file.
178+func CreateContainerFromComposeFile(composeFilePath string, logger *utils.Logger) error {
179+ fmt.Println("Executing CreateContainerFromComposeFile()")
180+
181+ // Create and start containers using docker compose in the foreground
182+ cmd := exec.Command("docker", "compose", "-f", composeFilePath, "up")
183+
184+ // Get stdout and stderr pipes
185+ stdout, err := cmd.StdoutPipe()
186+ if err != nil {
187+ return fmt.Errorf("failed to get stdout pipe: %v", err)
188+ }
189+ stderr, err := cmd.StderrPipe()
190+ if err != nil {
191+ return fmt.Errorf("failed to get stderr pipe: %v", err)
192+ }
193+
194+ // Start the command
195+ if err := cmd.Start(); err != nil {
196+ return fmt.Errorf("failed to start docker compose: %v", err)
197+ }
198+
199+ // Stream stdout to logger with INFO level
200+ go streamToLogger(stdout, logger, utils.INFO)
201+ // Stream stderr to logger with ERROR level
202+ go streamToLogger(stderr, logger, utils.ERROR)
203+
204+ // Wait for the command to finish
205+ if err := cmd.Wait(); err != nil {
206+ return fmt.Errorf("docker compose command finished with error: %v", err)
207+ }
208+
209+ fmt.Println("Containers started successfully using docker compose")
210+ return nil
211+}
212+
213+func streamToLogger(r io.Reader, logger *utils.Logger, level utils.LogLevel) {
214+ scanner := bufio.NewScanner(r)
215+ for scanner.Scan() {
216+ logger.Log(level, scanner.Text())
217+ }
170218 }
@@ -1,16 +1,19 @@
1 package docker1 package docker
2 2
3 import (3 import (
4+ "bufio"
4 "context"5 "context"
5 "fmt"6 "fmt"
6 "io"7 "io"
7 "os"8 "os"
9+ "os/exec"
8 10
9 "github.com/docker/docker/api/types"11 "github.com/docker/docker/api/types"
10 "github.com/docker/docker/api/types/container"12 "github.com/docker/docker/api/types/container"
11 "github.com/docker/docker/client"13 "github.com/docker/docker/client"
12 "github.com/docker/docker/pkg/archive"14 "github.com/docker/docker/pkg/archive"
13 "github.com/docker/docker/pkg/stdcopy"15 "github.com/docker/docker/pkg/stdcopy"
16+ "gogs.bnema.dev/gordon-echo/pkg/utils"
14 )17 )
15 18
16 func DockertPullImageTest() {19 func DockertPullImageTest() {
@@ -144,7 +147,7 @@ func NetworkExists(name string) (bool, error) {
144 147
145 for _, network := range networks {148 for _, network := range networks {
146 if network.Name == name {149 if network.Name == name {
147- return true150+ return true, nil
148 }151 }
149 }152 }
150 153
@@ -152,7 +155,7 @@ func NetworkExists(name string) (bool, error) {
152 }155 }
153 156
154 // Create network as a bridge157 // Create network as a bridge
155-func CreateNetwork(name string) error158+func CreateNetwork(name string) error {
156 ctx := context.Background()159 ctx := context.Background()
157 cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())160 cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
158 if err != nil {161 if err != nil {
@@ -167,4 +170,49 @@ func CreateNetwork(name string) error
167 if err != nil {170 if err != nil {
168 panic(err)171 panic(err)
169 }172 }
173+
174+ return nil
175+}
176+
177+// CreateContainerFromComposeFile creates containers using docker compose based on the provided compose file.
178+func CreateContainerFromComposeFile(composeFilePath string, logger *utils.Logger) error {
179+ fmt.Println("Executing CreateContainerFromComposeFile()")
180+
181+ // Create and start containers using docker compose in the foreground
182+ cmd := exec.Command("docker", "compose", "-f", composeFilePath, "up")
183+
184+ // Get stdout and stderr pipes
185+ stdout, err := cmd.StdoutPipe()
186+ if err != nil {
187+ return fmt.Errorf("failed to get stdout pipe: %v", err)
188+ }
189+ stderr, err := cmd.StderrPipe()
190+ if err != nil {
191+ return fmt.Errorf("failed to get stderr pipe: %v", err)
192+ }
193+
194+ // Start the command
195+ if err := cmd.Start(); err != nil {
196+ return fmt.Errorf("failed to start docker compose: %v", err)
197+ }
198+
199+ // Stream stdout to logger with INFO level
200+ go streamToLogger(stdout, logger, utils.INFO)
201+ // Stream stderr to logger with ERROR level
202+ go streamToLogger(stderr, logger, utils.ERROR)
203+
204+ // Wait for the command to finish
205+ if err := cmd.Wait(); err != nil {
206+ return fmt.Errorf("docker compose command finished with error: %v", err)
207+ }
208+
209+ fmt.Println("Containers started successfully using docker compose")
210+ return nil
211+}
212+
213+func streamToLogger(r io.Reader, logger *utils.Logger, level utils.LogLevel) {
214+ scanner := bufio.NewScanner(r)
215+ for scanner.Scan() {
216+ logger.Log(level, scanner.Text())
217+ }
170 }218 }
M pkg/scripts/install-traefik.go +20 -3
@@ -36,7 +36,6 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
3636
3737 // Setup the TXT renderer for traefik-compose.goyml
3838 rendererCompose, err := templating.GetTXTRenderer("traefik-compose.goyml", modelFS, logger)
39- fmt.Println("rendererCompose=", rendererCompose)
4039 if err != nil {
4140 return err
4241 }
@@ -45,7 +44,6 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
4544 composeContent, err := rendererCompose.TXTRender(map[string]string{
4645 "topdomain": topDomain,
4746 })
48- fmt.Println("composeContent=", composeContent)
4947 if err != nil {
5048 return err
5149 }
@@ -89,7 +87,26 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
8987 // Ensure that the network "exposed" exists if not create it
9088 exists, err := docker.NetworkExists("exposed")
9189 if err != nil {
92- // handle the error
90+ return err
91+ }
92+ if exists {
93+ fmt.Println("Network Exposed found")
94+ } else {
95+ fmt.Println("Network Exposed not found, creating it")
96+ if err := docker.CreateNetwork("exposed"); err != nil {
97+ return err
98+ }
99+ }
100+
101+ fmt.Println("Network created successfully")
102+
103+ // Create the containers with CreateContainerFromComposeFile
104+ if err := docker.CreateContainerFromComposeFile(path+"traefik/docker-compose.yml", logger); err != nil {
105+ return err
93106 }
94107
108+ fmt.Println("Containers created successfully")
109+
110+ return nil
111+
95112 }
@@ -36,7 +36,6 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
36 36
37 // Setup the TXT renderer for traefik-compose.goyml37 // Setup the TXT renderer for traefik-compose.goyml
38 rendererCompose, err := templating.GetTXTRenderer("traefik-compose.goyml", modelFS, logger)38 rendererCompose, err := templating.GetTXTRenderer("traefik-compose.goyml", modelFS, logger)
39- fmt.Println("rendererCompose=", rendererCompose)
40 if err != nil {39 if err != nil {
41 return err40 return err
42 }41 }
@@ -45,7 +44,6 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
45 composeContent, err := rendererCompose.TXTRender(map[string]string{44 composeContent, err := rendererCompose.TXTRender(map[string]string{
46 "topdomain": topDomain,45 "topdomain": topDomain,
47 })46 })
48- fmt.Println("composeContent=", composeContent)
49 if err != nil {47 if err != nil {
50 return err48 return err
51 }49 }
@@ -89,7 +87,26 @@ func CreateYAMLFiles(topDomain, adminEmail string, logger *utils.Logger) error {
89 // Ensure that the network "exposed" exists if not create it87 // Ensure that the network "exposed" exists if not create it
90 exists, err := docker.NetworkExists("exposed")88 exists, err := docker.NetworkExists("exposed")
91 if err != nil {89 if err != nil {
92- // handle the error90+ return err
91+ }
92+ if exists {
93+ fmt.Println("Network Exposed found")
94+ } else {
95+ fmt.Println("Network Exposed not found, creating it")
96+ if err := docker.CreateNetwork("exposed"); err != nil {
97+ return err
98+ }
99+ }
100+
101+ fmt.Println("Network created successfully")
102+
103+ // Create the containers with CreateContainerFromComposeFile
104+ if err := docker.CreateContainerFromComposeFile(path+"traefik/docker-compose.yml", logger); err != nil {
105+ return err
93 }106 }
94 107
108+ fmt.Println("Containers created successfully")
109+
110+ return nil
111+
95 }112 }
M pkg/templating/models/traefik-compose.goyml +3 -3
@@ -10,9 +10,9 @@ services:
1010 - "443:443"
1111 volumes:
1212 - /var/run/docker.sock:/var/run/docker.sock:ro
13- - traefik.yml:/etc/traefik/traefik.yml
14- - traefik/volume/acme.json:/acme.json
15- - traefik/volume/traefik.log:/var/log/traefik/traefik.log
13+ - ./traefik.yml:/etc/traefik/traefik.yml
14+ - ./traefik/volume/acme.json:/acme.json
15+ - ./traefik.log:/var/log/traefik/traefik.log
1616 labels:
1717 - "traefik.enable=true"
1818 - "traefik.http.routers.api.rule=Host(`traefik.{{ .topdomain }}`)"
@@ -10,9 +10,9 @@ services:
10 - "443:443"10 - "443:443"
11 volumes:11 volumes:
12 - /var/run/docker.sock:/var/run/docker.sock:ro12 - /var/run/docker.sock:/var/run/docker.sock:ro
13- - traefik.yml:/etc/traefik/traefik.yml13+ - ./traefik.yml:/etc/traefik/traefik.yml
14- - traefik/volume/acme.json:/acme.json14+ - ./traefik/volume/acme.json:/acme.json
15- - traefik/volume/traefik.log:/var/log/traefik/traefik.log15+ - ./traefik.log:/var/log/traefik/traefik.log
16 labels:16 labels:
17 - "traefik.enable=true"17 - "traefik.enable=true"
18 - "traefik.http.routers.api.rule=Host(`traefik.{{ .topdomain }}`)"18 - "traefik.http.routers.api.rule=Host(`traefik.{{ .topdomain }}`)"

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close