Compare commits

...

24 Commits

Author SHA1 Message Date
90273fbbca feat(netlab): add MOTD configuration 2026-01-11 19:01:23 +00:00
13d97ff627 feat(proxy): add MOTD configuration 2026-01-11 19:00:39 +00:00
36e40211f6 refactor(netlab): use robust awk-based Tailscale FQDN extraction from seedbox 2026-01-11 18:51:40 +00:00
4935ae3c3e refactor(proxy): use robust awk-based Tailscale FQDN extraction from seedbox 2026-01-11 18:51:01 +00:00
52d7d024e5 refactor(netlab): align with proxy script - use Tailscale DNS hostname 2026-01-11 18:49:01 +00:00
727a29fed4 fix(sonarr): add missing serve.json for Tailscale proxy
All checks were successful
Deploy Seedbox / Deploy Seedbox Stacks (push) Successful in 35s
2026-01-04 17:38:37 +00:00
f9ce62d296 Update seedbox/install.sh
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Has been cancelled
2026-01-04 17:16:03 +00:00
bca52e345f Update seedbox/install.sh
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Has been cancelled
2026-01-04 17:01:10 +00:00
8680397c08 fix(ci): use rsync to sync only stacks/ without polluting /srv/seedbox
- Clone repo to temp directory
- Rsync only seedbox/stacks/ to /srv/seedbox/stacks/
- Preserve .env and volume data directories
2026-01-04 16:59:22 +00:00
4576df0773 fix(seedbox): simplify git clone with sparse checkout
All checks were successful
Deploy Seedbox / Deploy Seedbox Stacks (push) Successful in 36s
Only clone seedbox/ subdirectory into /srv/seedbox using git sparse-checkout
2026-01-04 16:28:00 +00:00
41f3f7224c Update README.md 2026-01-04 16:09:15 +00:00
036fd8b714 Update seedbox/install.sh
All checks were successful
Deploy Seedbox / Deploy Seedbox Stacks (push) Successful in 1m7s
2026-01-04 16:05:49 +00:00
69753e52e5 fix(seedbox): add --accept-routes and secure SSH via Tailnet only
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 27s
- Add --accept-routes flag to tailscale up for subnet routing
- Schedule SSH lockdown via 'at' to avoid cutting access during setup
- SSH will only be accessible via Tailscale interface after 2 minutes
2026-01-04 16:03:25 +00:00
7ccfa58dc1 fix(seedbox): disable Tailscale SSH management for CI compatibility
All checks were successful
Deploy Seedbox / Deploy Seedbox Stacks (push) Successful in 1m0s
- Remove --ssh flag from tailscale up
- Remove temporary SSH port 22 opening (not needed anymore)
- SSH now uses standard auth via Tailscale network
- CI can connect without Tailscale SSH check prompts
2026-01-04 15:58:55 +00:00
c7155d0555 feat(ci): add workflow_dispatch for manual trigger
Allows manual execution from Gitea Actions UI
2026-01-04 15:49:02 +00:00
97dbe32354 fix(ci): replace actions/checkout with git clone for Alpine compatibility
Alpine doesn't have Node.js by default, and actions/checkout requires it.
Using native git clone instead - simpler and KISS approach.
2026-01-04 15:13:54 +00:00
eb0720d0b1 fix(seedbox): update Sonarr README with correct /downloads path
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
2026-01-04 13:46:51 +00:00
cc5b9be116 fix(seedbox): update Transmission README with correct /downloads path
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
2026-01-04 13:46:32 +00:00
09da2f514b fix(seedbox): update README to reflect /downloads mount point
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
- Storage section now shows /downloads (local RAID - 3.4T)
- Updated directory structure
- Fixed post-install verification commands
2026-01-04 13:44:52 +00:00
8237a425b1 fix(seedbox): update install.sh to reflect /downloads mount point
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
- Remove /srv/seedbox/downloads creation (using /downloads RAID)
- Update MOTD to show correct storage paths
- Update final summary
2026-01-04 13:43:58 +00:00
3f23f418ea fix(seedbox): use /downloads mount point for Sonarr
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
2026-01-04 13:43:06 +00:00
d5edc12e65 fix(seedbox): use /downloads mount point instead of /srv/seedbox/downloads
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 3s
2026-01-04 13:42:56 +00:00
7eaba56b44 ci(seedbox): remove misplaced workflow file
Some checks failed
Deploy Seedbox / Deploy Seedbox Stacks (push) Failing after 4s
Workflow moved to .gitea/workflows/deploy-seedbox.yml at repo root
2026-01-04 13:39:15 +00:00
0a9132b669 ci(seedbox): move workflow to repo root for Gitea discovery
Gitea only looks for workflows in .gitea/workflows/ at repository root
2026-01-04 13:38:54 +00:00
11 changed files with 208 additions and 73 deletions

