A containerized Satisfactory dedicated server with Cloudflare Tunnel for secure, semi-public access.
- 🐳 Docker Compose orchestration for easy management
- 🔒 Cloudflare Tunnel integration for secure access without port forwarding
- 💾 Automatic backups with configurable retention
- 📊 Health monitoring with Discord notifications
- 🎮 Mod support with installation scripts
- ⚙️ Environment-based configuration (no hardcoded secrets)
# 1. Run setup
./setup.sh
# 2. Configure .env (edit required secrets)
nano .env
# 3. Start server
make start
# 4. Check status
make status- Docker and Docker Compose installed
- At least 8GB RAM available
- ~10GB free disk space
- Cloudflare account with Zero Trust (for tunnel setup)
satisfactory-server/
├── README.md # This file
├── CHANGELOG.md # Version history
├── Makefile # Task automation
├── setup.sh # Initial setup script
├── docker-compose.yml # Container orchestration
├── .env.example # Configuration template
│
├── config/ # Configuration files
│ └── cloudflared/ # Cloudflare tunnel config
│
├── docs/ # Documentation
│ ├── CLOUDFLARE_ZERO_TRUST_SETUP.md
│ ├── FRIEND_GUIDE.md
│ ├── MODS_GUIDE.md
│ └── ...
│
├── scripts/ # Management scripts
│ ├── main.sh # Unified CLI
│ ├── lib/ # Shared libraries
│ ├── server/ # Server operations
│ ├── mods/ # Mod management
│ ├── network/ # Network operations
│ └── setup/ # Setup utilities
│
└── data/ # Runtime data (gitignored)
├── backups/ # Automatic backups
├── gamefiles/ # Game installation
├── logs/ # Application logs
└── saved/ # Game saves
Edit .env and configure these required values:
| Variable | Description | Where to Get |
|---|---|---|
CLOUDFLARE_TUNNEL_TOKEN |
Tunnel authentication | Cloudflare Dashboard > Networks > Tunnels |
SFTP_PASSWORD |
SFTP access password | Generate: openssl rand -base64 32 |
| Variable | Default | Description |
|---|---|---|
MAXPLAYERS |
4 | Maximum players |
MEMORY_LIMIT |
8G | Docker memory limit |
DISCORD_WEBHOOK_URL |
- | Discord notifications |
AUTOSAVEINTERVAL |
300 | Seconds between saves |
See .env.example for all available options.
make help # Show all commands
# Server lifecycle
make start # Start all services
make stop # Stop all services
make restart # Restart all services
make logs # View logs
# Operations
make status # Check server status
make backup # Create backup
make update # Update server
# Mods
make mods-install # Auto-install mods
make mods-manual FILES="~/Downloads/*.pak"
# Network
make network-verify # Verify tunnel
# Setup
make validate-env # Validate configuration
make setup-cron # Install automation./scripts/main.sh help # Show commands
./scripts/main.sh server backup # Create backup
./scripts/main.sh mods install # Install mods
./scripts/main.sh network verify # Verify tunneldocker compose up -d # Start
docker compose stop # Stop
docker compose logs -f # Logs
docker compose restart # Restart- Complete setup above
- Configure Cloudflare Zero Trust (see
docs/CLOUDFLARE_ZERO_TRUST_SETUP.md) - Set up WARP enrollment for friends (see
docs/WARP_ENROLLMENT_SETUP.md)
See docs/FRIEND_GUIDE.md for complete instructions:
- Install Cloudflare WARP client
- Enroll device using team domain
- Connect with WARP enabled to:
172.19.0.2:7777
After running make setup-cron:
- Daily backups: 4:00 AM
- Weekly backups: Sundays
- Retention: 7 daily + 4 weekly backups
make backup
# or
./scripts/main.sh server backup# Stop server
make stop
# Extract backup
cd data/backups
tar -xzf satisfactory-YYYYMMDD-HHMMSS.tar.gz -C ..
# Start server
make start# Automatic installation (tries GitHub releases)
make mods-install
# Manual installation
make mods-manual FILES="~/Downloads/*.pak"
# Generate download list
make mods-listSee docs/MODS_GUIDE.md for detailed instructions.
Configure DISCORD_WEBHOOK_URL in .env to receive:
- 📦 Backup completed
- 🔴 Server down alerts
⚠️ Server degraded warnings- ✅ Server recovered
- 🔄 Update completed
make health # Run health check
make status # Quick status- ✅ No hardcoded secrets in configuration files
- ✅ Required secrets fail fast if not configured
- ✅
.envexcluded from version control - ✅ SFTP disabled by default (opt-in with profile)
- ✅ Cloudflare Tunnel for secure access
SFTP is disabled by default. To enable:
# 1. Set strong password in .env
SFTP_PASSWORD=$(openssl rand -base64 32)
# 2. Start with SFTP profile
docker compose --profile sftp up -d# Check logs
make logs-server
# Verify configuration
make validate-env
# Check resources
free -h && df -h- Verify tunnel:
make network-verify - Check WARP client is connected
- Confirm friend enrolled in Zero Trust
- Use correct IP:
172.19.0.2:7777
See docs/FRIEND_GUIDE.md for more troubleshooting.
# Increase memory in .env
MEMORY_LIMIT=12G
MEMORY_RESERVATION=6G
# Restart
make restart| Document | Description |
|---|---|
| CLOUDFLARE_ZERO_TRUST_SETUP.md | Cloudflare configuration guide |
| FRIEND_GUIDE.md | Connection guide for friends |
| MODS_GUIDE.md | Mod installation guide |
| WARP_ENROLLMENT_SETUP.md | WARP enrollment setup |
| scripts/README.md | Scripts documentation |
- Satisfactory Server Wiki
- wolveix/satisfactory-server
- Cloudflare Tunnel Documentation
- Cloudflare WARP Client
This setup uses the wolveix/satisfactory-server Docker image (MIT License).