# Vortexi OSS An open-source revival based off of the Syntax[.]eco source code. --- ## Quick Start (Docker) ### 1. Run Setup ```bash ./setup.sh ``` This wizard will: - Ask for your domain name (or default to `localhost`) and replace any old domains throughout the project. - Generate a new RCC access key and copy over the settings JSON. ### 2. Start the Stack ```bash ./start.sh ``` `./start.sh` runs `docker compose up --build`. On first startup, the container automatically: - Generates all missing RSA 1024-bit, 2048-bit, and gameserver signing keys into `app/files/` - Waits for PostgreSQL and Redis to be ready - Runs `db.create_all()` to build all database tables - Creates an **Admin** user with full permissions and prints the username and generated password right in the console output Once started, the site will be accessible on port `3003` (e.g. `http://localhost:3003`). --- ## Configuration & Environment Variables All settings are configured inside the [`.env`](file:///.env) file (copied from [`.env.example`](file:///.env.example)). Key settings: - `BASE_DOMAIN` - Your main domain (e.g. `yourdomain.com` or `localhost`). - `BASE_URL` - Full base URL (e.g. `https://www.yourdomain.com` or `http://localhost:3003`). - `RCC_ACCESS_KEY` - The access key used for RCCService and FFlags settings. - `USE_LOCAL_STORAGE` - Set to `True` to store and serve assets locally in `./download_cache` without needing an AWS S3 bucket. - `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` - Database credentials. - `FLASK_SESSION_KEY` - Session secret (auto-generated if left blank). - `CLOUDFLARE_TURNSTILE_SITE_KEY` / `CLOUDFLARE_TURNSTILE_SECRET_KEY` - For captcha verification on signup/login. - `DISCORD_BOT_TOKEN` / `DISCORD_CLIENT_ID` / `DISCORD_CLIENT_SECRET` - For Discord linking and bot functionality. - `MAILJET_APIKEY` / `MAILJET_SECRETKEY` - For email verification and password resets. --- ## Reverse Proxy Examples You should run a reverse proxy in front of port `3003` for SSL and subdomains. ### Caddy ```caddy yourdomain.com, *.yourdomain.com { reverse_proxy localhost:3003 } ``` ### Nginx ```nginx server { listen 80; server_name yourdomain.com *.yourdomain.com; client_max_body_size 50M; location / { proxy_pass http://127.0.0.1:3003; 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; } } ``` ### Apache2 ```apache ServerName yourdomain.com ServerAlias *.yourdomain.com ProxyPreserveHost On ProxyRequests Off Require all granted ProxyPass / http://127.0.0.1:3003/ ProxyPassReverse / http://127.0.0.1:3003/ LimitRequestBody 209715200 ``` --- ## Helpful Commands - **Stop containers:** ```bash docker compose down ``` - **View live logs:** ```bash docker compose logs -f web ``` - **Access Flask shell inside container:** ```bash docker compose exec web flask shell ``` - **Run in local debug mode (without Docker):** ```bash ./debug.sh ```