diff --git a/srcs/cmd/vsftpd/entrypoint/entrypoint.go b/srcs/cmd/vsftpd/entrypoint/entrypoint.go index 553166a..8163458 100644 --- a/srcs/cmd/vsftpd/entrypoint/entrypoint.go +++ b/srcs/cmd/vsftpd/entrypoint/entrypoint.go @@ -1,21 +1,56 @@ package main import ( + "bytes" "os" "fmt" "log" "os/exec" + "git.keyzox.me/42_adjoly/inception/internal/cmd" + "git.keyzox.me/42_adjoly/inception/internal/env" _log "git.keyzox.me/42_adjoly/inception/internal/log" ) +func configFtp() { + _log.Log("note", "Configuring VSFTPD...") + ftpUser := env.FileEnv("FTP_USER", "ftp") + ftpPass := env.FileEnv("FTP_PASS", "ftppass") + cmd.ExecCmd([]string{"adduser", ftpUser, "--disabled-password"}) + + var stdin bytes.Buffer + stdin.WriteString(fmt.Sprintf("%s:%s", ftpUser, ftpPass)) + + cmd := exec.Command("/usr/sbin/chpasswd") + cmd.Stdin = &stdin + err := cmd.Run() + if err != nil { + log.Fatal(err) + } + + _, err = os.Create("/etc/vsftpd.check") + if err != nil { + log.Fatal("could not create check file :O") + } + os.WriteFile("/etc/vsftpd/vsftpd.userlist", []byte(ftpUser), 0766) + + _log.Log("note", "VSFTPD configured ;D") +} + func main() { args := os.Args if args[1] == "vsftpd" { _log.Log("note", "Entrypoint script for VSFTPD Server started") + _, err := os.ReadFile("/etc/vsftpd.check") + if err != nil { + configFtp() + } else { + _log.Log("note", "VSFTPD already configured, skipping...") + } + dir, err := os.ReadDir("/docker-entrypoint.d") if err != nil { log.Fatal(err) @@ -40,8 +75,7 @@ func main() { cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin if err := cmd.Run(); err != nil { - fmt.Printf("Error running NGINX: %v\n", err) + fmt.Printf("Error running VSFTPD: %v\n", err) os.Exit(1) } - } diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 36b802f..7731cee 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -9,9 +9,6 @@ networks: inception: external: false -include: - - docker/bonus/compose.yml - services: nginx: container_name: inception-nginx @@ -85,3 +82,33 @@ services: volumes: - wp-db:/var/lib/mysql restart: unless-stopped + + ftp: + build: + context: . + dockerfile: docker/bonus/vsftpd/Dockerfile + ports: + - 2100:2100 + - 30000-30100:30000-30100 + volumes: + - wp-site:/var/ftp + environment: + - FTP_USER=kanel + - FTP_PASS=legoat + depends_on: + nginx: + condition: service_started + wordpress-php: + condition: service_healthy + + static-site: + build: docker/bonus/static-site + ports: + - 8080:443 + depends_on: + - nginx + environment: + - TZ=Europe/Paris + - NGINX_SSL_KEY_FILE=/etc/nginx/ssl/kanel-wp.key + - NGINX_SSL_CERT_FILE=/etc/nginx/ssl/kanel-wp.crt + diff --git a/srcs/docker/bonus/compose.yml b/srcs/docker/bonus/compose.yml deleted file mode 100644 index d8c07ea..0000000 --- a/srcs/docker/bonus/compose.yml +++ /dev/null @@ -1,22 +0,0 @@ -services: - static-site: - build: static-site - ports: - - 8080:443 - depends_on: - - nginx - environment: - - TZ=Europe/Paris - - NGINX_SSL_KEY_FILE=/etc/nginx/ssl/kanel-wp.key - - NGINX_SSL_CERT_FILE=/etc/nginx/ssl/kanel-wp.crt - ftp: - build: vsftp - ports: - - 2100:21 - - 30000-30100:30000-30100 - depends_on: - nginx: - condition: service_started - wordpress-php: - condition: service_healthy - diff --git a/srcs/docker/bonus/vsftpd/Dockerfile b/srcs/docker/bonus/vsftpd/Dockerfile index 9f1580a..bfcbb20 100644 --- a/srcs/docker/bonus/vsftpd/Dockerfile +++ b/srcs/docker/bonus/vsftpd/Dockerfile @@ -1,11 +1,39 @@ -FROM inception-nginx +FROM scratch as builder +ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / + +RUN apk add --no-cache go + +WORKDIR /build + +COPY go.mod /build/go.mod +COPY cmd /build/cmd +COPY internal /build/internal + +RUN cd /build \ + && go build git.keyzox.me/42_adjoly/inception/cmd/vsftpd/entrypoint + +FROM scratch +ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / LABEL maintainer="KeyZox" LABEL version="0.1" -RUN apk add vsftpd +COPY --from=builder /build/entrypoint /docker-entrypoint +COPY docker/bonus/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf + +RUN apk add vsftpd \ + && mkdir -p /var/ftp \ + && mkdir -p /docker-entrypoint.d + +VOLUME /var/ftp + + +ENTRYPOINT [ "/docker-entrypoint" ] +WORKDIR /etc/vsftpd EXPOSE 21 EXPOSE 30000-30100 -CMD [ "vsftpd" ] +STOPSIGNAL SIGQUIT + +CMD [ "vsftpd", "/etc/vsftpd/vsftpd.conf" ] diff --git a/srcs/docker/bonus/vsftpd/vsftpd.conf b/srcs/docker/bonus/vsftpd/vsftpd.conf index b7e21eb..ec0cf12 100644 --- a/srcs/docker/bonus/vsftpd/vsftpd.conf +++ b/srcs/docker/bonus/vsftpd/vsftpd.conf @@ -9,10 +9,10 @@ ftpd_banner=Welcome to your WordPress FTP server. chroot_local_user=YES allow_writeable_chroot=YES user_sub_token=$USER -local_root=/var/www/wordpress +local_root=/var/ftp listen=YES -listen_port=21 +listen_port=2100 listen_address=0.0.0.0 seccomp_sandbox=NO diff --git a/srcs/docker/mariadb/Dockerfile b/srcs/docker/mariadb/Dockerfile index 7e5d081..832ebe0 100644 --- a/srcs/docker/mariadb/Dockerfile +++ b/srcs/docker/mariadb/Dockerfile @@ -1,3 +1,18 @@ +FROM scratch AS builder +ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / + +RUN apk add go + +WORKDIR /build + +COPY go.mod /build/go.mod +COPY cmd /build/cmd +COPY internal /build/internal + +RUN cd /build \ + && go build git.keyzox.me/42_adjoly/inception/cmd/mariadb/entrypoint \ + && go build git.keyzox.me/42_adjoly/inception/cmd/mariadb/healthcheck + FROM scratch ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / @@ -7,6 +22,9 @@ LABEL maintainer="KeyZox" RUN addgroup mysql \ && adduser -S -G mysql mysql -h /var/lib/mysql +COPY --from=builder /build/entrypoint /docker-entrypoint +COPY --from=builder /build/healthcheck /docker-healthcheck + RUN mkdir /build COPY go.mod /build/go.mod @@ -14,18 +32,12 @@ COPY cmd /build/cmd COPY internal /build/internal RUN apk add --no-cache go mariadb tzdata mariadb-client \ - && cd /build \ - && go build git.keyzox.me/42_adjoly/inception/cmd/mariadb/entrypoint \ - && go build git.keyzox.me/42_adjoly/inception/cmd/mariadb/healthcheck \ - && cp /build/entrypoint /docker-entrypoint \ - && cp /build/healthcheck /docker-healthcheck \ && chmod +x /docker-healthcheck \ && chmod +x /docker-entrypoint \ && apk del go \ && mkdir -p /etc/mysql/conf.d /etc/mysql/mariadb.conf.d/ /run/mariadb /run/mysqld \ && chmod ugo+rwx,o+t /run/mariadb \ && chown -R mysql:mysql /var/lib/mysql /run/mariadb /run/mysqld \ - && rm -Rf /build \ && rm -rf /var/cache/apk/* ENV LANG=C.UTF-8 @@ -39,4 +51,4 @@ WORKDIR /var/lib/mysql EXPOSE 3306 CMD [ "mariadbd", "--user=mysql" ] -HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=3s --start-interval=2s CMD /docker-healthcheck +HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=1s --start-interval=2s CMD /docker-healthcheck diff --git a/srcs/docker/nginx/Dockerfile b/srcs/docker/nginx/Dockerfile index e1f8378..adef5a9 100644 --- a/srcs/docker/nginx/Dockerfile +++ b/srcs/docker/nginx/Dockerfile @@ -1,26 +1,34 @@ +FROM scratch AS builder +ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / + +RUN apk add --no-cache go + +WORKDIR /build + +COPY go.sum /build/go.sum +COPY go.mod /build/go.mod +COPY cmd /build/cmd +COPY internal /build/internal + +RUN cd /build \ + && go get git.keyzox.me/42_adjoly/inception/cmd/nginx/entrypoint \ + && go build git.keyzox.me/42_adjoly/inception/cmd/nginx/entrypoint + FROM scratch ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / LABEL version="0.1" LABEL maintainer="KeyZox" -COPY go.mod /build/go.mod -COPY cmd /build/cmd -COPY internal /build/internal +COPY --from=builder /build/entrypoint /docker-entrypoint RUN set -x \ && addgroup -g 101 -S nginx\ && adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \ - && apk add --no-cache go nginx openssl tzdata envsubst curl \ - && cd /build \ - && go get git.keyzox.me/42_adjoly/inception/cmd/nginx/entrypoint \ - && go build git.keyzox.me/42_adjoly/inception/cmd/nginx/entrypoint \ - && cp /build/entrypoint /docker-entrypoint \ + && apk add --no-cache nginx openssl tzdata envsubst curl \ && chmod +x /docker-entrypoint \ - && apk del go \ && ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log \ - && rm -Rf /build \ && rm -rf /var/cache/apk/* \ && mkdir -p /var/www/html \ && mkdir -p /etc/nginx/conf.d \ diff --git a/srcs/docker/wordpress/Dockerfile b/srcs/docker/wordpress/Dockerfile index afe7426..c0dd860 100644 --- a/srcs/docker/wordpress/Dockerfile +++ b/srcs/docker/wordpress/Dockerfile @@ -1,32 +1,39 @@ +FROM scratch AS builder +ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / + +RUN apk add go + +WORKDIR /build + +COPY go.mod /build/go.mod +COPY cmd /build/cmd +COPY internal /build/internal + +RUN cd /build \ + && go build git.keyzox.me/42_adjoly/inception/cmd/wordpress/entrypoint + FROM scratch ADD docker/alpine/alpine-minirootfs-3.21.2-x86_64.tar.gz / LABEL version="0.1" LABEL maintainer="KeyZox" -RUN set -x \ - && adduser -u 82 -D -S -G www-data www-data - -COPY go.mod /build/go.mod -COPY cmd /build/cmd -COPY internal /build/internal +COPY --from=builder /build/entrypoint /docker-entrypoint COPY docker/wordpress/www-docker.conf /www-docker.conf -RUN apk add --no-cache go curl tzdata fcgi \ +RUN set -x \ + && adduser -u 82 -D -S -G www-data www-data \ + && apk add --no-cache curl tzdata fcgi \ php84-phar php84-xml php84-curl php84-zip \ php84-intl php84-mbstring php84-iconv \ php84 php84-mysqli php84-fpm php84-json \ php84-zlib php84-session php84-dom \ php84-xmlreader php84-pdo php84-gd \ php84-opcache php84-ctype \ - && cd /build \ && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \ && chmod +x wp-cli.phar \ && mv wp-cli.phar /usr/local/bin/wp \ - && go build git.keyzox.me/42_adjoly/inception/cmd/wordpress/entrypoint \ - && cp /build/entrypoint /docker-entrypoint \ && chmod +x /docker-entrypoint \ - && apk del go \ && rm -Rf /build \ && mkdir /docker-entrypoint.d diff --git a/srcs/internal/cmd/cmd.go b/srcs/internal/cmd/cmd.go new file mode 100644 index 0000000..eff3c20 --- /dev/null +++ b/srcs/internal/cmd/cmd.go @@ -0,0 +1,19 @@ +package cmd + +import ( + "os" + "os/exec" + + _log "git.keyzox.me/42_adjoly/inception/internal/log" +) + +func ExecCmd(cmdStr []string) { + cmd := exec.Command(cmdStr[0], cmdStr...) + cmd.Env = os.Environ() + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Stdin = os.Stdin + if err := cmd.Run(); err != nil { + _log.Log("error", "Could not execute : " + cmdStr[0]) + } +}