Add proxyless install mode for existing reverse proxies
This commit is contained in:
@@ -25,6 +25,12 @@ docker compose up -d
|
|||||||
Done! Your node is live at `https://your-domain.com` with automatic SSL. No build step. No dependencies. No fuss.
|
Done! Your node is live at `https://your-domain.com` with automatic SSL. No build step. No dependencies. No fuss.
|
||||||
Database migrations run automatically on startup and during updates.
|
Database migrations run automatically on startup and during updates.
|
||||||
|
|
||||||
|
If your server already has nginx or another reverse proxy using `80/443`, use the advanced mode instead:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://synapsis.social/install.sh | PROXY=none bash
|
||||||
|
```
|
||||||
|
|
||||||
**Updating (migrations run automatically):**
|
**Updating (migrations run automatically):**
|
||||||
```bash
|
```bash
|
||||||
docker compose pull && docker compose up -d
|
docker compose pull && docker compose up -d
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# Synapsis - Docker Compose (Production, External Reverse Proxy)
|
||||||
|
# Uses pre-built image from GitHub Container Registry
|
||||||
|
#
|
||||||
|
# Intended for hosts that already run nginx/Traefik/Caddy on 80/443.
|
||||||
|
# Synapsis binds only to localhost so your existing proxy can forward to it.
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:16-alpine
|
||||||
|
container_name: synapsis-db
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: ${DB_USER:-synapsis}
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme}
|
||||||
|
POSTGRES_DB: ${DB_NAME:-synapsis}
|
||||||
|
PGDATA: /var/lib/postgresql/data/pgdata
|
||||||
|
volumes:
|
||||||
|
- postgres_data:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- synapsis-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-synapsis} -d ${DB_NAME:-synapsis}"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 1G
|
||||||
|
reservations:
|
||||||
|
memory: 256M
|
||||||
|
|
||||||
|
app:
|
||||||
|
image: ghcr.io/gnosyslabs/synapsis:latest
|
||||||
|
container_name: synapsis-app
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:${APP_HOST_PORT:-3000}:3000"
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgresql://${DB_USER:-synapsis}:${DB_PASSWORD:-changeme}@postgres:5432/${DB_NAME:-synapsis}
|
||||||
|
AUTH_SECRET: ${AUTH_SECRET}
|
||||||
|
DOMAIN: ${DOMAIN:-localhost}
|
||||||
|
NEXT_PUBLIC_NODE_DOMAIN: ${NEXT_PUBLIC_NODE_DOMAIN:-}
|
||||||
|
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-}
|
||||||
|
ALLOW_LOCALHOST: ${ALLOW_LOCALHOST:-}
|
||||||
|
ADMIN_EMAILS: ${ADMIN_EMAILS}
|
||||||
|
BOT_MAX_PER_USER: ${BOT_MAX_PER_USER:-5}
|
||||||
|
PORT: "3000"
|
||||||
|
NODE_ENV: production
|
||||||
|
volumes:
|
||||||
|
- uploads_data:/app/uploads
|
||||||
|
networks:
|
||||||
|
- synapsis-network
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:3000/api/health || exit 1"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 1G
|
||||||
|
reservations:
|
||||||
|
memory: 256M
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres_data:
|
||||||
|
driver: local
|
||||||
|
uploads_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
synapsis-network:
|
||||||
|
driver: bridge
|
||||||
@@ -38,6 +38,10 @@ DB_NAME=synapsis
|
|||||||
# Or set a specific port: PORT=3000
|
# Or set a specific port: PORT=3000
|
||||||
PORT=auto
|
PORT=auto
|
||||||
|
|
||||||
|
# External reverse proxy mode only:
|
||||||
|
# Port on localhost to expose Synapsis for nginx/Traefik/Caddy
|
||||||
|
# APP_HOST_PORT=3000
|
||||||
|
|
||||||
# Allow localhost domains in production (set only for local testing)
|
# Allow localhost domains in production (set only for local testing)
|
||||||
# ALLOW_LOCALHOST=1
|
# ALLOW_LOCALHOST=1
|
||||||
|
|
||||||
|
|||||||
+50
-1
@@ -6,6 +6,8 @@ Production Docker deployment using pre-built images from GitHub Container Regist
|
|||||||
|
|
||||||
## 🚀 Quick Start
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
This is the default install path for a fresh VPS where Synapsis should manage its own HTTPS with Caddy.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://synapsis.social/install.sh | bash
|
curl -fsSL https://synapsis.social/install.sh | bash
|
||||||
nano /opt/synapsis/.env # Add your domain and admin email
|
nano /opt/synapsis/.env # Add your domain and admin email
|
||||||
@@ -24,6 +26,7 @@ Your node is live at `https://your-domain.com` with automatic SSL.
|
|||||||
| **Server** | 2GB RAM, 2 CPU cores, 20GB SSD (minimum) |
|
| **Server** | 2GB RAM, 2 CPU cores, 20GB SSD (minimum) |
|
||||||
| **Domain** | A domain or subdomain pointing to your server |
|
| **Domain** | A domain or subdomain pointing to your server |
|
||||||
| **Docker** | Installed automatically by `install.sh` when missing on supported Linux hosts |
|
| **Docker** | Installed automatically by `install.sh` when missing on supported Linux hosts |
|
||||||
|
| **Ports** | `80` and `443` must be free for the default Caddy install |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -46,6 +49,44 @@ Optional (advanced):
|
|||||||
**Port Configuration:**
|
**Port Configuration:**
|
||||||
- `PORT=auto` (default) — Automatically finds an available port between 3000-3020
|
- `PORT=auto` (default) — Automatically finds an available port between 3000-3020
|
||||||
- `PORT=3000` — Use a specific port instead
|
- `PORT=3000` — Use a specific port instead
|
||||||
|
- `APP_HOST_PORT=3000` — Only used in advanced `PROXY=none` installs
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Advanced: Existing nginx/Traefik/Caddy Host
|
||||||
|
|
||||||
|
If your server already runs a reverse proxy on `80/443`, use the advanced mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://synapsis.social/install.sh | PROXY=none bash
|
||||||
|
nano /opt/synapsis/.env
|
||||||
|
cd /opt/synapsis
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
This mode:
|
||||||
|
- skips the bundled Caddy service
|
||||||
|
- binds Synapsis to `127.0.0.1:${APP_HOST_PORT:-3000}`
|
||||||
|
- expects your existing reverse proxy to forward traffic there
|
||||||
|
|
||||||
|
Example nginx site:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
server_name node.example.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:3000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -98,7 +139,15 @@ docker compose logs app --tail=50 # Check errors
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Port already in use
|
### Port already in use
|
||||||
`PORT=auto` (default) automatically finds an available port. If you set a specific port that's taken:
|
If the installer says `80` or `443` is already in use, another reverse proxy is already bound there.
|
||||||
|
|
||||||
|
Use a fresh VPS for the default Caddy install, or rerun the installer in advanced mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://synapsis.social/install.sh | PROXY=none bash
|
||||||
|
```
|
||||||
|
|
||||||
|
For the application port itself, `PORT=auto` (default) automatically finds an available port. If you set a specific port that's taken:
|
||||||
```bash
|
```bash
|
||||||
# Check what's using the port
|
# Check what's using the port
|
||||||
sudo netstat -tlnp | grep :3000
|
sudo netstat -tlnp | grep :3000
|
||||||
|
|||||||
+73
-7
@@ -6,6 +6,7 @@ REPO="${REPO:-GnosysLabs/Synapsis}"
|
|||||||
REF="${REF:-main}"
|
REF="${REF:-main}"
|
||||||
INSTALL_DIR="${1:-${INSTALL_DIR:-/opt/synapsis}}"
|
INSTALL_DIR="${1:-${INSTALL_DIR:-/opt/synapsis}}"
|
||||||
PUBLIC_INSTALL_URL="${PUBLIC_INSTALL_URL:-https://synapsis.social/install.sh}"
|
PUBLIC_INSTALL_URL="${PUBLIC_INSTALL_URL:-https://synapsis.social/install.sh}"
|
||||||
|
PROXY="${PROXY:-caddy}"
|
||||||
|
|
||||||
require_command() {
|
require_command() {
|
||||||
if ! command -v "$1" >/dev/null 2>&1; then
|
if ! command -v "$1" >/dev/null 2>&1; then
|
||||||
@@ -21,6 +22,53 @@ download_file() {
|
|||||||
curl -fsSL "${RAW_BASE}/${source_path}" -o "${target_path}"
|
curl -fsSL "${RAW_BASE}/${source_path}" -o "${target_path}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
normalize_proxy_mode() {
|
||||||
|
case "$1" in
|
||||||
|
caddy|none)
|
||||||
|
printf '%s\n' "$1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "❌ Unsupported PROXY mode: $1" >&2
|
||||||
|
echo " Supported values: caddy, none" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
is_port_in_use() {
|
||||||
|
port="$1"
|
||||||
|
|
||||||
|
if command -v ss >/dev/null 2>&1; then
|
||||||
|
ss -tulpn 2>/dev/null | grep -q ":${port} "
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v lsof >/dev/null 2>&1; then
|
||||||
|
lsof -iTCP:"${port}" -sTCP:LISTEN >/dev/null 2>&1
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v netstat >/dev/null 2>&1; then
|
||||||
|
netstat -tulpn 2>/dev/null | grep -q ":${port} "
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_caddy_ports_available() {
|
||||||
|
for port in 80 443; do
|
||||||
|
if is_port_in_use "$port"; then
|
||||||
|
echo "❌ Port ${port} is already in use on this host." >&2
|
||||||
|
echo " The default Synapsis install includes Caddy and needs ports 80/443." >&2
|
||||||
|
echo " If this is a fresh VPS, free those ports and rerun the installer." >&2
|
||||||
|
echo " If this host already runs nginx or another reverse proxy, rerun with:" >&2
|
||||||
|
echo " curl -fsSL ${PUBLIC_INSTALL_URL} | PROXY=none bash" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
set_env_value() {
|
set_env_value() {
|
||||||
file="$1"
|
file="$1"
|
||||||
key="$2"
|
key="$2"
|
||||||
@@ -73,6 +121,7 @@ require_command mkdir
|
|||||||
require_command cp
|
require_command cp
|
||||||
|
|
||||||
RAW_BASE="https://raw.githubusercontent.com/${REPO}/${REF}"
|
RAW_BASE="https://raw.githubusercontent.com/${REPO}/${REF}"
|
||||||
|
PROXY="$(normalize_proxy_mode "${PROXY}")"
|
||||||
|
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo " Synapsis Docker Installer"
|
echo " Synapsis Docker Installer"
|
||||||
@@ -80,17 +129,27 @@ echo "========================================"
|
|||||||
echo " Repo: ${REPO}"
|
echo " Repo: ${REPO}"
|
||||||
echo " Ref: ${REF}"
|
echo " Ref: ${REF}"
|
||||||
echo " Install dir: ${INSTALL_DIR}"
|
echo " Install dir: ${INSTALL_DIR}"
|
||||||
|
echo " Proxy mode: ${PROXY}"
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
|
|
||||||
install_docker_if_needed
|
install_docker_if_needed
|
||||||
mkdir -p "${INSTALL_DIR}"
|
mkdir -p "${INSTALL_DIR}"
|
||||||
|
|
||||||
download_file "docker-compose.yml" "${INSTALL_DIR}/docker-compose.yml"
|
|
||||||
download_file "docker/Caddyfile" "${INSTALL_DIR}/Caddyfile"
|
|
||||||
download_file "docker/caddy-entrypoint.sh" "${INSTALL_DIR}/caddy-entrypoint.sh"
|
|
||||||
download_file "docker/.env.example" "${INSTALL_DIR}/.env.example"
|
download_file "docker/.env.example" "${INSTALL_DIR}/.env.example"
|
||||||
|
case "${PROXY}" in
|
||||||
chmod 755 "${INSTALL_DIR}/caddy-entrypoint.sh"
|
caddy)
|
||||||
|
ensure_caddy_ports_available
|
||||||
|
download_file "docker-compose.yml" "${INSTALL_DIR}/docker-compose.yml"
|
||||||
|
download_file "docker/Caddyfile" "${INSTALL_DIR}/Caddyfile"
|
||||||
|
download_file "docker/caddy-entrypoint.sh" "${INSTALL_DIR}/caddy-entrypoint.sh"
|
||||||
|
chmod 755 "${INSTALL_DIR}/caddy-entrypoint.sh"
|
||||||
|
rm -f "${INSTALL_DIR}/docker-compose.proxyless.yml"
|
||||||
|
;;
|
||||||
|
none)
|
||||||
|
download_file "docker-compose.proxyless.yml" "${INSTALL_DIR}/docker-compose.yml"
|
||||||
|
rm -f "${INSTALL_DIR}/Caddyfile" "${INSTALL_DIR}/caddy-entrypoint.sh"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
if [ ! -f "${INSTALL_DIR}/.env" ]; then
|
if [ ! -f "${INSTALL_DIR}/.env" ]; then
|
||||||
cp "${INSTALL_DIR}/.env.example" "${INSTALL_DIR}/.env"
|
cp "${INSTALL_DIR}/.env.example" "${INSTALL_DIR}/.env"
|
||||||
@@ -120,5 +179,12 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
echo "Next steps:"
|
echo "Next steps:"
|
||||||
echo " 1. Review ${INSTALL_DIR}/.env"
|
echo " 1. Review ${INSTALL_DIR}/.env"
|
||||||
echo " 2. Start Synapsis:"
|
if [ "${PROXY}" = "caddy" ]; then
|
||||||
echo " cd ${INSTALL_DIR} && docker compose up -d"
|
echo " 2. Start Synapsis:"
|
||||||
|
echo " cd ${INSTALL_DIR} && docker compose up -d"
|
||||||
|
else
|
||||||
|
echo " 2. Start Synapsis:"
|
||||||
|
echo " cd ${INSTALL_DIR} && docker compose up -d"
|
||||||
|
echo " 3. Configure your existing reverse proxy to forward to:"
|
||||||
|
echo " http://127.0.0.1:\${APP_HOST_PORT:-3000}"
|
||||||
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user