100 lines
2.9 KiB
Bash
100 lines
2.9 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
|
|
APP_URL="${1:?APP_URL is required}"
|
|
REMOTE_DIR="${2:-/opt/caiwuxitong}"
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "bootstrap-server.sh must run as root" >&2
|
|
exit 1
|
|
fi
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends ca-certificates curl openssl
|
|
|
|
install -m 0755 -d /etc/apt/keyrings
|
|
if [ ! -f /etc/apt/keyrings/docker.asc ]; then
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
|
chmod a+r /etc/apt/keyrings/docker.asc
|
|
fi
|
|
|
|
. /etc/os-release
|
|
ARCH="$(dpkg --print-architecture)"
|
|
CODENAME="${UBUNTU_CODENAME:-$VERSION_CODENAME}"
|
|
|
|
{
|
|
printf '%s\n' \
|
|
'Types: deb' \
|
|
'URIs: https://download.docker.com/linux/ubuntu' \
|
|
"Suites: $CODENAME" \
|
|
'Components: stable' \
|
|
"Architectures: $ARCH" \
|
|
'Signed-By: /etc/apt/keyrings/docker.asc'
|
|
} > /etc/apt/sources.list.d/docker.sources
|
|
|
|
apt-get update
|
|
if command -v docker >/dev/null 2>&1; then
|
|
apt-get install -y --no-install-recommends docker-buildx-plugin docker-compose-plugin
|
|
else
|
|
apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
fi
|
|
systemctl enable --now docker
|
|
|
|
if ! swapon --show=NAME --noheadings | grep -q .; then
|
|
if [ ! -f /swapfile ]; then
|
|
fallocate -l 2G /swapfile
|
|
chmod 600 /swapfile
|
|
mkswap /swapfile >/dev/null
|
|
fi
|
|
|
|
swapon /swapfile
|
|
|
|
if ! grep -q '^/swapfile ' /etc/fstab; then
|
|
printf '%s\n' '/swapfile none swap sw 0 0' >> /etc/fstab
|
|
fi
|
|
fi
|
|
|
|
install -d -m 700 "$REMOTE_DIR/runtime"
|
|
|
|
if [ ! -f "$REMOTE_DIR/runtime/.env" ]; then
|
|
DB_PASSWORD="$(openssl rand -hex 24)"
|
|
DB_ROOT_PASSWORD="$(openssl rand -hex 24)"
|
|
APP_KEY="$(openssl rand -base64 32 | tr -d '\n')"
|
|
|
|
umask 077
|
|
{
|
|
printf '%s\n' \
|
|
'APP_NAME=CaiWuXiTong' \
|
|
'APP_ENV=production' \
|
|
"APP_KEY=base64:$APP_KEY" \
|
|
'APP_DEBUG=false' \
|
|
'APP_INSTALLED=false' \
|
|
"APP_URL=$APP_URL" \
|
|
'APP_LOCALE=zh-CN' \
|
|
'APP_FALLBACK_LOCALE=en-GB' \
|
|
'APP_TIMEZONE=Asia/Shanghai' \
|
|
'LOG_CHANNEL=stack' \
|
|
'DB_CONNECTION=mysql' \
|
|
'DB_HOST=db' \
|
|
'DB_PORT=3306' \
|
|
'DB_DATABASE=caiwu' \
|
|
'DB_USERNAME=caiwu' \
|
|
"DB_PASSWORD=$DB_PASSWORD" \
|
|
'DB_PREFIX=ak_' \
|
|
'CACHE_DRIVER=file' \
|
|
'SESSION_DRIVER=file' \
|
|
'QUEUE_CONNECTION=sync' \
|
|
'MARIADB_DATABASE=caiwu' \
|
|
'MARIADB_USER=caiwu' \
|
|
"MARIADB_PASSWORD=$DB_PASSWORD" \
|
|
"MARIADB_ROOT_PASSWORD=$DB_ROOT_PASSWORD" \
|
|
'MARIADB_AUTO_UPGRADE=1'
|
|
} > "$REMOTE_DIR/runtime/.env"
|
|
chmod 600 "$REMOTE_DIR/runtime/.env"
|
|
fi
|
|
|
|
docker --version
|
|
docker compose version
|
|
echo "Server runtime is ready: $REMOTE_DIR"
|