fix: PHP versions fallback and auto-migrate on panel start

This commit is contained in:
orohi
2026-06-17 05:45:22 +03:00
parent f94143acf0
commit 52c4c785df
7 changed files with 54 additions and 32 deletions
+17
View File
@@ -0,0 +1,17 @@
package database
import (
"os"
"path/filepath"
)
func MigrationsPath() (string, error) {
if p := os.Getenv("MIGRATIONS_PATH"); p != "" {
return p, nil
}
wd, err := os.Getwd()
if err != nil {
return "", err
}
return filepath.Join(wd, "migrations"), nil
}
+1 -2
View File
@@ -126,8 +126,7 @@ func dashboardPageHTML(username string) string {
<tbody id="sites"></tbody></table></div>
</div>
<script>
async function loadPHP(){const r=await fetch('/api/v1/php-versions');const d=await r.json();const s=document.getElementById('php_version');s.innerHTML='';
(d.versions||[]).forEach(v=>{const o=document.createElement('option');o.value=v;o.textContent='PHP '+v;s.appendChild(o);});}
async function loadPHP(){const fallback=['8.1','8.2','8.3','8.4'];let versions=fallback;try{const r=await fetch('/api/v1/php-versions');const d=await r.json();if(r.ok&&d.versions&&d.versions.length)versions=d.versions;}catch(e){}const s=document.getElementById('php_version');s.innerHTML='';versions.forEach(v=>{const o=document.createElement('option');o.value=v;o.textContent='PHP '+v;s.appendChild(o);});if(versions.length)s.value=versions[versions.length-1];}
async function loadSites(){const r=await fetch('/api/v1/sites');const d=await r.json();const tb=document.getElementById('sites');tb.innerHTML='';
(d.sites||[]).forEach(site=>{const tr=document.createElement('tr');
tr.innerHTML='<td>'+site.name+'</td><td>'+site.primary_domain+'</td><td>'+(site.php_version||'-')+'</td><td><span class="badge">'+site.status+'</span></td><td><code>'+site.document_root+'</code></td>';
+12
View File
@@ -0,0 +1,12 @@
package phpversions
var Defaults = []string{"8.1", "8.2", "8.3", "8.4"}
func Contains(version string) bool {
for _, v := range Defaults {
if v == version {
return true
}
}
return false
}
+12 -15
View File
@@ -8,6 +8,7 @@ import (
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/panelhosting/panel/internal/models"
"github.com/panelhosting/panel/internal/phpversions"
)
type SiteRepository struct {
@@ -121,10 +122,7 @@ func (r *PHPVersionRepository) ListActive(ctx context.Context) ([]string, error)
SELECT version FROM php_versions WHERE is_active = true ORDER BY sort_order
`)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return defaultPHPVersions(), nil
}
return nil, err
return phpversions.Defaults, nil
}
defer rows.Close()
@@ -132,25 +130,24 @@ func (r *PHPVersionRepository) ListActive(ctx context.Context) ([]string, error)
for rows.Next() {
var v string
if err := rows.Scan(&v); err != nil {
return nil, err
return phpversions.Defaults, nil
}
versions = append(versions, v)
}
if len(versions) == 0 {
return defaultPHPVersions(), nil
if err := rows.Err(); err != nil || len(versions) == 0 {
return phpversions.Defaults, nil
}
return versions, rows.Err()
return versions, nil
}
func (r *PHPVersionRepository) IsActive(ctx context.Context, version string) (bool, error) {
var active bool
err := r.pool.QueryRow(ctx, `SELECT is_active FROM php_versions WHERE version = $1`, version).Scan(&active)
if errors.Is(err, pgx.ErrNoRows) {
return false, nil
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return phpversions.Contains(version), nil
}
return phpversions.Contains(version), nil
}
return active, err
}
func defaultPHPVersions() []string {
return []string{"8.1", "8.2", "8.3", "8.4"}
return active, nil
}