Your Goto toolbox Linux image for Dev/Back Ops powered with lots of tools.
3.4K
BackOps is your Goto toolbox Linux image for Dev/Back Ops powered with lots of tools.
Some apps are commented out in Dockerfile, if you need them, you uncomment and build it.
Example .toolboxrc (https://github.com/flatcar-linux/toolbox)
TOOLBOX_DOCKER_IMAGE=ethraza/backops
TOOLBOX_USER=sailor
TOOLBOX_BIND="--bind=/:/media/root --bind=/usr:/media/root/usr --bind=/run:/media/root/run --bind=/sys/fs/bpf:/sys/fs/bpf --bind=/var/run/docker.sock:/var/run/docker.sock"
Example docker-compose-swarm.yml
version: '3.8'
services:
bops:
image: ethraza/backops:latest
command:
- bash
- -c
- |
/home/sailor/bin/gen-certs.sh
build:
context: /var/apps/backops/docker/backops
dockerfile: Dockerfile
container_name: back-ops
hostname: bops.${HOSTNAME} # .{{.Node.Hostname}}
privileged: true
pid: "host"
network_mode: "host" # https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode - usar docker-compose up -d
deploy:
mode: replicated
replicas: 1
placement:
max_replicas_per_node: 1
constraints:
# - "node.hostname == {{.Node.Hostname}}"
- "node.role == manager"
preferences:
- spread: node.labels.admin
# ports:
# - target: 22
# published: 2222
# protocol: tcp
# mode: ingress
# - target: 8090
# published: 8090
# protocol: tcp
# mode: ingress
environment:
# X_NODE_ID: '{{.Node.ID}}'
# X_NODE_HOSTNAME: '{{.Node.Hostname}}'
# X_NODE_PLATFORM: '{{.Node.Platform}}'
# X_NODE_PLATFORM_ARCHITECTURE: '{{.Node.Platform.Architecture}}'
# X_NODE_PLATFORM_OS: '{{.Node.Platform.OS}}'
# X_SERVICE_ID: '{{.Service.ID}}'
# X_SERVICE_NAMES: '{{.Service.Name}}'
# X_SERVICE_LABELS: '{{.Service.Labels}}'
# X_SERVICE_LABEL_STACK_NAMESPACE: '{{index .Service.Labels "com.docker.stack.namespace"}}'
# X_SERVICE_LABEL_STACK_IMAGE: '{{index .Service.Labels "com.docker.stack.image"}}'
# X_SERVICE_LABEL_CUSTOM: '{{index .Service.Labels "service.label"}}'
# X_TASK_ID: '{{.Task.ID}}'
# X_TASK_NAME: '{{.Task.Name}}'
# X_TASK_SLOT: '{{.Task.Slot}}'
# X_IP: '{{.Swarm.NodeAddr}}'
# BOPS_CRON: "on"
# BOPS_DIUN: "on"
# BOPS_GITEA: "on"
# BOPS_SWARMCRONJOB: "on"
BOPS_MSMTP: "on"
BOPS_SSH: "on"
GOTTY_PORT: 8090
# GOTTY_TLS_CRT: "/home/sailor/.lego/certificates/bops.${HOSTNAME}.crt" # {{.Node.Hostname}}.crt"
# GOTTY_TLS_KEY: "/home/sailor/.lego/certificates/bops.${HOSTNAME}.key" # {{.Node.Hostname}}.key"
GOTTY_CREDENTIAL: "admin:adminpass"
SAILOR_PASSWORD: "sailor:sailorpass"
REMOTE_HOST: "${HOSTNAME}" # "{{.Node.Hostname}}"
REMOTE_USER: "core"
REMOTE_PORT: 22
DOCKER_HOST: "ssh://core@${HOSTNAME}" # {{.Node.Hostname}}"
extra_hosts:
- "flatcar:192.168.0.10"
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/lib/docker/volumes:/var/lib/docker/volumes:ro
- /backops/docker/backops/etc/cron.d:/etc/cron.d
- /backops/docker/backops/etc/ssh/ssh_config:/etc/ssh/ssh_config:ro
- /backops/docker/backops/etc/ssh/sshd_config:/etc/ssh/sshd_config:ro
- /backops/docker/backops/etc/msmtprc:/etc/msmtprc:ro
- /backops/docker/backops/etc/vim/vimrc.local:/etc/vim/vimrc.local
- /backops/docker/backops/etc/diun:/etc/diun
- /backops/docker/backops/home/sailor:/home/sailor
- /mnt:/mnt
- /tmp:/tmp
# networks:
# - default
# networks:
# default:
# external: true
Dockerfile:
FROM debian:stable-slim
LABEL maintainer="Allan Brazute <[email protected]>"
LABEL description="BackOps is your Goto toolbox Linux image for Dev/Back Ops powered with lots of tools."
EXPOSE 22 8090
ARG DEBIAN_FRONTEND=noninteractive
ENV HOSTNAME="bops"
ENV TERM=xterm
ENV USER=sailor
ENV GITEA_CUSTOM=/var/lib/gitea
ENV GITEA_WORK_DIR=/var/lib/gitea/
ENV REMOTE_HOST=flatcar
ENV REMOTE_USER=root
ENV REMOTE_PORT=22
ENV DOCKER_HOST="ssh://core@flatcar"
RUN groupadd -g 1000 sailor && \
groupadd -g 500 core && \
groupadd -g 472 grafana && \
groupadd -g 233 docker
RUN apt-get -y update && apt-get -y install --no-install-recommends \
2ping \
7zip \
ansible \
apt-transport-https \
aria2 \
bash-completion \
btop \
busybox-static \
busybox-syslogd \
# bzip2 \
ca-certificates \
## closure-linter \
# cron \
curl \
# dnstop \
# dnstracer \
# dnsutils \
# docker.io \
duc \
ethtool \
file \
fuse \
lftp \
lsb-release \
gettext \
git \
gnupg \
htop \
inotify-tools \
iotop \
iperf3 \
iproute2 \
iputils-ping \
jnettop \
jq \
libatomic1 \
libconfig-inifiles-perl \
libdbd-mysql-perl \
libdbi-perl \
libpam-modules \
libterm-readkey-perl \
libxml2-utils \
locales \
logrotate \
lz4 \
mariadb-client \
mbuffer \
msmtp-mta \
# mydumper \
mosh \
ncat \
ncdu \
ncurses-term \
# net-tools \
nmap \
nodejs \
# npm \
openssh-server \
openssl \
otp \
parallel \
parted \
p7zip-full \
pbzip2 \
php-cli \
pigz \
pv \
# procps \
# https://www.debian.org/mirror/push_server.html
rsync \
s6 \
shellcheck \
# software-properties-common \
speedtest-cli \
# sqlite \
sudo \
supervisor \
tidy \
tmux \
# traceroute \
tzdata \
unzip \
vim \
vim-fugitive \
vim-lastplace \
vim-scripts \
vim-syntastic \
# vim-syntax-docker \
vim-tabular \
vim-voom \
vim-youcompleteme \
# wget \
xfsprogs \
# xz-utils \
zarchive-tools \
zip \
zst \
zstd && \
/bin/busybox --install
RUN useradd -m -u 1000 -s /bin/bash -c "Stevedore" -g sailor sailor -G adm,backup,core,disk,docker,grafana,lp,mail,news,nogroup,operator,root,staff,sudo,tape,tty,users,www-data && \
echo "sailor:sailor" | chpasswd && \
echo "alias ls='ls -F --show-control-chars --color=auto'\\nalias l='ls -lAFrt'\\nalias la='ls -la'\\nalias ll='eza -lhaF'\\nalias lls='eza -lAFrt'\\nalias rm='rm -i'" | tee /etc/profile.d/aliases.sh && \
chmod 755 /etc/profile.d/aliases.sh && \
echo "PATH=\$PATH:/sbin:/go/bin/:/home/sailor/bin" | tee /etc/profile.d/add2path.sh && \
chmod 755 /etc/profile.d/add2path.sh && \
echo "source /etc/profile" | tee -a /root/.profile && \
echo "source /etc/profile" | tee -a /home/sailor/.profile && \
echo "Banner /etc/ssh/banner.txt" | tee -a /etc/ssh/sshd_config && \
echo '\nif [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then . "$i"; fi; done; unset i; fi\n' | tee -a /etc/bash.bashrc && \
sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen && \
LANG=en_US.UTF-8
# Go lang
RUN curl https://getcroc.schollz.com | bash
RUN wget https://github.com/coreos/container-linux-config-transpiler/releases/download/v0.9.0/ct-v0.9.0-x86_64-unknown-linux-gnu -O /usr/local/bin/ct && \
chmod 755 /usr/local/bin/ct
RUN wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop && \
chmod 755 /usr/local/bin/ctop
RUN ACC="crazy-max"; APP="diun"; FLN="linux_amd64.tar.gz"; \
DIR="--strip-components=1 ./"; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN wget --no-check-certificate https://downloads.dockerslim.com/releases/latest/dist_linux.tar.gz -O - | tar --strip-components 1 -C /usr/local/bin/ -xzf -
RUN ACC="kopia"; APP="kopia"; FLN="linux-x64.tar.gz"; \
DIR="--strip-components=1 "; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
APP=""; curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN curl -sSf https://moncho.github.io/dry/dryup.sh | sh && \
chmod 755 /usr/local/bin/dry
RUN wget https://github.com/tianon/gosu/releases/latest/download/gosu-amd64 -O /usr/local/bin/gosu && \
chmod 755 /usr/local/bin/gosu
RUN ACC="sorenisanerd"; APP="gotty"; FLN="linux_amd64.tar.gz"; \
DIR="--strip-components=1 ./"; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /home/sailor/.gotty.key -out /home/sailor/.gotty.crt
# RUN curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
RUN ACC="go-acme"; APP="lego"; FLN="linux_amd64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN wget https://github.com/tdewolff/minify/releases/latest/download/minify_linux_amd64.tar.gz -O - | tar -C /usr/local/bin/ -xzf - minify
RUN curl https://rclone.org/install.sh | bash
RUN ACC="msoap"; APP="shell2http"; FLN="linux_amd64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
# RUN wget https://github.com/crazy-max/swarm-cronjob/releases/download/v1.9.0/swarm-cronjob_1.9.0_linux_x86_64.tar.gz -O - | tar -C /usr/local/bin/ -xzf - swarm-cronjob
RUN wget https://github.com/skx/sysbox/releases/latest/download/sysbox-linux-amd64 -O /usr/local/bin/sysbox && \
chmod 755 /usr/local/bin/sysbox && \
/usr/local/bin/sysbox bash-completion > /etc/bash_completion.d/sysbox
RUN ACC="adnanh"; APP="webhook"; FLN="linux-amd64.tar.gz"; \
DIR="--strip-components=1 webhook-linux-amd64/"; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN ACC="digitalocean"; APP="doctl"; FLN="linux-amd64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN ACC="peak"; APP="s5cmd"; FLN="Linux-64bit.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN wget https://github.com/elisescu/tty-share/releases/latest/download/tty-share_linux-amd64 -O /usr/local/bin/tty-share && \
chmod 755 /usr/local/bin/tty-share
RUN curl -sSL https://raw.githubusercontent.com/aandrew-me/tgpt/main/install | bash -s /usr/local/bin
RUN ACC="vultr"; APP="vultr-cli"; FLN="linux_amd64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | DIR=/usr/local/bin bash
RUN wget https://github.com/derailed/k9s/releases/latest/download/k9s_linux_amd64.deb && apt install ./k9s_linux_amd64.deb && rm k9s_linux_amd64.deb
RUN curl -sL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
RUN ACC="jesseduffield"; APP="lazygit"; FLN="linux_x86_64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
RUN curl -sL https://raw.githubusercontent.com/TNK-Studio/lazykube/main/scripts/install_update_linux.sh | sed '/^PROXY=/ s|=.*|=""|' | DIR=/usr/local/bin bash
RUN ACC="jorgerojas26"; APP="lazysql"; FLN="Linux_x86_64.tar.gz"; \
DIR=""; DEST="/usr/local/bin"; \
URL=$(curl -sL "https://api.github.com/repos/${ACC}/${APP}/releases/latest" | grep "browser_download_url" | grep "${FLN}" | cut -d '"' -f 4) && \
curl -sL "${URL}" | tar -C ${DEST} -xzf - ${DIR}${APP} && \
echo "${ACC}/${APP} installed."
# Other langs
RUN curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
RUN wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -O /tmp/awscliv2.zip && \
unzip /tmp/awscliv2.zip -d /tmp/ && \
/tmp/aws/install -i /usr/local/aws-cli -b /usr/local/bin && \
rm -rf /tmp/aws /tmp/awscliv2.zip
# RUN wget https://github.com/borgbackup/borg/releases/latest/download/borg-linux64 -O /usr/local/bin/borg && \
# chmod 755 /usr/local/bin/borg
RUN wget https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -O /etc/bash_completion.d/docker.sh
RUN wget https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 -O /usr/local/bin/docker-compose && \
chmod 755 /usr/local/bin/docker-compose && \
wget https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose -O /etc/bash_completion.d/docker-compose.sh
RUN wget https://raw.githubusercontent.com/flatcar-linux/init/flatcar-master/bin/flatcar-install -O /usr/local/bin/flatcar-install.sh && \
chmod 755 /usr/local/bin/flatcar-install.sh
# Deb
RUN install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null && \
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list && \
# apt-get -y remove docker docker-engine docker.io containerd runc && \
apt-get -y update && apt-get -y -f install --no-install-recommends \
dialog \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
eza \
kubecolor kubectx kubernetes-client kubernetes-split-yaml kubetail \
# mysql-client \
# mysql-shell \
terraform \
tini \
&& \
apt-get -y clean && \
apt-get -y autoclean && \
apt-get -y autoremove && \
rm -rf /var/lib/apt/lists/*
RUN set -x; cd "$(mktemp -d)" && \
OS="$(uname | tr '[:upper:]' '[:lower:]')" && \
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" && \
KREW="krew-${OS}_${ARCH}" && \
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" && \
tar zxvf "${KREW}.tar.gz" && \
./"${KREW}" install krew
RUN mkdir /etc/rsyncd.d && touch /etc/rsyncd.secrets
COPY ./etc/rsyncd.conf /etc/
COPY ./etc/ssh/banner.txt /etc/ssh/
COPY ./entrypoint.sh /
ENTRYPOINT ["/usr/bin/tini", "--", "/entrypoint.sh"]
entrypoint.sh:
#!/bin/bash
set -e
bops_log() {
local type="$1"; shift
printf '%s [%s] [Entrypoint]: %s\n' "$(date --rfc-3339=seconds)" "$type" "$*"
}
bops_note() {
bops_log Note "$@"
}
bops_warn() {
bops_log Warn "$@" >&2
}
# usage: docker_process_init_files [file [file [...]]]
# ie: docker_process_init_files /always-initdb.d/*
# process initializer files, based on file extensions
docker_process_init_files() {
echo
local f
for f; do
case "$f" in
*.sh)
if [ -x "$f" ]; then
bops_note "$0: running $f"
"$f"
else
bops_note "$0: sourcing $f"
. "$f"
fi
;;
*.bin)
if [ -x "$f" ]; then
bops_note "$0: running $f"
"$f"
fi
;;
*.env)
bops_note "$0: sourcing $f"
. "$f"
;;
*) bops_warn "$0: ignoring $f" ;;
esac
echo
done
}
# For user convenience.
# Bind mount /docker-entrypoint.d directory with you own addon init .sh, .bin or .env files
# to run before anything else here.
if [ -d "/docker-entrypoint.d" ]; then
docker_process_init_files /docker-entrypoint.d/*
fi
if [ ! -z "${SAILOR_PASSWORD}" ]; then
bops_note "$0: setting sailor password"
echo "${SAILOR_PASSWORD}" | chpasswd
fi
if [ ! -z "${BOPS_CRON}" ]; then
bops_note "$0: running crond"
touch /etc/crontab /etc/cron.*/*
flock -w 3 /tmp/bops_crond.lock -c "/usr/sbin/crond -b -L /dev/stdout"
fi
if [ ! -z "${BOPS_DIUN}" ]; then
bops_note "$0: running diun"
runuser -l sailor -c "/opt/bin/diun"
fi
if [ ! -z "${BOPS_GITEA}" ]; then
bops_note "$0: running gitea"
runuser -l sailor -c "/opt/bin/gitea web -c /etc/gitea/app.ini"
fi
if [ ! -z "${BOPS_MSMTP}" ]; then
bops_note "$0: running msmtp"
if [ ! -f "/usr/sbin/msmtpd" ]; then
ln -s /usr/bin/msmtp /usr/sbin/
ln -s /usr/bin/msmtpd /usr/sbin/
fi
/usr/sbin/msmtpd &
fi
if [ ! -z "${BOPS_SSH}" ]; then
bops_note "$0: running sshd"
mkdir -p /run/sshd
/usr/sbin/sshd -e &
fi
if [ ! -z "${BOPS_SWARMCRONJOB}" ]; then
bops_note "$0: running swarm-cronjob"
runuser -l sailor -c "/opt/bin/swarm-cronjob"
fi
if [ ! -z "${GOTTY_PORT}" ]; then
if [ -z "${GOTTY_TLS_CRT}" ]; then
bops_note "$0: running gotty"
runuser -l sailor -c "/go/bin/gotty --port ${GOTTY_PORT} --credential ${GOTTY_CREDENTIAL} --permit-write --permit-arguments --reconnect /bin/bash --rcfile ~/.profile"
else
runuser -l sailor -c "/go/bin/gotty --port ${GOTTY_PORT} --credential ${GOTTY_CREDENTIAL} --permit-write --permit-arguments --reconnect --tls --tls-crt ${GOTTY_TLS_CRT} --tls-key ${GOTTY_TLS_KEY} /bin/bash --rcfile ~/.profile"
fi
fi
cat /etc/ssh/banner.txt
if [ "$#" -eq 0 ]; then
bops_note "$0: Default to keep-alive"
exec sleep infinity
fi
bops_note "$0: Custom command: $*"
exec "$@"
Content type
Image
Digest
sha256:f5f3d305d…
Size
1.1 GB
Last updated
11 months ago
docker pull ethraza/backops