This is an old revision of the document!
Table of Contents
Discourse Installation on Fresh Ubuntu Server with Backup Restoration
Prerequisites
- Fresh Ubuntu Server installation
- Root or sudo access
- Existing Discourse backup file (.tar.gz)
- Domain name pointed to server IP
Installation Steps
1. Initial System Setup
sudo -s apt-get install git
2. Clone Discourse Docker Repository
git clone https://github.com/discourse/discourse_docker.git /var/discourse cd /var/discourse chmod 700 containers
3. Edit app.yml for Reverse Proxy Configuration
Before running discourse-setup, edit ~/var/discourse/containers/app.yml:
Comment Out SSL Templates
templates: - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/web.template.yml" - "templates/web.ratelimited.template.yml" ## SSL templates - COMMENTED OUT for reverse proxy setup # - "templates/web.ssl.template.yml" # - "templates/web.letsencrypt.ssl.template.yml"
Change Port Mapping
expose: - "8080:80" # expose container port 80 on host port 8080 # - "443:443" # https - commented out
Rationale: Reverse proxy (nginx) will handle TLS termination and forward HTTP traffic to port 8080. Configuring this before setup avoids needing to rebuild the container later.
4. Run Discourse Setup
./discourse-setup --skip-connection-test
Note: This process takes time. Good opportunity for a coffee break.
Configuration Parameters:
Provide these values during setup:
- Hostname:
example.com - Developer Email:
admin@example.com - SMTP Server: Your SMTP server address
- SMTP Port: Typically
587for TLS - SMTP Username: Your SMTP username
- SMTP Password: Your SMTP password
- Notification Email: Email address for outgoing notifications
- Let's Encrypt Email:
OFF(critical - disables Let's Encrypt since TLS will be handled by reverse proxy)
5. Copy Backup File to Server
From your local machine (or source location), copy the backup file:
scp -P <ssh-port> backup-file.tar.gz user@example.com:/var/discourse/shared/standalone/backups/default/
Notes:
- Replace
<ssh-port>with your SSH port (default is 22, use-P 22or omit if default) - Replace
backup-file.tar.gzwith your actual backup filename - Adjust username and hostname as needed for your setup
6. Restore Backup from Admin Panel
- Access Discourse at
http://example.com(or server IP if DNS not yet configured) - Navigate to Admin → Backups
- Locate the uploaded backup file in the list
- Click Restore on the backup file
- Confirm the restoration
Note: The restoration process will restart Discourse and may take several minutes depending on backup size.
7. Install and Configure Nginx
#This nginx setup in this guide is but one valid configuration.
apt-get install nginx
8. Create Nginx Configuration (Example)
Note: This configuration represents one working approach for proxying Discourse through nginx. Alternative configurations may work equally well depending on your specific requirements, existing infrastructure, or preferred nginx patterns.
Create /etc/nginx/sites-available/example.com:
server { listen 80; server_name example.com; location / { proxy_pass http://localhost:8080; 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 X-Forwarded-Host $host; # Required for Discourse proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Timeouts proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; # Buffer settings proxy_buffering off; proxy_redirect off; } client_max_body_size 10m; }
Key Discourse Requirements:
X-Forwarded-ForandX-Forwarded-Hostheaders- WebSocket support (
proxy_http_version 1.1,Upgrade,Connectionheaders) - Buffering disabled (
proxy_buffering off) - File upload size limit (
client_max_body_size 10m)
9. Enable Nginx Configuration
# Remove default site (prevents conflicts) rm /etc/nginx/sites-enabled/default # Create symlink to enable site ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ # Test configuration nginx -t # Reload nginx systemctl reload nginx
10. Install Certbot
snap install --classic certbot
11. Generate SSL Certificate
certbot
Certbot will run interactively and:
- Detect the nginx configuration for your domain
- Prompt for domain selection
- Automatically generate Let's Encrypt certificates
- Modify nginx configuration to enable HTTPS
- Configure automatic certificate renewal
12. Reload Nginx
systemctl reload nginx
Your Discourse instance should now be accessible at https://example.com
Important Notes
YAML Sensitivity
- Be extremely careful with whitespace and alignment when editing
app.yml - Validate syntax at http://www.yamllint.com/ if needed
Undocumented Discourse Behavior
- The
8080:80port mapping for reverse proxy setups is not well-documented in official Discourse guides - Entering
OFFfor Let's Encrypt email is not clearly documented - Commenting out SSL templates is required but not obvious for reverse proxy scenarios
- Discourse's Docker setup is optimized for their standard configuration, making reverse proxy setups unnecessarily opaque
Security Considerations
- Use strong, unique passwords for SMTP and admin accounts
- Secure transfer of backup files containing sensitive data
- Review and update SMTP credentials appropriately for your environment
- Consider firewall rules to restrict access to port 8080
Troubleshooting
Nginx Shows Default Welcome Page
- Verify default site removed:
ls /etc/nginx/sites-enabled/ - Confirm symlink exists:
ls -la /etc/nginx/sites-enabled/example.com - Test config:
nginx -t - Reload:
systemctl reload nginx
SSL Certificate Permission Errors
- Run nginx test with sudo:
sudo nginx -t - Check for other configs referencing non-existent certificates
- Ensure only HTTP (port 80) configuration exists before running certbot
Backup Not Visible in Admin Panel
- Verify file copied to correct path:
/var/discourse/shared/standalone/backups/default/ - Check file permissions:
ls -la /var/discourse/shared/standalone/backups/default/ - Ensure filename ends in
.tar.gz
==== SCP Syntax Issues ====https://wiki.scorpi.us/doku.php?id=discourse&do=
- Port flag is capital
-Pnot lowercase-p - Syntax:
scp -P <port> <source> <user>@<host>:<destination> - Example:
scp -P 22 backup.tar.gz user@host:/path/
