diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..449be60 --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Admin Panel Environment Variables + +# Flask +SECRET_KEY=your-secret-key-here +DEBUG=False + +# Database (SQLite for dev, PostgreSQL for production) +DATABASE_URL=sqlite:///data/admin_panel.db +# DATABASE_URL=postgresql://admin_user:admin_pass@localhost/admin_hosting_db + +# JWT +JWT_SECRET_KEY=your-jwt-secret-here + +# Customer API +CUSTOMER_API_URL=http://customer-backend:5000 +CUSTOMER_API_INTERNAL_KEY=your-internal-api-key-here + +# CORS +CORS_ORIGINS=https://admin.argeict.net,http://localhost:5173 + diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..b093355 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,178 @@ +# Admin Panel Deployment Guide + +## 🚀 Quick Start + +### 1. Clone Repository +```bash +cd /opt +git clone https://gitea.argeict.net/argeict/admin-panel.git +cd admin-panel +``` + +### 2. Configure Environment +```bash +cp .env.example .env +nano .env +``` + +Update the following: +- `SECRET_KEY` - Random secret key +- `JWT_SECRET_KEY` - Random JWT secret +- `CUSTOMER_API_URL` - Customer platform API URL +- `CUSTOMER_API_INTERNAL_KEY` - Internal API key +- `CORS_ORIGINS` - Allowed origins + +### 3. Build and Run +```bash +docker-compose up -d --build +``` + +### 4. Initialize Database +```bash +docker exec -it admin-panel-backend python -c " +from app.main import app, db +from app.models import AdminUser +with app.app_context(): + db.create_all() + # Create default admin + admin = AdminUser( + username='admin', + email='admin@argeict.net', + full_name='System Admin' + ) + admin.set_password('admin123') + db.session.add(admin) + db.session.commit() + print('Database initialized!') +" +``` + +## 🌐 Nginx Configuration + +### Backend API (admin-api.argeict.net) +```nginx +server { + listen 80; + server_name admin-api.argeict.net; + + location / { + proxy_pass http://localhost:5001; + 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; + } +} +``` + +### Frontend (admin.argeict.net) +```nginx +server { + listen 80; + server_name admin.argeict.net; + + location / { + proxy_pass http://localhost:5173; + 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; + } +} +``` + +### Enable SSL with Certbot +```bash +certbot --nginx -d admin.argeict.net -d admin-api.argeict.net +``` + +## 📊 Default Credentials + +**Username:** admin +**Password:** admin123 + +⚠️ **IMPORTANT:** Change the default password immediately after first login! + +## 🔧 Maintenance + +### View Logs +```bash +docker-compose logs -f backend +docker-compose logs -f frontend +``` + +### Restart Services +```bash +docker-compose restart +``` + +### Update Application +```bash +git pull +docker-compose up -d --build +``` + +### Backup Database +```bash +docker cp admin-panel-backend:/app/data/admin_panel.db ./backup-$(date +%Y%m%d).db +``` + +## 🔐 Security Checklist + +- [ ] Change default admin password +- [ ] Update SECRET_KEY and JWT_SECRET_KEY +- [ ] Configure CORS_ORIGINS properly +- [ ] Enable SSL/HTTPS +- [ ] Set up firewall rules +- [ ] Regular database backups +- [ ] Monitor audit logs + +## 📝 API Endpoints + +### Authentication +- `POST /api/auth/login` - Admin login +- `GET /api/auth/me` - Get current admin +- `POST /api/auth/logout` - Logout + +### Plans +- `GET /api/plans` - List all plans +- `POST /api/plans` - Create plan +- `PUT /api/plans/:id` - Update plan +- `DELETE /api/plans/:id` - Delete plan + +### CF Accounts +- `GET /api/cf-accounts` - List CF accounts +- `POST /api/cf-accounts` - Create CF account +- `PUT /api/cf-accounts/:id` - Update CF account +- `DELETE /api/cf-accounts/:id` - Delete CF account + +### Customers +- `GET /api/customers` - List customers +- `GET /api/customers/:id` - Get customer details +- `PUT /api/customers/:id/plan` - Update customer plan + +## 🐛 Troubleshooting + +### Backend not starting +```bash +docker logs admin-panel-backend +``` + +### Frontend not building +```bash +docker logs admin-panel-frontend +``` + +### Database issues +```bash +docker exec -it admin-panel-backend python -c " +from app.main import app, db +with app.app_context(): + db.create_all() +" +``` + +## 📞 Support + +For issues, check the logs or contact the development team. + diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..22b1547 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Install dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application +COPY . . + +# Create data directory for SQLite +RUN mkdir -p /app/data + +# Expose port +EXPOSE 5001 + +# Run application +CMD ["python", "-m", "app.main"] + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4546eab --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,44 @@ +version: '3.8' + +services: + # Backend API + backend: + build: ./backend + container_name: admin-panel-backend + restart: unless-stopped + ports: + - "5001:5001" + environment: + - SECRET_KEY=${SECRET_KEY} + - DATABASE_URL=${DATABASE_URL} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - CUSTOMER_API_URL=${CUSTOMER_API_URL} + - CUSTOMER_API_INTERNAL_KEY=${CUSTOMER_API_INTERNAL_KEY} + - CORS_ORIGINS=${CORS_ORIGINS} + volumes: + - ./backend:/app + - admin-db-data:/app/data + networks: + - admin-network + + # Frontend + frontend: + build: ./frontend + container_name: admin-panel-frontend + restart: unless-stopped + ports: + - "5173:80" + environment: + - VITE_API_URL=https://admin-api.argeict.net + depends_on: + - backend + networks: + - admin-network + +volumes: + admin-db-data: + +networks: + admin-network: + driver: bridge + diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..cc81d13 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,27 @@ +FROM node:18-alpine as build + +WORKDIR /app + +# Install dependencies +COPY package.json . +RUN npm install + +# Copy source +COPY . . + +# Build +RUN npm run build + +# Production stage +FROM nginx:alpine + +# Copy built files +COPY --from=build /app/dist /usr/share/nginx/html + +# Copy nginx config +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] + diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..c1f4edd --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,24 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json; + + # SPA routing + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} +