Index: server/db/db.go
===================================================================
--- server/db/db.go	(revision b715712c7d5d3ee27c932a8a9d8e0a2bc6e85127)
+++ server/db/db.go	(revision 0cee8ec194e8e518624fcec244168861a6a7de27)
@@ -11,5 +11,5 @@
 	"strings"
 
-	_ "github.com/lib/pq"
+	"github.com/lib/pq"
 )
 
@@ -19,5 +19,5 @@
 // which directory the program is started from.
 //
-//go:embed schema_creation.sql data_load.sql
+//go:embed schema_creation.sql advanced_db.sql data_load.sql
 var sqlScripts embed.FS
 
@@ -36,8 +36,24 @@
 	)
 
-	var err error
-	DB, err = sql.Open("postgres", dsn)
-	if err != nil {
-		return fmt.Errorf("sql.Open: %w", err)
+	// Optional SSH tunnel, the same thing DBeaver's "SSH" tab does. When
+	// SSH_HOST is set, DBHOST/DBPORT are resolved from the SSH server's side
+	// (for the faculty server that is usually localhost:5432).
+	if sshHost := os.Getenv("SSH_HOST"); sshHost != "" {
+		dialer, err := newSSHDialer(sshHost)
+		if err != nil {
+			return err
+		}
+		connector, err := pq.NewConnector(dsn)
+		if err != nil {
+			return fmt.Errorf("pq.NewConnector: %w", err)
+		}
+		connector.Dialer(dialer)
+		DB = sql.OpenDB(connector)
+	} else {
+		var err error
+		DB, err = sql.Open("postgres", dsn)
+		if err != nil {
+			return fmt.Errorf("sql.Open: %w", err)
+		}
 	}
 	if err := DB.Ping(); err != nil {
@@ -72,10 +88,12 @@
 }
 
-// InitSchema runs schema_creation.sql then data_load.sql.
+// InitSchema runs schema_creation.sql, advanced_db.sql (P7) and data_load.sql.
 // Destructive: drops the `project` schema. Intended for the -init flag.
 func InitSchema() error {
-	log.Println("Running schema_creation.sql ...")
-	if err := runScript("schema_creation.sql"); err != nil {
-		return err
+	for _, name := range []string{"schema_creation.sql", "advanced_db.sql"} {
+		log.Printf("Running %s ...", name)
+		if err := runScript(name); err != nil {
+			return err
+		}
 	}
 	if err := LoadData(); err != nil {
