mirror of
https://tangled.org/tranquil.farm/tranquil-pds
synced 2026-08-22 01:06:05 +00:00
Creating & posting records works. Also messed up newlines but will fix later.
This commit is contained in:
@@ -1,38 +1,31 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||||
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "This script must be run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! grep -qi "debian" /etc/os-release 2>/dev/null; then
|
||||
log_warn "This script is designed for Debian. Proceed with caution on other distros."
|
||||
fi
|
||||
|
||||
nuke_installation() {
|
||||
echo -e "${RED}"
|
||||
echo "╔═══════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ NUKING EXISTING INSTALLATION ║"
|
||||
echo "╚═══════════════════════════════════════════════════════════════════╝"
|
||||
echo -e "${NC}"
|
||||
|
||||
log_info "Stopping services..."
|
||||
systemctl stop bspds 2>/dev/null || true
|
||||
systemctl disable bspds 2>/dev/null || true
|
||||
|
||||
log_info "Removing BSPDS files..."
|
||||
rm -rf /opt/bspds
|
||||
rm -rf /var/lib/bspds
|
||||
@@ -42,14 +35,11 @@ nuke_installation() {
|
||||
rm -rf /var/spool/bspds-mail
|
||||
rm -f /etc/systemd/system/bspds.service
|
||||
systemctl daemon-reload
|
||||
|
||||
log_info "Removing BSPDS configuration..."
|
||||
rm -rf /etc/bspds
|
||||
|
||||
log_info "Dropping postgres database and user..."
|
||||
sudo -u postgres psql -c "DROP DATABASE IF EXISTS pds;" 2>/dev/null || true
|
||||
sudo -u postgres psql -c "DROP USER IF EXISTS bspds;" 2>/dev/null || true
|
||||
|
||||
log_info "Removing minio bucket and resetting minio..."
|
||||
if command -v mc &>/dev/null; then
|
||||
mc rb local/pds-blobs --force 2>/dev/null || true
|
||||
@@ -58,16 +48,13 @@ nuke_installation() {
|
||||
systemctl stop minio 2>/dev/null || true
|
||||
rm -rf /var/lib/minio/data/.minio.sys 2>/dev/null || true
|
||||
rm -f /etc/default/minio 2>/dev/null || true
|
||||
|
||||
log_info "Removing nginx config..."
|
||||
rm -f /etc/nginx/sites-enabled/bspds
|
||||
rm -f /etc/nginx/sites-available/bspds
|
||||
systemctl reload nginx 2>/dev/null || true
|
||||
|
||||
log_success "Previous installation nuked!"
|
||||
echo ""
|
||||
}
|
||||
|
||||
if [[ -f /etc/bspds/bspds.env ]] || [[ -d /opt/bspds ]] || [[ -f /usr/local/bin/bspds ]]; then
|
||||
echo -e "${YELLOW}"
|
||||
echo "╔═══════════════════════════════════════════════════════════════════╗"
|
||||
@@ -81,7 +68,6 @@ if [[ -f /etc/bspds/bspds.env ]] || [[ -d /opt/bspds ]] || [[ -f /usr/local/bin/
|
||||
echo " 3) Exit"
|
||||
echo ""
|
||||
read -p "Choose an option [1/2/3]: " INSTALL_CHOICE
|
||||
|
||||
case "$INSTALL_CHOICE" in
|
||||
1)
|
||||
echo ""
|
||||
@@ -113,40 +99,33 @@ if [[ -f /etc/bspds/bspds.env ]] || [[ -d /opt/bspds ]] || [[ -f /usr/local/bin/
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}"
|
||||
echo "╔═══════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ BSPDS Installation Script for Debian ║"
|
||||
echo "║ AT Protocol Personal Data Server in Rust ║"
|
||||
echo "╚═══════════════════════════════════════════════════════════════════╝"
|
||||
echo -e "${NC}"
|
||||
|
||||
get_public_ips() {
|
||||
IPV4=$(curl -4 -s --max-time 5 ifconfig.me 2>/dev/null || curl -4 -s --max-time 5 icanhazip.com 2>/dev/null || echo "Could not detect")
|
||||
IPV6=$(curl -6 -s --max-time 5 ifconfig.me 2>/dev/null || curl -6 -s --max-time 5 icanhazip.com 2>/dev/null || echo "Not available")
|
||||
}
|
||||
|
||||
log_info "Detecting public IP addresses..."
|
||||
get_public_ips
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}Your server's public IPs:${NC}"
|
||||
echo -e " IPv4: ${GREEN}${IPV4}${NC}"
|
||||
echo -e " IPv6: ${GREEN}${IPV6}${NC}"
|
||||
echo ""
|
||||
|
||||
read -p "Enter your PDS domain (e.g., pds.example.com): " PDS_DOMAIN
|
||||
if [[ -z "$PDS_DOMAIN" ]]; then
|
||||
log_error "Domain cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
read -p "Enter your email for Let's Encrypt notifications: " CERTBOT_EMAIL
|
||||
if [[ -z "$CERTBOT_EMAIL" ]]; then
|
||||
log_error "Email cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${YELLOW}DNS RECORDS REQUIRED${NC}"
|
||||
@@ -185,9 +164,7 @@ if [[ ! "$DNS_CONFIRMED" =~ ^[Yy]$ ]]; then
|
||||
log_warn "Please create the DNS records and run this script again."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
CREDENTIALS_FILE="/etc/bspds/.credentials"
|
||||
|
||||
if [[ -f "$CREDENTIALS_FILE" ]]; then
|
||||
log_info "Loading existing credentials from previous installation..."
|
||||
source "$CREDENTIALS_FILE"
|
||||
@@ -199,7 +176,6 @@ else
|
||||
MASTER_KEY=$(openssl rand -base64 48)
|
||||
DB_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
MINIO_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
|
||||
mkdir -p /etc/bspds
|
||||
cat > "$CREDENTIALS_FILE" << EOF
|
||||
JWT_SECRET="$JWT_SECRET"
|
||||
@@ -211,11 +187,9 @@ EOF
|
||||
chmod 600 "$CREDENTIALS_FILE"
|
||||
log_success "Secrets generated and saved"
|
||||
fi
|
||||
|
||||
log_info "Checking swap space..."
|
||||
TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
|
||||
TOTAL_SWAP_KB=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
|
||||
|
||||
if [[ $TOTAL_SWAP_KB -lt 2000000 ]]; then
|
||||
log_info "Adding swap space (needed for compilation)..."
|
||||
if [[ ! -f /swapfile ]]; then
|
||||
@@ -238,26 +212,21 @@ if [[ $TOTAL_SWAP_KB -lt 2000000 ]]; then
|
||||
else
|
||||
log_success "Sufficient swap already configured"
|
||||
fi
|
||||
|
||||
log_info "Updating system packages..."
|
||||
apt update && apt upgrade -y
|
||||
log_success "System updated"
|
||||
|
||||
log_info "Installing build dependencies..."
|
||||
apt install -y curl git build-essential pkg-config libssl-dev ca-certificates gnupg lsb-release unzip xxd
|
||||
log_success "Build dependencies installed"
|
||||
|
||||
log_info "Installing postgres..."
|
||||
apt install -y postgresql postgresql-contrib
|
||||
systemctl enable postgresql
|
||||
systemctl start postgresql
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER bspds WITH PASSWORD '${DB_PASSWORD}';" 2>/dev/null || \
|
||||
sudo -u postgres psql -c "ALTER USER bspds WITH PASSWORD '${DB_PASSWORD}';"
|
||||
sudo -u postgres psql -c "CREATE DATABASE pds OWNER bspds;" 2>/dev/null || true
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pds TO bspds;"
|
||||
log_success "postgres installed and configured"
|
||||
|
||||
log_info "Installing valkey..."
|
||||
apt install -y valkey || {
|
||||
log_warn "valkey not in repos, trying redis..."
|
||||
@@ -268,7 +237,6 @@ apt install -y valkey || {
|
||||
systemctl enable valkey-server 2>/dev/null || true
|
||||
systemctl start valkey-server 2>/dev/null || true
|
||||
log_success "valkey/redis installed"
|
||||
|
||||
log_info "Installing minio..."
|
||||
if [[ ! -f /usr/local/bin/minio ]]; then
|
||||
ARCH=$(dpkg --print-architecture)
|
||||
@@ -283,11 +251,9 @@ if [[ ! -f /usr/local/bin/minio ]]; then
|
||||
chmod +x /tmp/minio
|
||||
mv /tmp/minio /usr/local/bin/
|
||||
fi
|
||||
|
||||
mkdir -p /var/lib/minio/data
|
||||
id -u minio-user &>/dev/null || useradd -r -s /sbin/nologin minio-user
|
||||
chown -R minio-user:minio-user /var/lib/minio
|
||||
|
||||
cat > /etc/default/minio << EOF
|
||||
MINIO_ROOT_USER=minioadmin
|
||||
MINIO_ROOT_PASSWORD=${MINIO_PASSWORD}
|
||||
@@ -295,12 +261,10 @@ MINIO_VOLUMES="/var/lib/minio/data"
|
||||
MINIO_OPTS="--console-address :9001"
|
||||
EOF
|
||||
chmod 600 /etc/default/minio
|
||||
|
||||
cat > /etc/systemd/system/minio.service << 'EOF'
|
||||
[Unit]
|
||||
Description=MinIO Object Storage
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=minio-user
|
||||
Group=minio-user
|
||||
@@ -308,19 +272,15 @@ EnvironmentFile=/etc/default/minio
|
||||
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
|
||||
Restart=always
|
||||
LimitNOFILE=65536
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable minio
|
||||
systemctl start minio
|
||||
log_success "minio installed"
|
||||
|
||||
log_info "Waiting for minio to start..."
|
||||
sleep 5
|
||||
|
||||
log_info "Installing minio client and creating bucket..."
|
||||
if [[ ! -f /usr/local/bin/mc ]]; then
|
||||
ARCH=$(dpkg --print-architecture)
|
||||
@@ -332,12 +292,10 @@ if [[ ! -f /usr/local/bin/mc ]]; then
|
||||
chmod +x /tmp/mc
|
||||
mv /tmp/mc /usr/local/bin/
|
||||
fi
|
||||
|
||||
mc alias remove local 2>/dev/null || true
|
||||
mc alias set local http://localhost:9000 minioadmin "${MINIO_PASSWORD}" --api S3v4
|
||||
mc mb local/pds-blobs --ignore-existing
|
||||
log_success "minio bucket created"
|
||||
|
||||
log_info "Installing rust..."
|
||||
if [[ -f "$HOME/.cargo/env" ]]; then
|
||||
source "$HOME/.cargo/env"
|
||||
@@ -347,7 +305,6 @@ if ! command -v rustc &>/dev/null; then
|
||||
source "$HOME/.cargo/env"
|
||||
fi
|
||||
log_success "rust installed"
|
||||
|
||||
log_info "Installing deno..."
|
||||
export PATH="$HOME/.deno/bin:$PATH"
|
||||
if ! command -v deno &>/dev/null && [[ ! -f "$HOME/.deno/bin/deno" ]]; then
|
||||
@@ -355,7 +312,6 @@ if ! command -v deno &>/dev/null && [[ ! -f "$HOME/.deno/bin/deno" ]]; then
|
||||
grep -q 'deno/bin' ~/.bashrc 2>/dev/null || echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc
|
||||
fi
|
||||
log_success "deno installed"
|
||||
|
||||
log_info "Cloning BSPDS..."
|
||||
if [[ ! -d /opt/bspds ]]; then
|
||||
git clone https://tangled.org/lewis.moe/bspds-sandbox /opt/bspds
|
||||
@@ -365,13 +321,11 @@ else
|
||||
fi
|
||||
cd /opt/bspds
|
||||
log_success "BSPDS cloned"
|
||||
|
||||
log_info "Building frontend..."
|
||||
cd /opt/bspds/frontend
|
||||
"$HOME/.deno/bin/deno" task build
|
||||
cd /opt/bspds
|
||||
log_success "Frontend built"
|
||||
|
||||
log_info "Building BSPDS (this may take a while)..."
|
||||
source "$HOME/.cargo/env"
|
||||
NPROC=$(nproc)
|
||||
@@ -382,40 +336,33 @@ else
|
||||
cargo build --release
|
||||
fi
|
||||
log_success "BSPDS built"
|
||||
|
||||
log_info "Installing sqlx-cli and running migrations..."
|
||||
cargo install sqlx-cli --no-default-features --features postgres
|
||||
export DATABASE_URL="postgres://bspds:${DB_PASSWORD}@localhost:5432/pds"
|
||||
"$HOME/.cargo/bin/sqlx" migrate run
|
||||
log_success "Migrations complete"
|
||||
|
||||
log_info "Setting up mail trap for testing..."
|
||||
mkdir -p /var/spool/bspds-mail
|
||||
chown root:root /var/spool/bspds-mail
|
||||
chmod 1777 /var/spool/bspds-mail
|
||||
|
||||
cat > /usr/local/bin/bspds-sendmail << 'SENDMAIL_EOF'
|
||||
#!/bin/bash
|
||||
MAIL_DIR="/var/spool/bspds-mail"
|
||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||
RANDOM_ID=$(head -c 4 /dev/urandom | xxd -p)
|
||||
MAIL_FILE="${MAIL_DIR}/${TIMESTAMP}-${RANDOM_ID}.eml"
|
||||
|
||||
mkdir -p "$MAIL_DIR"
|
||||
|
||||
{
|
||||
echo "X-BSPDS-Received: $(date -Iseconds)"
|
||||
echo "X-BSPDS-Args: $*"
|
||||
echo ""
|
||||
cat
|
||||
} > "$MAIL_FILE"
|
||||
|
||||
chmod 644 "$MAIL_FILE"
|
||||
echo "Mail saved to: $MAIL_FILE" >&2
|
||||
exit 0
|
||||
SENDMAIL_EOF
|
||||
chmod +x /usr/local/bin/bspds-sendmail
|
||||
|
||||
cat > /usr/local/bin/bspds-mailq << 'MAILQ_EOF'
|
||||
#!/bin/bash
|
||||
MAIL_DIR="/var/spool/bspds-mail"
|
||||
@@ -425,7 +372,6 @@ YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
show_help() {
|
||||
echo "bspds-mailq - View captured emails from BSPDS mail trap"
|
||||
echo ""
|
||||
@@ -439,25 +385,21 @@ show_help() {
|
||||
echo " bspds-mailq count Show count of emails in queue"
|
||||
echo ""
|
||||
}
|
||||
|
||||
list_emails() {
|
||||
if [[ ! -d "$MAIL_DIR" ]] || [[ -z "$(ls -A "$MAIL_DIR" 2>/dev/null)" ]]; then
|
||||
echo -e "${YELLOW}No emails in queue.${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${GREEN} BSPDS Mail Queue${NC}"
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
local i=1
|
||||
for f in $(ls -t "$MAIL_DIR"/*.eml 2>/dev/null); do
|
||||
local filename=$(basename "$f")
|
||||
local received=$(grep "^X-BSPDS-Received:" "$f" 2>/dev/null | cut -d' ' -f2-)
|
||||
local to=$(grep -i "^To:" "$f" 2>/dev/null | head -1 | cut -d' ' -f2-)
|
||||
local subject=$(grep -i "^Subject:" "$f" 2>/dev/null | head -1 | sed 's/^Subject: *//')
|
||||
|
||||
echo -e "${BLUE}[$i]${NC} ${filename}"
|
||||
echo -e " To: ${GREEN}${to:-unknown}${NC}"
|
||||
echo -e " Subject: ${YELLOW}${subject:-<no subject>}${NC}"
|
||||
@@ -465,14 +407,11 @@ list_emails() {
|
||||
echo ""
|
||||
((i++))
|
||||
done
|
||||
|
||||
echo -e "${CYAN}Total: $((i-1)) email(s)${NC}"
|
||||
}
|
||||
|
||||
view_email() {
|
||||
local target="$1"
|
||||
local file=""
|
||||
|
||||
if [[ "$target" == "latest" ]]; then
|
||||
file=$(ls -t "$MAIL_DIR"/*.eml 2>/dev/null | head -1)
|
||||
elif [[ "$target" =~ ^[0-9]+$ ]]; then
|
||||
@@ -482,12 +421,10 @@ view_email() {
|
||||
elif [[ -f "$target" ]]; then
|
||||
file="$target"
|
||||
fi
|
||||
|
||||
if [[ -z "$file" ]] || [[ ! -f "$file" ]]; then
|
||||
echo -e "${RED}Email not found: $target${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${GREEN} $(basename "$file")${NC}"
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
@@ -495,22 +432,18 @@ view_email() {
|
||||
echo ""
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
}
|
||||
|
||||
clear_queue() {
|
||||
local count=$(ls -1 "$MAIL_DIR"/*.eml 2>/dev/null | wc -l)
|
||||
if [[ "$count" -eq 0 ]]; then
|
||||
echo -e "${YELLOW}Queue is already empty.${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
rm -f "$MAIL_DIR"/*.eml
|
||||
echo -e "${GREEN}Cleared $count email(s) from queue.${NC}"
|
||||
}
|
||||
|
||||
watch_queue() {
|
||||
echo -e "${CYAN}Watching for new emails... (Ctrl+C to stop)${NC}"
|
||||
echo ""
|
||||
|
||||
local last_count=0
|
||||
while true; do
|
||||
local current_count=$(ls -1 "$MAIL_DIR"/*.eml 2>/dev/null | wc -l)
|
||||
@@ -522,12 +455,10 @@ watch_queue() {
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
count_queue() {
|
||||
local count=$(ls -1 "$MAIL_DIR"/*.eml 2>/dev/null | wc -l)
|
||||
echo "$count"
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
""|list)
|
||||
list_emails
|
||||
@@ -560,59 +491,46 @@ esac
|
||||
MAILQ_EOF
|
||||
chmod +x /usr/local/bin/bspds-mailq
|
||||
log_success "Mail trap configured"
|
||||
|
||||
log_info "Creating BSPDS configuration..."
|
||||
mkdir -p /etc/bspds
|
||||
|
||||
cat > /etc/bspds/bspds.env << EOF
|
||||
SERVER_HOST=127.0.0.1
|
||||
SERVER_PORT=3000
|
||||
PDS_HOSTNAME=${PDS_DOMAIN}
|
||||
|
||||
DATABASE_URL=postgres://bspds:${DB_PASSWORD}@localhost:5432/pds
|
||||
DATABASE_MAX_CONNECTIONS=100
|
||||
DATABASE_MIN_CONNECTIONS=10
|
||||
|
||||
S3_ENDPOINT=http://localhost:9000
|
||||
AWS_REGION=us-east-1
|
||||
S3_BUCKET=pds-blobs
|
||||
AWS_ACCESS_KEY_ID=minioadmin
|
||||
AWS_SECRET_ACCESS_KEY=${MINIO_PASSWORD}
|
||||
|
||||
VALKEY_URL=redis://localhost:6379
|
||||
|
||||
JWT_SECRET=${JWT_SECRET}
|
||||
DPOP_SECRET=${DPOP_SECRET}
|
||||
MASTER_KEY=${MASTER_KEY}
|
||||
|
||||
PLC_DIRECTORY_URL=https://plc.directory
|
||||
APPVIEW_URL=https://api.bsky.app
|
||||
CRAWLERS=https://bsky.network
|
||||
|
||||
AVAILABLE_USER_DOMAINS=${PDS_DOMAIN}
|
||||
|
||||
MAIL_FROM_ADDRESS=noreply@${PDS_DOMAIN}
|
||||
MAIL_FROM_NAME=BSPDS
|
||||
SENDMAIL_PATH=/usr/local/bin/bspds-sendmail
|
||||
EOF
|
||||
chmod 600 /etc/bspds/bspds.env
|
||||
log_success "Configuration created"
|
||||
|
||||
log_info "Creating BSPDS service user..."
|
||||
id -u bspds &>/dev/null || useradd -r -s /sbin/nologin bspds
|
||||
|
||||
cp /opt/bspds/target/release/bspds /usr/local/bin/
|
||||
mkdir -p /var/lib/bspds
|
||||
cp -r /opt/bspds/frontend/dist /var/lib/bspds/frontend
|
||||
chown -R bspds:bspds /var/lib/bspds
|
||||
log_success "BSPDS binary installed"
|
||||
|
||||
log_info "Creating systemd service..."
|
||||
cat > /etc/systemd/system/bspds.service << 'EOF'
|
||||
[Unit]
|
||||
Description=BSPDS - AT Protocol PDS
|
||||
After=network.target postgresql.service minio.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=bspds
|
||||
@@ -622,27 +540,22 @@ Environment=FRONTEND_DIR=/var/lib/bspds/frontend
|
||||
ExecStart=/usr/local/bin/bspds
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable bspds
|
||||
systemctl start bspds
|
||||
log_success "BSPDS service created and started"
|
||||
|
||||
log_info "Installing nginx..."
|
||||
apt install -y nginx certbot python3-certbot-nginx
|
||||
log_success "nginx installed"
|
||||
|
||||
log_info "Configuring nginx..."
|
||||
cat > /etc/nginx/sites-available/bspds << EOF
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name ${PDS_DOMAIN} *.${PDS_DOMAIN};
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_http_version 1.1;
|
||||
@@ -658,34 +571,27 @@ server {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
ln -sf /etc/nginx/sites-available/bspds /etc/nginx/sites-enabled/
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
nginx -t
|
||||
systemctl reload nginx
|
||||
log_success "nginx configured"
|
||||
|
||||
log_info "Configuring firewall (ufw)..."
|
||||
apt install -y ufw
|
||||
ufw --force reset
|
||||
|
||||
ufw default deny incoming
|
||||
ufw default allow outgoing
|
||||
|
||||
ufw allow ssh comment 'SSH'
|
||||
ufw allow 80/tcp comment 'HTTP'
|
||||
ufw allow 443/tcp comment 'HTTPS'
|
||||
|
||||
ufw --force enable
|
||||
log_success "Firewall configured"
|
||||
|
||||
log_info "Obtaining SSL certificate..."
|
||||
certbot --nginx -d "${PDS_DOMAIN}" -d "*.${PDS_DOMAIN}" --email "${CERTBOT_EMAIL}" --agree-tos --non-interactive || {
|
||||
log_warn "Wildcard cert failed (requires DNS challenge). Trying single domain..."
|
||||
certbot --nginx -d "${PDS_DOMAIN}" --email "${CERTBOT_EMAIL}" --agree-tos --non-interactive
|
||||
}
|
||||
log_success "SSL certificate obtained"
|
||||
|
||||
log_info "Verifying installation..."
|
||||
sleep 3
|
||||
if curl -s "http://localhost:3000/xrpc/_health" | grep -q "version"; then
|
||||
@@ -693,7 +599,6 @@ if curl -s "http://localhost:3000/xrpc/_health" | grep -q "version"; then
|
||||
else
|
||||
log_warn "BSPDS may still be starting up. Check: journalctl -u bspds -f"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${GREEN} INSTALLATION COMPLETE!${NC}"
|
||||
|
||||
@@ -1,29 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
INFRA_SCRIPT="$SCRIPT_DIR/test-infra.sh"
|
||||
|
||||
cleanup() {
|
||||
echo ""
|
||||
echo "Cleaning up test infrastructure..."
|
||||
"$INFRA_SCRIPT" stop
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
"$INFRA_SCRIPT" start
|
||||
|
||||
source "${TMPDIR:-/tmp}/bspds_test_infra.env"
|
||||
|
||||
echo ""
|
||||
echo "Running database migrations..."
|
||||
sqlx database create 2>/dev/null || true
|
||||
sqlx migrate run --source "$PROJECT_DIR/migrations"
|
||||
|
||||
echo ""
|
||||
echo "Running tests..."
|
||||
echo ""
|
||||
|
||||
cargo nextest run "$@"
|
||||
|
||||
+2
-24
@@ -1,13 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
INFRA_FILE="${TMPDIR:-/tmp}/bspds_test_infra.env"
|
||||
CONTAINER_PREFIX="bspds-test"
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
if command_exists podman; then
|
||||
CONTAINER_CMD="podman"
|
||||
if [[ -z "${DOCKER_HOST:-}" ]]; then
|
||||
@@ -23,10 +20,8 @@ else
|
||||
echo "Error: Neither podman nor docker found" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
start_infra() {
|
||||
echo "Starting test infrastructure..."
|
||||
|
||||
if [[ -f "$INFRA_FILE" ]]; then
|
||||
source "$INFRA_FILE"
|
||||
if $CONTAINER_CMD ps --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_PREFIX}-postgres$"; then
|
||||
@@ -37,9 +32,7 @@ start_infra() {
|
||||
echo "Stale infra file found, cleaning up..."
|
||||
rm -f "$INFRA_FILE"
|
||||
fi
|
||||
|
||||
$CONTAINER_CMD rm -f "${CONTAINER_PREFIX}-postgres" "${CONTAINER_PREFIX}-minio" "${CONTAINER_PREFIX}-valkey" 2>/dev/null || true
|
||||
|
||||
echo "Starting PostgreSQL..."
|
||||
$CONTAINER_CMD run -d \
|
||||
--name "${CONTAINER_PREFIX}-postgres" \
|
||||
@@ -49,7 +42,6 @@ start_infra() {
|
||||
-P \
|
||||
--label bspds_test=true \
|
||||
postgres:18-alpine >/dev/null
|
||||
|
||||
echo "Starting MinIO..."
|
||||
$CONTAINER_CMD run -d \
|
||||
--name "${CONTAINER_PREFIX}-minio" \
|
||||
@@ -57,22 +49,18 @@ start_infra() {
|
||||
-e MINIO_ROOT_PASSWORD=minioadmin \
|
||||
-P \
|
||||
--label bspds_test=true \
|
||||
minio/minio:RELEASE.2025-10-15T17-29-55Z server /data >/dev/null
|
||||
|
||||
minio/minio:latest server /data >/dev/null
|
||||
echo "Starting Valkey..."
|
||||
$CONTAINER_CMD run -d \
|
||||
--name "${CONTAINER_PREFIX}-valkey" \
|
||||
-P \
|
||||
--label bspds_test=true \
|
||||
valkey/valkey:8-alpine >/dev/null
|
||||
|
||||
echo "Waiting for services to be ready..."
|
||||
sleep 2
|
||||
|
||||
PG_PORT=$($CONTAINER_CMD port "${CONTAINER_PREFIX}-postgres" 5432 | head -1 | cut -d: -f2)
|
||||
MINIO_PORT=$($CONTAINER_CMD port "${CONTAINER_PREFIX}-minio" 9000 | head -1 | cut -d: -f2)
|
||||
VALKEY_PORT=$($CONTAINER_CMD port "${CONTAINER_PREFIX}-valkey" 6379 | head -1 | cut -d: -f2)
|
||||
|
||||
for i in {1..30}; do
|
||||
if $CONTAINER_CMD exec "${CONTAINER_PREFIX}-postgres" pg_isready -U postgres >/dev/null 2>&1; then
|
||||
break
|
||||
@@ -80,7 +68,6 @@ start_infra() {
|
||||
echo "Waiting for PostgreSQL... ($i/30)"
|
||||
sleep 1
|
||||
done
|
||||
|
||||
for i in {1..30}; do
|
||||
if curl -s "http://127.0.0.1:${MINIO_PORT}/minio/health/live" >/dev/null 2>&1; then
|
||||
break
|
||||
@@ -88,7 +75,6 @@ start_infra() {
|
||||
echo "Waiting for MinIO... ($i/30)"
|
||||
sleep 1
|
||||
done
|
||||
|
||||
for i in {1..30}; do
|
||||
if $CONTAINER_CMD exec "${CONTAINER_PREFIX}-valkey" valkey-cli ping 2>/dev/null | grep -q PONG; then
|
||||
break
|
||||
@@ -96,12 +82,10 @@ start_infra() {
|
||||
echo "Waiting for Valkey... ($i/30)"
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "Creating MinIO bucket..."
|
||||
$CONTAINER_CMD run --rm --network host \
|
||||
-e MC_HOST_minio="http://minioadmin:minioadmin@127.0.0.1:${MINIO_PORT}" \
|
||||
minio/mc:RELEASE.2025-07-16T15-35-03Z mb minio/test-bucket --ignore-existing >/dev/null 2>&1 || true
|
||||
|
||||
minio/mc:latest mb minio/test-bucket --ignore-existing >/dev/null 2>&1 || true
|
||||
cat > "$INFRA_FILE" << EOF
|
||||
export DATABASE_URL="postgres://postgres:postgres@127.0.0.1:${PG_PORT}/postgres"
|
||||
export TEST_DB_PORT="${PG_PORT}"
|
||||
@@ -116,25 +100,21 @@ export BSPDS_ALLOW_INSECURE_SECRETS="1"
|
||||
export SKIP_IMPORT_VERIFICATION="true"
|
||||
export DISABLE_RATE_LIMITING="1"
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "Infrastructure ready!"
|
||||
echo "Config written to: $INFRA_FILE"
|
||||
echo ""
|
||||
cat "$INFRA_FILE"
|
||||
}
|
||||
|
||||
stop_infra() {
|
||||
echo "Stopping test infrastructure..."
|
||||
$CONTAINER_CMD rm -f "${CONTAINER_PREFIX}-postgres" "${CONTAINER_PREFIX}-minio" "${CONTAINER_PREFIX}-valkey" 2>/dev/null || true
|
||||
rm -f "$INFRA_FILE"
|
||||
echo "Infrastructure stopped."
|
||||
}
|
||||
|
||||
status_infra() {
|
||||
echo "Test Infrastructure Status:"
|
||||
echo "============================"
|
||||
|
||||
if [[ -f "$INFRA_FILE" ]]; then
|
||||
echo "Config file: $INFRA_FILE"
|
||||
source "$INFRA_FILE"
|
||||
@@ -143,12 +123,10 @@ status_infra() {
|
||||
else
|
||||
echo "Config file: NOT FOUND"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Containers:"
|
||||
$CONTAINER_CMD ps -a --filter "label=bspds_test=true" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo " (none)"
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
start)
|
||||
start_infra
|
||||
|
||||
Reference in New Issue
Block a user