View File

@@ -9,6 +9,7 @@ on:
branches: [main] branches: [main]
paths: paths:
- 'seedbox/**' - 'seedbox/**'
workflow_dispatch:
jobs: jobs:
deploy: deploy:
@@ -22,14 +23,14 @@ jobs:
run: apk add --no-cache openssh-client git run: apk add --no-cache openssh-client git
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 run: |
git clone --depth 1 --branch main https://gitea.arnodo.fr/Damien/infra-scripts.git .
- name: Setup SSH key - name: Setup SSH key
run: | run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.SEEDBOX_SSH_KEY }}" > ~/.ssh/id_ed25519 echo "${{ secrets.SEEDBOX_SSH_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519
# Trust the seedbox host
ssh-keyscan -H seedbox.taila5ad8.ts.net >> ~/.ssh/known_hosts 2>/dev/null || true ssh-keyscan -H seedbox.taila5ad8.ts.net >> ~/.ssh/known_hosts 2>/dev/null || true
- name: Validate compose files (PR only) - name: Validate compose files (PR only)
@@ -44,15 +45,26 @@ jobs:
echo "Validation complete." echo "Validation complete."
- name: Deploy to seedbox - name: Deploy to seedbox
if: github.event_name == 'push' if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: | run: |
ssh -o StrictHostKeyChecking=accept-new debian@seedbox.taila5ad8.ts.net << 'ENDSSH' ssh -o StrictHostKeyChecking=accept-new debian@seedbox.taila5ad8.ts.net << 'ENDSSH'
set -e set -e
cd /srv/seedbox cd /srv/seedbox
echo "=== Pulling latest changes ===" echo "=== Syncing stacks from repository ==="
git fetch origin main # Clone to temp directory and sync only seedbox/ content
git reset --hard origin/main TEMP_DIR=$(mktemp -d)
git clone --depth 1 --branch main https://gitea.arnodo.fr/Damien/infra-scripts.git "$TEMP_DIR"
# Sync stacks directory (preserve .env and volumes)
rsync -av --delete \
--exclude='.env' \
--exclude='*/data/' \
--exclude='*/state/' \
"$TEMP_DIR/seedbox/stacks/" /srv/seedbox/stacks/
# Clean up temp directory
rm -rf "$TEMP_DIR"
echo "=== Creating .env file ===" echo "=== Creating .env file ==="
cat > .env << 'ENVEOF' cat > .env << 'ENVEOF'
@@ -80,7 +92,7 @@ jobs:
ENDSSH ENDSSH
- name: Deployment summary - name: Deployment summary
if: github.event_name == 'push' if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: | run: |
echo "✅ Deployment complete!" echo "✅ Deployment complete!"
echo "" echo ""

View File

@@ -20,10 +20,6 @@ These scripts automate the deployment of personal infrastructure components. The
## Requirements ## Requirements
- Fresh Debian 11/12 installation - Fresh Debian 12/13 installation
- User with sudo privileges (do not run as root) - User with sudo privileges (do not run as root)
- Internet access - Internet access
## License
MIT

View File

@@ -107,8 +107,52 @@ EOF
log_warn " sudo ufw delete allow 22/tcp" log_warn " sudo ufw delete allow 22/tcp"
} }
# Get Tailscale IP for final message # Configure MOTD
TS_IP=$(tailscale ip -4) log_info "Configuring MOTD..."
sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true
cat << 'MOTD' | sudo tee /etc/update-motd.d/00-netlab > /dev/null
#!/bin/bash
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
/"Self"/ { in_self=1 }
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
')
[[ -z "$TS_FQDN" ]] && TS_FQDN="$(hostname).ts.net"
# Get configured SSH port from sshd config
SSH_PORT=$(grep -h "^Port " /etc/ssh/sshd_config.d/*.conf 2>/dev/null | awk '{print $2}' | head -1)
[[ -z "$SSH_PORT" ]] && SSH_PORT="22"
echo ""
echo " _ _ _____ _____ _ _ ____"
echo "| \ | | ____|_ _| | / \ | __ )"
echo "| \| | _| | | | | / _ \ | _ \\"
echo "| |\ | |___ | | | |___ / ___ \| |_) |"
echo "|_| \_|_____| |_| |_____/_/ \_\____/"
echo ""
echo "ContainerLab Network Lab Server"
echo "─────────────────────────────────────────"
echo "Access:"
echo " • SSH (public) : port ${SSH_PORT}"
echo " • SSH (Tailscale) : ${TS_FQDN}"
echo ""
echo "Labs:"
containerlab inspect --all 2>/dev/null | head -20 || echo " No labs running"
echo ""
echo "Useful commands:"
echo " containerlab deploy -t <topology>.clab.yml"
echo " containerlab inspect --all"
echo " containerlab destroy -t <topology>.clab.yml"
echo "─────────────────────────────────────────"
echo ""
MOTD
sudo chmod +x /etc/update-motd.d/00-netlab
# Get Tailscale hostname for display
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
/"Self"/ { in_self=1 }
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
' || echo "${HOSTNAME}.ts.net")
echo "" echo ""
log_info "==========================================" log_info "=========================================="
@@ -117,7 +161,7 @@ EOF
echo "" echo ""
echo "Access:" echo "Access:"
echo " - Public SSH: ssh -p ${SSH_PORT} ${USER}@<public-ip>" echo " - Public SSH: ssh -p ${SSH_PORT} ${USER}@<public-ip>"
echo " - Tailscale SSH: ssh ${USER}@${TS_IP} (or use Tailscale SSH)" echo " - Tailscale SSH: ssh ${USER}@${TS_FQDN} (or use Tailscale SSH)"
echo "" echo ""
echo "ContainerLab is ready. Example usage:" echo "ContainerLab is ready. Example usage:"
echo " containerlab deploy -t mylab.clab.yml" echo " containerlab deploy -t mylab.clab.yml"

View File

@@ -118,15 +118,54 @@ EOF
log_info "Exposing NPM admin panel via Tailscale..." log_info "Exposing NPM admin panel via Tailscale..."
sudo tailscale serve --bg http://localhost:81 sudo tailscale serve --bg http://localhost:81
# Get Tailscale hostname for final message # Configure MOTD
TS_HOSTNAME=$(tailscale status --json | grep -o '"DNSName":"[^"]*' | head -1 | cut -d'"' -f4 | sed 's/\.$//') log_info "Configuring MOTD..."
sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true
cat << 'MOTD' | sudo tee /etc/update-motd.d/00-proxy > /dev/null
#!/bin/bash
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
/"Self"/ { in_self=1 }
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
')
[[ -z "$TS_FQDN" ]] && TS_FQDN="$(hostname).ts.net"
echo ""
echo " ____ ____ _____ ____ __"
echo "| _ \| _ \ / _ \ \/ /\ \ / /"
echo "| |_) | |_) | | | \ / \ V /"
echo "| __/| _ <| |_| / \ | |"
echo "|_| |_| \_\\\\___/_/\_\ |_|"
echo ""
echo "Nginx Proxy Manager Server"
echo "─────────────────────────────────────────"
echo "Access:"
echo " • Admin panel : https://${TS_FQDN} (Tailscale)"
echo " • HTTP/HTTPS : Public ports 80/443"
echo ""
echo "Services:"
docker ps --format ' • {{.Names}} : {{.Status}}' 2>/dev/null || echo " Docker not running"
echo ""
echo "Useful commands:"
echo " cd ~/npm && docker compose logs -f"
echo " sudo tailscale serve status"
echo "─────────────────────────────────────────"
echo ""
MOTD
sudo chmod +x /etc/update-motd.d/00-proxy
# Get Tailscale hostname for display
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
/"Self"/ { in_self=1 }
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
' || echo "${HOSTNAME}.ts.net")
echo "" echo ""
log_info "==========================================" log_info "=========================================="
log_info "Deployment complete!" log_info "Deployment complete!"
log_info "==========================================" log_info "=========================================="
echo "" echo ""
echo "Access NPM admin panel at: https://${TS_HOSTNAME}" echo "Access NPM admin panel at: https://${TS_FQDN}"
echo "Default login: admin@example.com / changeme" echo "Default login: admin@example.com / changeme"
echo "" echo ""
echo "Note: Approve exit-node in Tailscale admin console if needed" echo "Note: Approve exit-node in Tailscale admin console if needed"

View File

@@ -33,7 +33,7 @@ Docker-based seedbox with Tailscale integration. Each service runs in its own co
│ └─────────────────────────────────────────────────────────┘ │ │ └─────────────────────────────────────────────────────────┘ │
│ │ │ │
│ Storage: │ │ Storage: │
│ ├─ /srv/seedbox/downloads (local SSD) │ ├─ /downloads (local RAID - 3.4T)
│ └─ /mnt/media (NFS from NAS) │ │ └─ /mnt/media (NFS from NAS) │
└─────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────┘
``` ```
@@ -88,15 +88,8 @@ Add this tag to your Tailscale ACL policy (https://login.tailscale.com/admin/acl
```json ```json
{ {
"tagOwners": { "tagOwners": {
"tag:container": ["autogroup:admin"] "tag:container": ["autogroup:admins"]
},
"acls": [
{
"action": "accept",
"src": ["autogroup:member"],
"dst": ["tag:container:*"]
} }
]
} }
``` ```
@@ -136,11 +129,10 @@ Or create a PR for validation first.
│ └── portainer/ │ └── portainer/
│ ├── docker-compose.yml │ ├── docker-compose.yml
│ └── serve.json │ └── serve.json
── downloads/ # Local downloads (SSD) ── .env # Secrets (created by pipeline)
├── .env # Secrets (created by pipeline)
└── .gitea/ /downloads/ # Local RAID storage (3.4T)
└── workflows/ /mnt/media/ # NFS mount from NAS
└── deploy.yml # Deployment pipeline
``` ```
## Adding a New Service ## Adding a New Service
@@ -185,6 +177,8 @@ services:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- config:/config - config:/config
- /downloads:/downloads
- /mnt/media:/media
restart: unless-stopped restart: unless-stopped
volumes: volumes:
@@ -340,6 +334,9 @@ Ensure your NAS exports the media share via NFS:
## Post-install Verification ## Post-install Verification
```bash ```bash
# Check downloads mount
df -h /downloads
# Check NFS mount # Check NFS mount
df -h /mnt/media df -h /mnt/media

View File

@@ -24,7 +24,6 @@ NFS_SHARE_MEDIA="${NFS_SHARE_MEDIA:-/volume2/Multimédia}"
NFS_MOUNT_MEDIA="${NFS_MOUNT_MEDIA:-/mnt/media}" NFS_MOUNT_MEDIA="${NFS_MOUNT_MEDIA:-/mnt/media}"
NFS_OPTS="defaults,_netdev,nofail,x-systemd.automount,x-systemd.mount-timeout=30s" NFS_OPTS="defaults,_netdev,nofail,x-systemd.automount,x-systemd.mount-timeout=30s"
SEEDBOX_DIR="/srv/seedbox" SEEDBOX_DIR="/srv/seedbox"
DOWNLOADS_DIR="${SEEDBOX_DIR}/downloads"
REPO_URL="${REPO_URL:-https://gitea.arnodo.fr/Damien/infra-scripts.git}" REPO_URL="${REPO_URL:-https://gitea.arnodo.fr/Damien/infra-scripts.git}"
# Pre-flight checks # Pre-flight checks
@@ -75,14 +74,18 @@ main() {
ufw \ ufw \
at \ at \
git \ git \
rsync \
> /dev/null > /dev/null
# Ensure atd service is running (needed for delayed SSH lockdown)
sudo systemctl enable --now atd
# Step 4: Install Tailscale # Step 4: Install Tailscale
log_info "Installing Tailscale..." log_info "Installing Tailscale..."
curl -fsSL https://tailscale.com/install.sh | sh curl -fsSL https://tailscale.com/install.sh | sh
log_info "Connecting to Tailscale (SSH only)..." log_info "Connecting to Tailscale..."
sudo tailscale up --ssh sudo tailscale up
# Get Tailscale hostname for display # Get Tailscale hostname for display
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' ' TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
@@ -118,34 +121,36 @@ EOF
log_info "Adding current user to docker group..." log_info "Adding current user to docker group..."
sudo usermod -aG docker "$USER" sudo usermod -aG docker "$USER"
# Step 7: Configure UFW firewall # Step 7: Configure UFW firewall (initial - SSH still open on public)
log_info "Configuring UFW firewall..." log_info "Configuring UFW firewall (initial setup)..."
sudo ufw --force reset > /dev/null sudo ufw --force reset > /dev/null
sudo ufw default deny incoming > /dev/null sudo ufw default deny incoming > /dev/null
sudo ufw default allow outgoing > /dev/null sudo ufw default allow outgoing > /dev/null
# SSH temporarily on all interfaces (will be locked down after Tailscale is confirmed)
sudo ufw allow 22/tcp > /dev/null
# BitTorrent peer port (public) # BitTorrent peer port (public)
sudo ufw allow 51413/tcp > /dev/null sudo ufw allow 51413/tcp > /dev/null
sudo ufw allow 51413/udp > /dev/null sudo ufw allow 51413/udp > /dev/null
# Allow all traffic on Tailscale interface # Allow all traffic on Tailscale interface
sudo ufw allow in on tailscale0 > /dev/null sudo ufw allow in on tailscale0 > /dev/null
# Temporary SSH access (safety net)
sudo ufw allow 22/tcp > /dev/null
sudo ufw --force enable > /dev/null sudo ufw --force enable > /dev/null
# Schedule SSH rule removal in 5 minutes # Step 8: Schedule SSH lockdown via 'at' (2 minutes delay for safety)
log_warn "SSH port 22 temporarily open for 5 minutes (safety net)." log_info "Scheduling SSH lockdown to Tailscale-only in 2 minutes..."
echo "sudo ufw delete allow 22/tcp && logger 'UFW: SSH port 22 closed'" | sudo at now + 5 minutes 2>/dev/null || { log_warn "IMPORTANT: Reconnect via Tailscale SSH within 2 minutes!"
log_warn "Could not schedule automatic SSH cleanup. Run manually:" log_warn " ssh ${USER}@${TS_FQDN}"
log_warn " sudo ufw delete allow 22/tcp"
echo "sudo ufw delete allow 22/tcp" | at now + 2 minutes 2>/dev/null || {
log_warn "Failed to schedule SSH lockdown via 'at'. Manual lockdown required."
log_warn "Run manually after confirming Tailscale access: sudo ufw delete allow 22/tcp"
} }
# Step 8: Create directory structure # Step 9: Create directory structure
log_info "Creating directory structure..." log_info "Creating directory structure..."
sudo mkdir -p "$SEEDBOX_DIR" sudo mkdir -p "$SEEDBOX_DIR"
sudo mkdir -p "$DOWNLOADS_DIR"
sudo chown -R "$USER:$USER" "$SEEDBOX_DIR" sudo chown -R "$USER:$USER" "$SEEDBOX_DIR"
# Step 9: Configure NFS mount (if NFS_SERVER provided) # Step 10: Configure NFS mount (if NFS_SERVER provided)
if [[ -n "$NFS_SERVER" ]]; then if [[ -n "$NFS_SERVER" ]]; then
log_info "Configuring NFS mount..." log_info "Configuring NFS mount..."
sudo mkdir -p "$NFS_MOUNT_MEDIA" sudo mkdir -p "$NFS_MOUNT_MEDIA"
@@ -160,24 +165,42 @@ EOF
log_warn "NFS_SERVER not set. NFS mount skipped. Set it later if needed." log_warn "NFS_SERVER not set. NFS mount skipped. Set it later if needed."
fi fi
# Step 10: Clone repository # Step 11: Clone repository (sparse checkout for seedbox/ only)
log_info "Cloning infra-scripts repository..." log_info "Cloning seedbox configuration..."
if [[ -d "${SEEDBOX_DIR}/.git" ]]; then if [[ -d "${SEEDBOX_DIR}/.git" ]]; then
cd "$SEEDBOX_DIR" cd "$SEEDBOX_DIR"
git pull origin main || log_warn "Git pull failed" git pull origin main || log_warn "Git pull failed"
else else
git clone "$REPO_URL" "${SEEDBOX_DIR}/repo-tmp" # Clean any existing content
mv "${SEEDBOX_DIR}/repo-tmp/seedbox/"* "$SEEDBOX_DIR/" 2>/dev/null || true rm -rf "${SEEDBOX_DIR:?}"/*
mv "${SEEDBOX_DIR}/repo-tmp/seedbox/".* "$SEEDBOX_DIR/" 2>/dev/null || true rm -rf "${SEEDBOX_DIR}"/.[!.]* 2>/dev/null || true
rm -rf "${SEEDBOX_DIR}/repo-tmp"
cd "$SEEDBOX_DIR" cd "$SEEDBOX_DIR"
git init git init
git remote add origin "$REPO_URL" git remote add origin "$REPO_URL"
git fetch origin
git checkout -b main --track origin/main -- seedbox/ 2>/dev/null || true # Configure sparse checkout to only get seedbox/ directory
git sparse-checkout init --cone
git sparse-checkout set seedbox
# Fetch and checkout
git fetch origin main
git checkout main
# Move contents of seedbox/ to root and clean up
if [[ -d "${SEEDBOX_DIR}/seedbox" ]]; then
# Move all files including hidden ones
shopt -s dotglob
mv "${SEEDBOX_DIR}/seedbox"/* "${SEEDBOX_DIR}/" 2>/dev/null || true
shopt -u dotglob
rmdir "${SEEDBOX_DIR}/seedbox" 2>/dev/null || true
fi fi
# Step 11: Configure MOTD # Disable sparse checkout now that we have the files
git sparse-checkout disable 2>/dev/null || true
fi
# Step 12: Configure MOTD
log_info "Configuring MOTD..." log_info "Configuring MOTD..."
sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true
@@ -199,14 +222,14 @@ echo ""
echo "Docker Seedbox Server" echo "Docker Seedbox Server"
echo "─────────────────────────────────────────" echo "─────────────────────────────────────────"
echo "Access:" echo "Access:"
echo " • SSH : ${TS_FQDN}" echo " • SSH : ${TS_FQDN} (Tailscale only)"
echo " • Seeding : Public port 51413" echo " • Seeding : Public port 51413"
echo "" echo ""
echo "Services: (via Tailscale)" echo "Services: (via Tailscale)"
docker ps --format ' • {{.Names}} : {{.Status}}' 2>/dev/null || echo " Docker not running" docker ps --format ' • {{.Names}} : {{.Status}}' 2>/dev/null || echo " Docker not running"
echo "" echo ""
echo "Storage:" echo "Storage:"
echo " • Downloads : /srv/seedbox/downloads" echo " • Downloads : /downloads (local RAID)"
echo " • Media : /mnt/media (NFS)" echo " • Media : /mnt/media (NFS)"
echo "" echo ""
echo "Useful commands:" echo "Useful commands:"
@@ -219,19 +242,27 @@ MOTD
# Final summary # Final summary
echo "" echo ""
log_info "==========================================" log_info "==========================================="
log_info "Server setup complete!" log_info "Server setup complete!"
log_info "==========================================" log_info "==========================================="
echo ""
log_warn "⚠️ SSH LOCKDOWN SCHEDULED IN 2 MINUTES!"
log_warn " Reconnect NOW via Tailscale:"
echo ""
echo " ssh ${USER}@${TS_FQDN}"
echo "" echo ""
echo "Server accessible at:" echo "Server accessible at:"
echo " SSH: ${TS_FQDN}" echo " SSH: ssh user@${TS_FQDN}"
echo "" echo ""
echo "Directory structure:" echo "Directory structure:"
echo " ${SEEDBOX_DIR}/" echo " ${SEEDBOX_DIR}/"
echo " ├── stacks/ # Docker Compose stacks" echo " ├── stacks/ # Docker Compose stacks"
echo " ├── downloads/ # Local downloads (SSD)"
echo " └── .env # Secrets (created by Gitea Actions)" echo " └── .env # Secrets (created by Gitea Actions)"
echo "" echo ""
echo "Storage:"
echo " • Downloads: /downloads (local RAID - 3.4T)"
echo " • Media: /mnt/media (NFS)"
echo ""
echo "NFS mount:" echo "NFS mount:"
if [[ -n "$NFS_SERVER" ]]; then if [[ -n "$NFS_SERVER" ]]; then
echo " ${NFS_SERVER}:${NFS_SHARE_MEDIA} -> ${NFS_MOUNT_MEDIA}" echo " ${NFS_SERVER}:${NFS_SHARE_MEDIA} -> ${NFS_MOUNT_MEDIA}"
@@ -240,12 +271,12 @@ MOTD
fi fi
echo "" echo ""
echo "Next steps:" echo "Next steps:"
echo " 1. Configure Gitea secrets (see README.md)" echo " 1. Reconnect via Tailscale SSH IMMEDIATELY"
echo " 2. Push to main branch to trigger deployment" echo " 2. Configure Gitea secrets (see README.md)"
echo " 3. Services will be available at <service>.taila5ad8.ts.net" echo " 3. Push to main branch to trigger deployment"
echo " 4. Services will be available at <service>.taila5ad8.ts.net"
echo "" echo ""
log_warn "SSH port 22 will be closed in 5 minutes." log_info "SSH access via Tailscale: ssh user@${TS_FQDN}"
log_warn "Use Tailscale SSH: ssh ${TS_FQDN}"
echo "" echo ""
} }

View File

@@ -18,7 +18,7 @@ TV series management and automation.
| Path in container | Host path | Description | | Path in container | Host path | Description |
|-------------------|-----------|-------------| |-------------------|-----------|-------------|
| `/config` | Docker volume | Sonarr configuration | | `/config` | Docker volume | Sonarr configuration |
| `/downloads` | `/srv/seedbox/downloads` | Download directory | | `/downloads` | `/downloads` | Download directory (local RAID) |
| `/media` | `/mnt/media` | Media library (NFS) | | `/media` | `/mnt/media` | Media library (NFS) |
## Configuration ## Configuration

View File

@@ -29,7 +29,7 @@ services:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- config:/config - config:/config
- /srv/seedbox/downloads:/downloads - /downloads:/downloads
- /mnt/media:/media - /mnt/media:/media
restart: unless-stopped restart: unless-stopped

View File

@@ -0,0 +1,16 @@
{
"TCP": {
"443": {
"HTTPS": true
}
},
"Web": {
"sonarr.taila5ad8.ts.net:443": {
"Handlers": {
"/": {
"Proxy": "http://127.0.0.1:8989"
}
}
}
}
}

View File

@@ -19,7 +19,7 @@ BitTorrent client with web interface, accessible via Tailscale.
| Path in container | Host path | Description | | Path in container | Host path | Description |
|-------------------|-----------|-------------| |-------------------|-----------|-------------|
| `/config` | Docker volume | Transmission configuration | | `/config` | Docker volume | Transmission configuration |
| `/downloads` | `/srv/seedbox/downloads` | Download directory (local SSD) | | `/downloads` | `/downloads` | Download directory (local RAID - 3.4T) |
| `/media` | `/mnt/media` | Media library (NFS) | | `/media` | `/mnt/media` | Media library (NFS) |
## Configuration ## Configuration

View File

@@ -36,7 +36,7 @@ services:
- PEERPORT=51413 - PEERPORT=51413
volumes: volumes:
- config:/config - config:/config
- /srv/seedbox/downloads:/downloads - /downloads:/downloads
- /mnt/media:/media - /mnt/media:/media
restart: unless-stopped restart: unless-stopped