Compare commits
3 Commits
5f329bc7e3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a34f34b51 | |||
| 6695ad06a6 | |||
| cba5e8167b |
80
.gitignore
vendored
80
.gitignore
vendored
@@ -1,40 +1,40 @@
|
|||||||
# Gitea data directory
|
# Gitea data directory
|
||||||
data/
|
data/
|
||||||
|
|
||||||
# Database files
|
# Database files
|
||||||
*.db
|
*.db
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
|
||||||
# Log files
|
# Log files
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
# Environment files
|
# Environment files
|
||||||
.env
|
.env
|
||||||
|
|
||||||
# System files
|
# System files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
# Docker volumes
|
# Docker volumes
|
||||||
volumes/
|
volumes/
|
||||||
|
|
||||||
# Gitea directories
|
# Gitea directories
|
||||||
gitea/*
|
gitea/*
|
||||||
!gitea/ssl/
|
!gitea/ssl/
|
||||||
!gitea/conf/
|
!gitea/conf/
|
||||||
|
|
||||||
# SSL certificates (should not be in version control)
|
# SSL certificates (should not be in version control)
|
||||||
gitea/ssl/*.pem
|
gitea/ssl/*.pem
|
||||||
gitea/ssl/*.key
|
gitea/ssl/*.key
|
||||||
gitea/ssl/*.crt
|
gitea/ssl/*.crt
|
||||||
|
|
||||||
# Gitea user data and logs
|
# Gitea user data and logs
|
||||||
gitea/gitea/*
|
gitea/gitea/*
|
||||||
gitea/git/*
|
gitea/git/*
|
||||||
gitea/ssh/*
|
gitea/ssh/*
|
||||||
gitea/data/*
|
gitea/data/*
|
||||||
|
|
||||||
# Temporary files
|
# Temporary files
|
||||||
*.tmp
|
*.tmp
|
||||||
*.temp
|
*.temp
|
||||||
*~
|
*~
|
||||||
|
|||||||
144
BACKUP-README.md
144
BACKUP-README.md
@@ -1,73 +1,73 @@
|
|||||||
# Gitea Backup Strategy
|
# Gitea Backup Strategy
|
||||||
|
|
||||||
This document outlines the backup strategy for your Gitea installation, focusing on ensuring your database is always backed up in at least one place.
|
This document outlines the backup strategy for your Gitea installation, focusing on ensuring your database is always backed up in at least one place.
|
||||||
|
|
||||||
## Backup Methods
|
## Backup Methods
|
||||||
|
|
||||||
This setup provides two complementary backup methods:
|
This setup provides two complementary backup methods:
|
||||||
|
|
||||||
### 1. PostgreSQL Database Dumps
|
### 1. PostgreSQL Database Dumps
|
||||||
|
|
||||||
Database dumps are SQL files containing all your database data. These are the most reliable way to back up a PostgreSQL database.
|
Database dumps are SQL files containing all your database data. These are the most reliable way to back up a PostgreSQL database.
|
||||||
|
|
||||||
- **Script**: `backup-gitea-db.ps1`
|
- **Script**: `backup-gitea-db.ps1`
|
||||||
- **Output**: SQL dumps in the `backups` directory, compressed as ZIP files
|
- **Output**: SQL dumps in the `backups` directory, compressed as ZIP files
|
||||||
- **Retention**: Keeps the last 10 backups by default
|
- **Retention**: Keeps the last 10 backups by default
|
||||||
|
|
||||||
### 2. Docker Volume Backups
|
### 2. Docker Volume Backups
|
||||||
|
|
||||||
This method backs up the entire PostgreSQL data volume, which includes all database files.
|
This method backs up the entire PostgreSQL data volume, which includes all database files.
|
||||||
|
|
||||||
- **Script**: `backup-volume.ps1`
|
- **Script**: `backup-volume.ps1`
|
||||||
- **Output**: TAR archives in the `backups` directory, compressed as ZIP files
|
- **Output**: TAR archives in the `backups` directory, compressed as ZIP files
|
||||||
- **Retention**: Keeps the last 5 volume backups by default
|
- **Retention**: Keeps the last 5 volume backups by default
|
||||||
|
|
||||||
## Automated Backups
|
## Automated Backups
|
||||||
|
|
||||||
You can set up automated daily backups using the included script:
|
You can set up automated daily backups using the included script:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\schedule-backup.ps1
|
.\schedule-backup.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
This creates a Windows Scheduled Task that runs the database backup script daily at 3 AM.
|
This creates a Windows Scheduled Task that runs the database backup script daily at 3 AM.
|
||||||
|
|
||||||
## Restoring from Backups
|
## Restoring from Backups
|
||||||
|
|
||||||
### Restoring from a Database Dump
|
### Restoring from a Database Dump
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\restore-gitea-db.ps1 -BackupFile "backups\gitea-db-backup-2025-03-01_10-30-00.sql.zip"
|
.\restore-gitea-db.ps1 -BackupFile "backups\gitea-db-backup-2025-03-01_10-30-00.sql.zip"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Restoring from a Volume Backup
|
### Restoring from a Volume Backup
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\restore-volume.ps1 -BackupFile "backups\postgres-volume-backup-2025-03-01_10-30-00.tar.zip"
|
.\restore-volume.ps1 -BackupFile "backups\postgres-volume-backup-2025-03-01_10-30-00.tar.zip"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Best Practices
|
## Best Practices
|
||||||
|
|
||||||
1. **Regular Backups**: Run backups at least daily
|
1. **Regular Backups**: Run backups at least daily
|
||||||
2. **Multiple Backup Methods**: Use both database dumps and volume backups
|
2. **Multiple Backup Methods**: Use both database dumps and volume backups
|
||||||
3. **Off-site Storage**: Copy your backups to an external drive or cloud storage
|
3. **Off-site Storage**: Copy your backups to an external drive or cloud storage
|
||||||
4. **Test Restores**: Periodically test restoring from your backups
|
4. **Test Restores**: Periodically test restoring from your backups
|
||||||
5. **Version Control**: Keep your Gitea configuration files in version control
|
5. **Version Control**: Keep your Gitea configuration files in version control
|
||||||
|
|
||||||
## Important Notes
|
## Important Notes
|
||||||
|
|
||||||
- **Never** run `docker-compose down -v` unless you have a recent backup
|
- **Never** run `docker-compose down -v` unless you have a recent backup
|
||||||
- When upgrading Gitea, always create a backup first
|
- When upgrading Gitea, always create a backup first
|
||||||
- The database volume (`postgres-data`) persists even when containers are stopped or removed, but can be lost if explicitly deleted
|
- The database volume (`postgres-data`) persists even when containers are stopped or removed, but can be lost if explicitly deleted
|
||||||
|
|
||||||
## Manual Backup Commands
|
## Manual Backup Commands
|
||||||
|
|
||||||
If you need to create a backup manually:
|
If you need to create a backup manually:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# Database dump
|
# Database dump
|
||||||
.\backup-gitea-db.ps1
|
.\backup-gitea-db.ps1
|
||||||
|
|
||||||
# Volume backup
|
# Volume backup
|
||||||
.\backup-volume.ps1
|
.\backup-volume.ps1
|
||||||
```
|
```
|
||||||
160
HTTPS-SETUP.md
160
HTTPS-SETUP.md
@@ -1,81 +1,81 @@
|
|||||||
# Setting Up HTTPS for Gitea with Traefik
|
# Setting Up HTTPS for Gitea with Traefik
|
||||||
|
|
||||||
This guide explains how to configure Gitea with proper HTTPS using Traefik as a reverse proxy with automatic certificate management via Let's Encrypt.
|
This guide explains how to configure Gitea with proper HTTPS using Traefik as a reverse proxy with automatic certificate management via Let's Encrypt.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- A domain name pointing to your server (currently using `bee8333.ddns.net`)
|
- A domain name pointing to your server (currently using `bee8333.ddns.net`)
|
||||||
- Ports 80 and 443 open and forwarded to your server
|
- Ports 80 and 443 open and forwarded to your server
|
||||||
- Docker and Docker Compose installed
|
- Docker and Docker Compose installed
|
||||||
|
|
||||||
## Configuration Steps
|
## Configuration Steps
|
||||||
|
|
||||||
1. **Update email address in docker-compose.yml**
|
1. **Update email address in docker-compose.yml**
|
||||||
|
|
||||||
Edit the `docker-compose.yml` file and replace `your-email@example.com` with your actual email address. Let's Encrypt will use this for certificate expiration notifications:
|
Edit the `docker-compose.yml` file and replace `your-email@example.com` with your actual email address. Let's Encrypt will use this for certificate expiration notifications:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
--certificatesresolvers.letsencrypt.acme.email=your-email@example.com
|
--certificatesresolvers.letsencrypt.acme.email=your-email@example.com
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Start the services**
|
2. **Start the services**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose down
|
docker-compose down
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Check the status**
|
3. **Check the status**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose ps
|
docker-compose ps
|
||||||
```
|
```
|
||||||
|
|
||||||
All services should be running without errors.
|
All services should be running without errors.
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
- **Traefik** acts as a reverse proxy, handling incoming HTTP/HTTPS traffic
|
- **Traefik** acts as a reverse proxy, handling incoming HTTP/HTTPS traffic
|
||||||
- Automatically redirects HTTP to HTTPS
|
- Automatically redirects HTTP to HTTPS
|
||||||
- Obtains and renews SSL certificates from Let's Encrypt
|
- Obtains and renews SSL certificates from Let's Encrypt
|
||||||
- Routes requests to the appropriate containers based on domain name
|
- Routes requests to the appropriate containers based on domain name
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If you encounter issues:
|
If you encounter issues:
|
||||||
|
|
||||||
1. **Check Traefik logs**
|
1. **Check Traefik logs**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose logs traefik
|
docker-compose logs traefik
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Check Gitea logs**
|
2. **Check Gitea logs**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose logs server
|
docker-compose logs server
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Verify DNS settings**
|
3. **Verify DNS settings**
|
||||||
|
|
||||||
Make sure your domain (`bee8333.ddns.net`) correctly points to your server's IP address.
|
Make sure your domain (`bee8333.ddns.net`) correctly points to your server's IP address.
|
||||||
|
|
||||||
4. **Check firewall settings**
|
4. **Check firewall settings**
|
||||||
|
|
||||||
Ensure ports 80 and 443 are open and properly forwarded to your server.
|
Ensure ports 80 and 443 are open and properly forwarded to your server.
|
||||||
|
|
||||||
## Git Client Configuration
|
## Git Client Configuration
|
||||||
|
|
||||||
When pushing to your Gitea repository from your local machine, you'll now be using HTTPS with a valid certificate. Use the following URL format:
|
When pushing to your Gitea repository from your local machine, you'll now be using HTTPS with a valid certificate. Use the following URL format:
|
||||||
|
|
||||||
```
|
```
|
||||||
https://bee8333.ddns.net/username/repository.git
|
https://bee8333.ddns.net/username/repository.git
|
||||||
```
|
```
|
||||||
|
|
||||||
## SSH Access
|
## SSH Access
|
||||||
|
|
||||||
SSH access is still available on port 222. Use the following format in your SSH config or Git command:
|
SSH access is still available on port 222. Use the following format in your SSH config or Git command:
|
||||||
|
|
||||||
```
|
```
|
||||||
ssh://git@bee8333.ddns.net:222/username/repository.git
|
ssh://git@bee8333.ddns.net:222/username/repository.git
|
||||||
```
|
```
|
||||||
364
README.md
364
README.md
@@ -1,183 +1,183 @@
|
|||||||
# Gitea Docker Setup
|
# Gitea Docker Setup
|
||||||
|
|
||||||
This is a Docker Compose configuration for running Gitea with PostgreSQL, configured with HTTPS support.
|
This is a Docker Compose configuration for running Gitea with PostgreSQL, configured with HTTPS support.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Docker Desktop for Windows
|
- Docker Desktop for Windows
|
||||||
- Docker Compose
|
- Docker Compose
|
||||||
- A domain or DDNS service (configured to point to your server)
|
- A domain or DDNS service (configured to point to your server)
|
||||||
- Port forwarding configured on your router (if accessing from outside your network)
|
- Port forwarding configured on your router (if accessing from outside your network)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Gitea with HTTPS support
|
- Gitea with HTTPS support
|
||||||
- PostgreSQL database
|
- PostgreSQL database
|
||||||
- SSH access for Git operations
|
- SSH access for Git operations
|
||||||
- Persistent data storage
|
- Persistent data storage
|
||||||
- Self-signed SSL certificates (can be replaced with Let's Encrypt)
|
- Self-signed SSL certificates (can be replaced with Let's Encrypt)
|
||||||
- Automated database backup system
|
- Automated database backup system
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
The setup includes:
|
The setup includes:
|
||||||
- Gitea web interface:
|
- Gitea web interface:
|
||||||
- External access: https://bee8333.ddns.net/
|
- External access: https://bee8333.ddns.net/
|
||||||
- Local network access: https://bee8333.ddns.net/ or https://localhost:3000
|
- Local network access: https://bee8333.ddns.net/ or https://localhost:3000
|
||||||
- Local development: https://127.0.0.1:3000
|
- Local development: https://127.0.0.1:3000
|
||||||
- SSH access on port 222 (for git clone/push/pull)
|
- SSH access on port 222 (for git clone/push/pull)
|
||||||
- PostgreSQL database (internal access only)
|
- PostgreSQL database (internal access only)
|
||||||
- SSL certificates in `./gitea/ssl/`
|
- SSL certificates in `./gitea/ssl/`
|
||||||
- Persistent data storage for both Gitea and PostgreSQL
|
- Persistent data storage for both Gitea and PostgreSQL
|
||||||
|
|
||||||
## Access Methods
|
## Access Methods
|
||||||
|
|
||||||
### Web Interface
|
### Web Interface
|
||||||
|
|
||||||
1. **External Access (Internet)**:
|
1. **External Access (Internet)**:
|
||||||
- URL: https://bee8333.ddns.net/
|
- URL: https://bee8333.ddns.net/
|
||||||
- Requires port 3000 forwarded on your router
|
- Requires port 3000 forwarded on your router
|
||||||
- Uses HTTPS with SSL certificate
|
- Uses HTTPS with SSL certificate
|
||||||
|
|
||||||
2. **Local Network Access**:
|
2. **Local Network Access**:
|
||||||
- Same URL: https://bee8333.ddns.net/
|
- Same URL: https://bee8333.ddns.net/
|
||||||
- Or use: https://localhost:3000
|
- Or use: https://localhost:3000
|
||||||
- Both use HTTPS with SSL certificate
|
- Both use HTTPS with SSL certificate
|
||||||
- No port forwarding needed
|
- No port forwarding needed
|
||||||
|
|
||||||
3. **Local Development**:
|
3. **Local Development**:
|
||||||
- URL: https://127.0.0.1:3000
|
- URL: https://127.0.0.1:3000
|
||||||
- Direct access on the hosting machine
|
- Direct access on the hosting machine
|
||||||
- Uses HTTPS with SSL certificate
|
- Uses HTTPS with SSL certificate
|
||||||
|
|
||||||
### Git Operations (SSH)
|
### Git Operations (SSH)
|
||||||
|
|
||||||
- External SSH URL: `ssh://git@bee8333.ddns.net:222/username/repository.git`
|
- External SSH URL: `ssh://git@bee8333.ddns.net:222/username/repository.git`
|
||||||
- Local SSH URL: `ssh://git@localhost:222/username/repository.git`
|
- Local SSH URL: `ssh://git@localhost:222/username/repository.git`
|
||||||
- Requires port 222 forwarded on your router for external access
|
- Requires port 222 forwarded on your router for external access
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
1. Make sure Docker Desktop is running
|
1. Make sure Docker Desktop is running
|
||||||
2. Clone this repository
|
2. Clone this repository
|
||||||
3. Open a terminal in this directory
|
3. Open a terminal in this directory
|
||||||
4. Generate SSL certificates (see [SSL Certificates](#ssl-certificates) section)
|
4. Generate SSL certificates (see [SSL Certificates](#ssl-certificates) section)
|
||||||
5. Run `docker-compose up -d`
|
5. Run `docker-compose up -d`
|
||||||
6. Access Gitea using one of the URLs above
|
6. Access Gitea using one of the URLs above
|
||||||
7. During first-time setup:
|
7. During first-time setup:
|
||||||
- Database settings are pre-configured (no changes needed)
|
- Database settings are pre-configured (no changes needed)
|
||||||
- Domain is set to your domain name
|
- Domain is set to your domain name
|
||||||
- SSH port is set to 222
|
- SSH port is set to 222
|
||||||
- HTTPS is enabled by default
|
- HTTPS is enabled by default
|
||||||
|
|
||||||
## SSL Certificates
|
## SSL Certificates
|
||||||
|
|
||||||
You'll need to generate SSL certificates before starting the service. The certificates should be placed in `./gitea/ssl/`:
|
You'll need to generate SSL certificates before starting the service. The certificates should be placed in `./gitea/ssl/`:
|
||||||
- `cert.pem` - The SSL certificate
|
- `cert.pem` - The SSL certificate
|
||||||
- `key.pem` - The private key
|
- `key.pem` - The private key
|
||||||
|
|
||||||
To generate self-signed certificates (for development/testing):
|
To generate self-signed certificates (for development/testing):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create the ssl directory
|
# Create the ssl directory
|
||||||
mkdir -p gitea/ssl
|
mkdir -p gitea/ssl
|
||||||
|
|
||||||
# Generate certificates using OpenSSL
|
# Generate certificates using OpenSSL
|
||||||
docker run --rm -v ${PWD}/gitea/ssl:/ssl alpine/openssl req -x509 -nodes \
|
docker run --rm -v ${PWD}/gitea/ssl:/ssl alpine/openssl req -x509 -nodes \
|
||||||
-days 365 -newkey rsa:2048 \
|
-days 365 -newkey rsa:2048 \
|
||||||
-keyout /ssl/key.pem -out /ssl/cert.pem \
|
-keyout /ssl/key.pem -out /ssl/cert.pem \
|
||||||
-subj "/CN=your.domain.here"
|
-subj "/CN=your.domain.here"
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace `your.domain.here` with your actual domain name.
|
Replace `your.domain.here` with your actual domain name.
|
||||||
|
|
||||||
**Security Notes:**
|
**Security Notes:**
|
||||||
- Never commit SSL certificates to version control
|
- Never commit SSL certificates to version control
|
||||||
- Keep your private key (key.pem) secure
|
- Keep your private key (key.pem) secure
|
||||||
- For production use, consider using Let's Encrypt certificates
|
- For production use, consider using Let's Encrypt certificates
|
||||||
- Self-signed certificates will show browser security warnings
|
- Self-signed certificates will show browser security warnings
|
||||||
|
|
||||||
## Backup System
|
## Backup System
|
||||||
|
|
||||||
This setup includes a comprehensive backup strategy to ensure your Gitea data is always protected. The backup system provides two complementary methods:
|
This setup includes a comprehensive backup strategy to ensure your Gitea data is always protected. The backup system provides two complementary methods:
|
||||||
|
|
||||||
### Database Backups
|
### Database Backups
|
||||||
|
|
||||||
PowerShell scripts are included to manage database backups:
|
PowerShell scripts are included to manage database backups:
|
||||||
|
|
||||||
1. **Creating Backups**:
|
1. **Creating Backups**:
|
||||||
```powershell
|
```powershell
|
||||||
powershell -ExecutionPolicy Bypass -File .\backup-gitea-db.ps1
|
powershell -ExecutionPolicy Bypass -File .\backup-gitea-db.ps1
|
||||||
```
|
```
|
||||||
This creates a SQL dump of your PostgreSQL database, compressed as a ZIP file in the `backups` directory.
|
This creates a SQL dump of your PostgreSQL database, compressed as a ZIP file in the `backups` directory.
|
||||||
|
|
||||||
2. **Volume Backups**:
|
2. **Volume Backups**:
|
||||||
```powershell
|
```powershell
|
||||||
powershell -ExecutionPolicy Bypass -File .\backup-volume.ps1
|
powershell -ExecutionPolicy Bypass -File .\backup-volume.ps1
|
||||||
```
|
```
|
||||||
This backs up the entire PostgreSQL data volume as a TAR archive, compressed as a ZIP file.
|
This backs up the entire PostgreSQL data volume as a TAR archive, compressed as a ZIP file.
|
||||||
|
|
||||||
3. **Automated Backups**:
|
3. **Automated Backups**:
|
||||||
```powershell
|
```powershell
|
||||||
powershell -ExecutionPolicy Bypass -File .\schedule-backup.ps1
|
powershell -ExecutionPolicy Bypass -File .\schedule-backup.ps1
|
||||||
```
|
```
|
||||||
This creates a Windows Scheduled Task that runs database backups daily at 3 AM.
|
This creates a Windows Scheduled Task that runs database backups daily at 3 AM.
|
||||||
|
|
||||||
4. **Restoring from Backups**:
|
4. **Restoring from Backups**:
|
||||||
```powershell
|
```powershell
|
||||||
# Restore from database dump
|
# Restore from database dump
|
||||||
powershell -ExecutionPolicy Bypass -File .\restore-gitea-db.ps1 -BackupFile "backups\your-backup-file.sql.zip"
|
powershell -ExecutionPolicy Bypass -File .\restore-gitea-db.ps1 -BackupFile "backups\your-backup-file.sql.zip"
|
||||||
|
|
||||||
# Restore from volume backup
|
# Restore from volume backup
|
||||||
powershell -ExecutionPolicy Bypass -File .\restore-volume.ps1 -BackupFile "backups\your-volume-backup.tar.zip"
|
powershell -ExecutionPolicy Bypass -File .\restore-volume.ps1 -BackupFile "backups\your-volume-backup.tar.zip"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Backup Best Practices
|
### Backup Best Practices
|
||||||
|
|
||||||
- Keep multiple backups using both methods (database dumps and volume backups)
|
- Keep multiple backups using both methods (database dumps and volume backups)
|
||||||
- Store backups in multiple locations (local and off-site)
|
- Store backups in multiple locations (local and off-site)
|
||||||
- Test restoring from backups periodically
|
- Test restoring from backups periodically
|
||||||
- Create a backup before upgrading Gitea or making significant changes
|
- Create a backup before upgrading Gitea or making significant changes
|
||||||
- **Never** run `docker-compose down -v` unless you have a recent backup
|
- **Never** run `docker-compose down -v` unless you have a recent backup
|
||||||
|
|
||||||
For more detailed information about the backup system, see [BACKUP-README.md](BACKUP-README.md).
|
For more detailed information about the backup system, see [BACKUP-README.md](BACKUP-README.md).
|
||||||
|
|
||||||
## Stopping the Services
|
## Stopping the Services
|
||||||
|
|
||||||
To stop the services, run:
|
To stop the services, run:
|
||||||
```bash
|
```bash
|
||||||
docker-compose down
|
docker-compose down
|
||||||
```
|
```
|
||||||
|
|
||||||
**Important**: Do not use the `-v` flag (`docker-compose down -v`) unless you intend to delete all data, as this will remove the Docker volumes containing your database.
|
**Important**: Do not use the `-v` flag (`docker-compose down -v`) unless you intend to delete all data, as this will remove the Docker volumes containing your database.
|
||||||
|
|
||||||
## Data Persistence
|
## Data Persistence
|
||||||
|
|
||||||
All data is stored in Docker volumes and local directories:
|
All data is stored in Docker volumes and local directories:
|
||||||
- `./gitea/` - Gitea configuration and data
|
- `./gitea/` - Gitea configuration and data
|
||||||
- `./gitea/ssl/` - SSL certificates
|
- `./gitea/ssl/` - SSL certificates
|
||||||
- `./gitea/conf/` - Gitea configuration
|
- `./gitea/conf/` - Gitea configuration
|
||||||
- Docker volumes (managed by Docker):
|
- Docker volumes (managed by Docker):
|
||||||
- `gitea-data` - Gitea repositories and application data
|
- `gitea-data` - Gitea repositories and application data
|
||||||
- `postgres-data` - PostgreSQL database files
|
- `postgres-data` - PostgreSQL database files
|
||||||
- `./backups/` - Database and volume backups
|
- `./backups/` - Database and volume backups
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
1. **Cannot access externally**:
|
1. **Cannot access externally**:
|
||||||
- Verify port 3000 (HTTP) and 222 (SSH) are forwarded on your router
|
- Verify port 3000 (HTTP) and 222 (SSH) are forwarded on your router
|
||||||
- Check your DDNS service is updating correctly
|
- Check your DDNS service is updating correctly
|
||||||
- Ensure your domain points to your correct IP
|
- Ensure your domain points to your correct IP
|
||||||
|
|
||||||
2. **SSL Certificate Warnings**:
|
2. **SSL Certificate Warnings**:
|
||||||
- This is normal with self-signed certificates
|
- This is normal with self-signed certificates
|
||||||
- For production, consider using Let's Encrypt certificates
|
- For production, consider using Let's Encrypt certificates
|
||||||
|
|
||||||
3. **Local Network Access**:
|
3. **Local Network Access**:
|
||||||
- If bee8333.ddns.net doesn't resolve locally, use localhost:3000 instead
|
- If bee8333.ddns.net doesn't resolve locally, use localhost:3000 instead
|
||||||
- Add an entry to your hosts file if needed
|
- Add an entry to your hosts file if needed
|
||||||
|
|
||||||
4. **Database Backup Issues**:
|
4. **Database Backup Issues**:
|
||||||
- Ensure Docker is running when attempting backups
|
- Ensure Docker is running when attempting backups
|
||||||
- Check that the container names match those in the backup scripts
|
- Check that the container names match those in the backup scripts
|
||||||
- For PowerShell execution issues, use the `-ExecutionPolicy Bypass` flag
|
- For PowerShell execution issues, use the `-ExecutionPolicy Bypass` flag
|
||||||
@@ -1,32 +1,82 @@
|
|||||||
# Gitea Database Backup Script
|
# Gitea Database Backup Script
|
||||||
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
||||||
$backupDir = ".\backups"
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
$backupFile = "$backupDir\gitea-db-backup-$timestamp.sql"
|
$backupDir = Join-Path $scriptDir "backups"
|
||||||
|
$backupFile = Join-Path $backupDir "gitea-db-backup-$timestamp.sql"
|
||||||
# Ensure backup directory exists
|
$redundantBackupDir = "D:\Pr00jects\gitea-docker"
|
||||||
if (-not (Test-Path $backupDir)) {
|
|
||||||
New-Item -ItemType Directory -Path $backupDir
|
# Ensure backup directory exists
|
||||||
}
|
if (-not (Test-Path $backupDir)) {
|
||||||
|
New-Item -ItemType Directory -Path $backupDir
|
||||||
# Create database dump
|
}
|
||||||
Write-Host "Creating database backup to $backupFile..."
|
|
||||||
docker exec gitea-db pg_dump -U gitea -d gitea > $backupFile
|
# Ensure redundant backup directory exists
|
||||||
|
if (-not (Test-Path $redundantBackupDir)) {
|
||||||
# Check if backup was successful
|
try {
|
||||||
if ($LASTEXITCODE -eq 0 -and (Test-Path $backupFile) -and (Get-Item $backupFile).Length -gt 0) {
|
New-Item -ItemType Directory -Path $redundantBackupDir -Force
|
||||||
Write-Host "Backup completed successfully!"
|
} catch {
|
||||||
|
"[$timestamp] Warning: Could not create redundant backup directory at $redundantBackupDir. Error: $_" | Out-File -Append -FilePath $logFile
|
||||||
# Optional: Compress the backup file
|
}
|
||||||
Compress-Archive -Path $backupFile -DestinationPath "$backupFile.zip" -Force
|
}
|
||||||
Remove-Item $backupFile
|
|
||||||
Write-Host "Backup compressed to $backupFile.zip"
|
# Log execution of the script
|
||||||
} else {
|
$logFile = Join-Path $backupDir "backup-log.txt"
|
||||||
Write-Host "Backup failed!" -ForegroundColor Red
|
"[$timestamp] Starting database backup..." | Out-File -Append -FilePath $logFile
|
||||||
}
|
|
||||||
|
# Check if Docker is running
|
||||||
# Optional: Clean up old backups (keep last 10)
|
$dockerRunning = $false
|
||||||
$oldBackups = Get-ChildItem -Path $backupDir -Filter "gitea-db-backup-*.zip" | Sort-Object LastWriteTime -Descending | Select-Object -Skip 10
|
try {
|
||||||
foreach ($backup in $oldBackups) {
|
$dockerStatus = docker info 2>&1
|
||||||
Remove-Item $backup.FullName
|
$dockerRunning = $LASTEXITCODE -eq 0
|
||||||
Write-Host "Removed old backup: $($backup.Name)"
|
} catch {
|
||||||
|
$dockerRunning = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $dockerRunning) {
|
||||||
|
"[$timestamp] Error: Docker is not running. Backup failed." | Out-File -Append -FilePath $logFile
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if Gitea container is running
|
||||||
|
$containerRunning = docker ps --format "{{.Names}}" | Select-String -Pattern "gitea-db" -Quiet
|
||||||
|
if (-not $containerRunning) {
|
||||||
|
"[$timestamp] Error: Gitea database container is not running. Backup failed." | Out-File -Append -FilePath $logFile
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create database dump
|
||||||
|
"[$timestamp] Creating database backup to $backupFile..." | Out-File -Append -FilePath $logFile
|
||||||
|
docker exec gitea-db pg_dump -U gitea -d gitea > $backupFile
|
||||||
|
|
||||||
|
# Check if backup was successful
|
||||||
|
if ($LASTEXITCODE -eq 0 -and (Test-Path $backupFile) -and (Get-Item $backupFile).Length -gt 0) {
|
||||||
|
"[$timestamp] Backup completed successfully!" | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Optional: Compress the backup file
|
||||||
|
$zipFileName = "$backupFile.zip"
|
||||||
|
Compress-Archive -Path $backupFile -DestinationPath $zipFileName -Force
|
||||||
|
Remove-Item $backupFile
|
||||||
|
"[$timestamp] Backup compressed to $zipFileName" | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Copy backup to redundant location
|
||||||
|
if (Test-Path $redundantBackupDir) {
|
||||||
|
try {
|
||||||
|
$redundantBackupFile = Join-Path $redundantBackupDir (Split-Path -Leaf $zipFileName)
|
||||||
|
Copy-Item -Path $zipFileName -Destination $redundantBackupFile -Force
|
||||||
|
"[$timestamp] Backup copied to redundant location: $redundantBackupFile" | Out-File -Append -FilePath $logFile
|
||||||
|
} catch {
|
||||||
|
"[$timestamp] Error copying backup to redundant location: $_" | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Warning: Redundant backup directory not found: $redundantBackupDir" | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Backup failed!" | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
|
||||||
|
# Optional: Clean up old backups (keep last 10)
|
||||||
|
$oldBackups = Get-ChildItem -Path $backupDir -Filter "gitea-db-backup-*.zip" | Sort-Object LastWriteTime -Descending | Select-Object -Skip 10
|
||||||
|
foreach ($backup in $oldBackups) {
|
||||||
|
Remove-Item $backup.FullName
|
||||||
|
"[$timestamp] Removed old backup: $($backup.Name)" | Out-File -Append -FilePath $logFile
|
||||||
}
|
}
|
||||||
@@ -1,41 +1,88 @@
|
|||||||
# Script to backup the entire Postgres Docker volume
|
# Script to backup the entire Postgres Docker volume
|
||||||
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
||||||
$backupDir = ".\backups"
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
$volumeName = "gitea-docker_postgres-data"
|
$backupDir = Join-Path $scriptDir "backups"
|
||||||
$backupFile = "$backupDir\postgres-volume-backup-$timestamp.tar"
|
$volumeName = "gitea-docker_postgres-data"
|
||||||
|
$backupFile = "postgres-volume-backup-$timestamp.tar"
|
||||||
# Ensure backup directory exists
|
$backupFilePath = Join-Path $backupDir $backupFile
|
||||||
if (-not (Test-Path $backupDir)) {
|
$redundantBackupDir = "D:\Pr00jects\gitea-docker"
|
||||||
New-Item -ItemType Directory -Path $backupDir
|
$logFile = Join-Path $backupDir "volume-backup-log.txt"
|
||||||
}
|
$currentDir = Get-Location
|
||||||
|
|
||||||
# Check if volume exists
|
# Ensure backup directory exists
|
||||||
$volumeExists = docker volume ls --format "{{.Name}}" | Select-String -Pattern "^$volumeName$"
|
if (-not (Test-Path $backupDir)) {
|
||||||
if (-not $volumeExists) {
|
New-Item -ItemType Directory -Path $backupDir
|
||||||
Write-Host "Volume $volumeName not found!" -ForegroundColor Red
|
}
|
||||||
exit 1
|
|
||||||
}
|
# Ensure redundant backup directory exists
|
||||||
|
if (-not (Test-Path $redundantBackupDir)) {
|
||||||
# Create a temporary container to access the volume
|
try {
|
||||||
Write-Host "Creating backup of Docker volume $volumeName..."
|
New-Item -ItemType Directory -Path $redundantBackupDir -Force
|
||||||
docker run --rm -v ${volumeName}:/volume -v ${PWD}/${backupDir}:/backup alpine tar -cf /backup/$(Split-Path $backupFile -Leaf) -C /volume ./
|
} catch {
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Warning: Could not create redundant backup directory at $redundantBackupDir. Error: $_"
|
||||||
# Check if backup was successful
|
}
|
||||||
if ($LASTEXITCODE -eq 0 -and (Test-Path $backupFile) -and (Get-Item $backupFile).Length -gt 0) {
|
}
|
||||||
Write-Host "Volume backup completed successfully to $backupFile!" -ForegroundColor Green
|
|
||||||
|
# Log start of backup
|
||||||
# Optional: Compress the backup file
|
Add-Content -Path $logFile -Value "[$timestamp] Starting volume backup for $volumeName..."
|
||||||
Write-Host "Compressing backup file..."
|
|
||||||
Compress-Archive -Path $backupFile -DestinationPath "$backupFile.zip" -Force
|
# Check if volume exists
|
||||||
Remove-Item $backupFile
|
$volumeExists = docker volume ls --format "{{.Name}}" | Select-String -Pattern "^$volumeName$"
|
||||||
Write-Host "Backup compressed to $backupFile.zip" -ForegroundColor Green
|
if (-not $volumeExists) {
|
||||||
} else {
|
Write-Host "Volume $volumeName not found!" -ForegroundColor Red
|
||||||
Write-Host "Volume backup failed!" -ForegroundColor Red
|
Add-Content -Path $logFile -Value "[$timestamp] Error: Volume $volumeName not found!"
|
||||||
}
|
exit 1
|
||||||
|
}
|
||||||
# Optional: Clean up old volume backups (keep last 5)
|
|
||||||
$oldBackups = Get-ChildItem -Path $backupDir -Filter "postgres-volume-backup-*.zip" | Sort-Object LastWriteTime -Descending | Select-Object -Skip 5
|
# Create a temporary container to access the volume
|
||||||
foreach ($backup in $oldBackups) {
|
Write-Host "Creating backup of Docker volume $volumeName..."
|
||||||
Remove-Item $backup.FullName
|
Add-Content -Path $logFile -Value "[$timestamp] Creating backup to $backupFilePath..."
|
||||||
Write-Host "Removed old volume backup: $($backup.Name)"
|
|
||||||
|
# Change to backup directory and use simple relative paths for Docker
|
||||||
|
Set-Location -Path $backupDir
|
||||||
|
docker run --rm -v ${volumeName}:/volume -v ${PWD}:/backup alpine tar -cf /backup/$backupFile -C /volume ./
|
||||||
|
|
||||||
|
# Restore original directory
|
||||||
|
Set-Location -Path $currentDir
|
||||||
|
|
||||||
|
# Check if backup was successful
|
||||||
|
if ($LASTEXITCODE -eq 0 -and (Test-Path $backupFilePath) -and (Get-Item $backupFilePath).Length -gt 0) {
|
||||||
|
Write-Host "Volume backup completed successfully to $backupFilePath!" -ForegroundColor Green
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Volume backup completed successfully!"
|
||||||
|
|
||||||
|
# Optional: Compress the backup file
|
||||||
|
Write-Host "Compressing backup file..."
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Compressing backup file..."
|
||||||
|
$zipFileName = "$backupFilePath.zip"
|
||||||
|
Compress-Archive -Path $backupFilePath -DestinationPath $zipFileName -Force
|
||||||
|
Remove-Item $backupFilePath
|
||||||
|
Write-Host "Backup compressed to $zipFileName" -ForegroundColor Green
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Backup compressed to $zipFileName"
|
||||||
|
|
||||||
|
# Copy backup to redundant location
|
||||||
|
if (Test-Path $redundantBackupDir) {
|
||||||
|
try {
|
||||||
|
$redundantBackupFile = Join-Path $redundantBackupDir (Split-Path -Leaf $zipFileName)
|
||||||
|
Copy-Item -Path $zipFileName -Destination $redundantBackupFile -Force
|
||||||
|
Write-Host "Backup copied to redundant location: $redundantBackupFile" -ForegroundColor Green
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Backup copied to redundant location: $redundantBackupFile"
|
||||||
|
} catch {
|
||||||
|
Write-Host "Error copying backup to redundant location: $_" -ForegroundColor Red
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Error copying backup to redundant location: $_"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Warning: Redundant backup directory not found: $redundantBackupDir" -ForegroundColor Yellow
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Warning: Redundant backup directory not found: $redundantBackupDir"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Volume backup failed!" -ForegroundColor Red
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Volume backup failed!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Optional: Clean up old volume backups (keep last 5)
|
||||||
|
$oldBackups = Get-ChildItem -Path $backupDir -Filter "postgres-volume-backup-*.zip" | Sort-Object LastWriteTime -Descending | Select-Object -Skip 5
|
||||||
|
foreach ($backup in $oldBackups) {
|
||||||
|
Remove-Item $backup.FullName
|
||||||
|
Write-Host "Removed old volume backup: $($backup.Name)"
|
||||||
|
Add-Content -Path $logFile -Value "[$timestamp] Removed old volume backup: $($backup.Name)"
|
||||||
}
|
}
|
||||||
BIN
backups/backup-log.txt
Normal file
BIN
backups/backup-log.txt
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
backups/gitea-db-backup-2025-04-21_03-03-47.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-04-21_03-03-47.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-04-22_03-07-16.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-04-22_03-07-16.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-04-23_03-00-49.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-04-23_03-00-49.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-04-25_19-01-37.sql
Normal file
BIN
backups/gitea-db-backup-2025-04-25_19-01-37.sql
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-18_01-16-38.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-18_01-16-38.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-18_03-00-05.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-18_03-00-05.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-19_03-00-05.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-19_03-00-05.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-20_03-00-53.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-20_03-00-53.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-21_03-03-22.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-21_03-03-22.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-22_03-03-36.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-05-22_03-03-36.sql.zip
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-23_03-21-26.sql
Normal file
BIN
backups/gitea-db-backup-2025-05-23_03-21-26.sql
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-05-28_02-42-28.sql
Normal file
BIN
backups/gitea-db-backup-2025-05-28_02-42-28.sql
Normal file
Binary file not shown.
BIN
backups/gitea-db-backup-2025-06-09_21-22-55.sql.zip
Normal file
BIN
backups/gitea-db-backup-2025-06-09_21-22-55.sql.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-05-19_03-00-14.tar.zip
Normal file
BIN
backups/postgres-volume-backup-2025-05-19_03-00-14.tar.zip
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-05-20_03-14-23.tar.zip
Normal file
BIN
backups/postgres-volume-backup-2025-05-20_03-14-23.tar.zip
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-05-21_03-08-24.tar.zip
Normal file
BIN
backups/postgres-volume-backup-2025-05-21_03-08-24.tar.zip
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-05-22_03-03-49.tar.zip
Normal file
BIN
backups/postgres-volume-backup-2025-05-22_03-03-49.tar.zip
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-05-23_08-01-05.tar
Normal file
BIN
backups/postgres-volume-backup-2025-05-23_08-01-05.tar
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup-2025-06-09_21-30-15.tar.zip
Normal file
BIN
backups/postgres-volume-backup-2025-06-09_21-30-15.tar.zip
Normal file
Binary file not shown.
BIN
backups/postgres-volume-backup.tar
Normal file
BIN
backups/postgres-volume-backup.tar
Normal file
Binary file not shown.
104
backups/volume-backup-log.txt
Normal file
104
backups/volume-backup-log.txt
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
[2025-04-19_19-40-51] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-19_19-40-51] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-40-51.tar...
|
||||||
|
[2025-04-19_19-40-51] Volume backup failed!
|
||||||
|
[2025-04-19_19-41-05] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-19_19-41-05] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-41-05.tar...
|
||||||
|
[2025-04-19_19-41-05] Volume backup failed!
|
||||||
|
[2025-04-19_19-42-55] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-19_19-42-55] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-42-55.tar...
|
||||||
|
[2025-04-19_19-42-55] Volume backup completed successfully!
|
||||||
|
[2025-04-19_19-42-55] Compressing backup file...
|
||||||
|
[2025-04-19_19-42-55] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-42-55.tar.zip
|
||||||
|
[2025-04-19_19-42-55] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-19_19-42-55.tar.zip
|
||||||
|
[2025-04-19_19-43-53] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-19_19-43-53] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-43-53.tar...
|
||||||
|
[2025-04-19_19-43-53] Volume backup completed successfully!
|
||||||
|
[2025-04-19_19-43-53] Compressing backup file...
|
||||||
|
[2025-04-19_19-43-53] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-43-53.tar.zip
|
||||||
|
[2025-04-19_19-43-53] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-19_19-43-53.tar.zip
|
||||||
|
[2025-04-19_19-44-40] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-19_19-44-40] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-44-40.tar...
|
||||||
|
[2025-04-19_19-44-40] Volume backup completed successfully!
|
||||||
|
[2025-04-19_19-44-40] Compressing backup file...
|
||||||
|
[2025-04-19_19-44-40] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-19_19-44-40.tar.zip
|
||||||
|
[2025-04-19_19-44-40] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-19_19-44-40.tar.zip
|
||||||
|
[2025-04-20_03-06-24] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-20_03-06-24] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-20_03-06-24.tar...
|
||||||
|
[2025-04-20_03-06-24] Volume backup completed successfully!
|
||||||
|
[2025-04-20_03-06-24] Compressing backup file...
|
||||||
|
[2025-04-20_03-06-24] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-20_03-06-24.tar.zip
|
||||||
|
[2025-04-20_03-06-24] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-20_03-06-24.tar.zip
|
||||||
|
[2025-04-21_03-05-47] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-21_03-05-47] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-21_03-05-47.tar...
|
||||||
|
[2025-04-21_03-05-47] Volume backup completed successfully!
|
||||||
|
[2025-04-21_03-05-47] Compressing backup file...
|
||||||
|
[2025-04-21_03-05-47] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-21_03-05-47.tar.zip
|
||||||
|
[2025-04-21_03-05-47] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-21_03-05-47.tar.zip
|
||||||
|
[2025-04-21_03-05-47] Removed old volume backup: postgres-volume-backup-2025-03-01_23-23-13.tar.zip
|
||||||
|
[2025-04-22_03-27-19] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-22_03-27-19] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-22_03-27-19.tar...
|
||||||
|
[2025-04-22_03-27-19] Volume backup completed successfully!
|
||||||
|
[2025-04-22_03-27-19] Compressing backup file...
|
||||||
|
[2025-04-22_03-27-19] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-22_03-27-19.tar.zip
|
||||||
|
[2025-04-22_03-27-19] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-22_03-27-19.tar.zip
|
||||||
|
[2025-04-22_03-27-19] Removed old volume backup: postgres-volume-backup-2025-04-19_19-42-55.tar.zip
|
||||||
|
[2025-04-23_08-10-53] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-04-23_08-10-53] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-23_08-10-53.tar...
|
||||||
|
[2025-04-23_08-10-53] Volume backup completed successfully!
|
||||||
|
[2025-04-23_08-10-53] Compressing backup file...
|
||||||
|
[2025-04-23_08-10-53] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-04-23_08-10-53.tar.zip
|
||||||
|
[2025-04-23_08-10-53] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-04-23_08-10-53.tar.zip
|
||||||
|
[2025-04-23_08-10-53] Removed old volume backup: postgres-volume-backup-2025-04-19_19-43-53.tar.zip
|
||||||
|
[2025-05-18_01-22-29] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-18_01-22-29] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-18_01-22-29.tar...
|
||||||
|
[2025-05-18_01-22-29] Volume backup completed successfully!
|
||||||
|
[2025-05-18_01-22-29] Compressing backup file...
|
||||||
|
[2025-05-18_01-22-29] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-18_01-22-29.tar.zip
|
||||||
|
[2025-05-18_01-22-29] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-18_01-22-29.tar.zip
|
||||||
|
[2025-05-18_01-22-29] Removed old volume backup: postgres-volume-backup-2025-04-19_19-44-40.tar.zip
|
||||||
|
[2025-05-18_03-00-14] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-18_03-00-14] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-18_03-00-14.tar...
|
||||||
|
[2025-05-18_03-00-14] Volume backup completed successfully!
|
||||||
|
[2025-05-18_03-00-14] Compressing backup file...
|
||||||
|
[2025-05-18_03-00-14] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-18_03-00-14.tar.zip
|
||||||
|
[2025-05-18_03-00-14] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-18_03-00-14.tar.zip
|
||||||
|
[2025-05-18_03-00-14] Removed old volume backup: postgres-volume-backup-2025-04-20_03-06-24.tar.zip
|
||||||
|
[2025-05-19_03-00-14] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-19_03-00-14] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-19_03-00-14.tar...
|
||||||
|
[2025-05-19_03-00-14] Volume backup completed successfully!
|
||||||
|
[2025-05-19_03-00-14] Compressing backup file...
|
||||||
|
[2025-05-19_03-00-14] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-19_03-00-14.tar.zip
|
||||||
|
[2025-05-19_03-00-14] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-19_03-00-14.tar.zip
|
||||||
|
[2025-05-19_03-00-14] Removed old volume backup: postgres-volume-backup-2025-04-21_03-05-47.tar.zip
|
||||||
|
[2025-05-20_03-14-23] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-20_03-14-23] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-20_03-14-23.tar...
|
||||||
|
[2025-05-20_03-14-23] Volume backup completed successfully!
|
||||||
|
[2025-05-20_03-14-23] Compressing backup file...
|
||||||
|
[2025-05-20_03-14-23] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-20_03-14-23.tar.zip
|
||||||
|
[2025-05-20_03-14-23] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-20_03-14-23.tar.zip
|
||||||
|
[2025-05-20_03-14-23] Removed old volume backup: postgres-volume-backup-2025-04-22_03-27-19.tar.zip
|
||||||
|
[2025-05-21_03-08-24] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-21_03-08-24] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-21_03-08-24.tar...
|
||||||
|
[2025-05-21_03-08-24] Volume backup completed successfully!
|
||||||
|
[2025-05-21_03-08-24] Compressing backup file...
|
||||||
|
[2025-05-21_03-08-24] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-21_03-08-24.tar.zip
|
||||||
|
[2025-05-21_03-08-24] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-21_03-08-24.tar.zip
|
||||||
|
[2025-05-21_03-08-24] Removed old volume backup: postgres-volume-backup-2025-04-23_08-10-53.tar.zip
|
||||||
|
[2025-05-22_03-03-49] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-22_03-03-49] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-22_03-03-49.tar...
|
||||||
|
[2025-05-22_03-03-49] Volume backup completed successfully!
|
||||||
|
[2025-05-22_03-03-49] Compressing backup file...
|
||||||
|
[2025-05-22_03-03-49] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-22_03-03-49.tar.zip
|
||||||
|
[2025-05-22_03-03-49] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-05-22_03-03-49.tar.zip
|
||||||
|
[2025-05-22_03-03-49] Removed old volume backup: postgres-volume-backup-2025-05-18_01-22-29.tar.zip
|
||||||
|
[2025-05-23_08-01-05] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-05-23_08-01-05] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-05-23_08-01-05.tar...
|
||||||
|
[2025-05-23_08-01-05] Volume backup completed successfully!
|
||||||
|
[2025-05-23_08-01-05] Compressing backup file...
|
||||||
|
[2025-06-09_21-30-15] Starting volume backup for gitea-docker_postgres-data...
|
||||||
|
[2025-06-09_21-30-15] Creating backup to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-06-09_21-30-15.tar...
|
||||||
|
[2025-06-09_21-30-15] Volume backup completed successfully!
|
||||||
|
[2025-06-09_21-30-15] Compressing backup file...
|
||||||
|
[2025-06-09_21-30-15] Backup compressed to C:\Users\benne\Projects\gitea-docker\backups\postgres-volume-backup-2025-06-09_21-30-15.tar.zip
|
||||||
|
[2025-06-09_21-30-15] Backup copied to redundant location: D:\Pr00jects\gitea-docker\postgres-volume-backup-2025-06-09_21-30-15.tar.zip
|
||||||
|
[2025-06-09_21-30-15] Removed old volume backup: postgres-volume-backup-2025-05-18_03-00-14.tar.zip
|
||||||
20
docker-compose.headscale.yml
Normal file
20
docker-compose.headscale.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
headscale:
|
||||||
|
image: headscale/headscale:latest
|
||||||
|
container_name: headscale
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8081:8080" # Web UI and API (avoiding conflict with Traefik)
|
||||||
|
- "50443:50443" # gRPC
|
||||||
|
volumes:
|
||||||
|
- ./headscale/config:/etc/headscale
|
||||||
|
- ./headscale/data:/var/lib/headscale
|
||||||
|
command: serve
|
||||||
|
networks:
|
||||||
|
- headscale-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
headscale-net:
|
||||||
|
driver: bridge
|
||||||
@@ -3,6 +3,10 @@ version: "3"
|
|||||||
networks:
|
networks:
|
||||||
gitea:
|
gitea:
|
||||||
external: false
|
external: false
|
||||||
|
traefik:
|
||||||
|
external: true
|
||||||
|
immich_default:
|
||||||
|
external: true
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
gitea-data:
|
gitea-data:
|
||||||
@@ -15,18 +19,20 @@ services:
|
|||||||
container_name: traefik
|
container_name: traefik
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- "80:80" # HTTP
|
- "8080:80" # HTTP (changed from 80 to 8080 for ISP testing)
|
||||||
- "443:443" # HTTPS
|
- "8443:443" # HTTPS (changed from 443 to 8443 for ISP testing)
|
||||||
- "8080:8080" # Dashboard
|
- "8081:8080" # Dashboard (changed to avoid conflict)
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
- gitea
|
- gitea
|
||||||
|
- traefik
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
- traefik-certs:/letsencrypt
|
- traefik-certs:/letsencrypt
|
||||||
command:
|
command:
|
||||||
- "--providers.docker=true"
|
- "--providers.docker=true"
|
||||||
- "--providers.docker.exposedbydefault=false"
|
- "--providers.docker.exposedbydefault=false"
|
||||||
- "--providers.docker.network=gitea-docker_gitea"
|
- "--providers.docker.network=traefik"
|
||||||
- "--entrypoints.web.address=:80"
|
- "--entrypoints.web.address=:80"
|
||||||
- "--entrypoints.websecure.address=:443"
|
- "--entrypoints.websecure.address=:443"
|
||||||
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
||||||
@@ -53,7 +59,7 @@ services:
|
|||||||
- GITEA__database__PASSWD=gitea
|
- GITEA__database__PASSWD=gitea
|
||||||
# Server Configuration
|
# Server Configuration
|
||||||
- GITEA__server__DOMAIN=bee8333.ddns.net
|
- GITEA__server__DOMAIN=bee8333.ddns.net
|
||||||
- GITEA__server__ROOT_URL=https://bee8333.ddns.net/
|
- GITEA__server__ROOT_URL=https://bee8333.ddns.net/gitea/
|
||||||
- GITEA__server__PROTOCOL=http
|
- GITEA__server__PROTOCOL=http
|
||||||
- GITEA__server__HTTP_PORT=3000
|
- GITEA__server__HTTP_PORT=3000
|
||||||
- GITEA__server__SSH_DOMAIN=bee8333.ddns.net
|
- GITEA__server__SSH_DOMAIN=bee8333.ddns.net
|
||||||
@@ -68,30 +74,63 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- gitea
|
- gitea
|
||||||
|
- traefik
|
||||||
volumes:
|
volumes:
|
||||||
- gitea-data:/data
|
- gitea-data:/data
|
||||||
- /etc/timezone:/etc/timezone:ro
|
# - /etc/timezone:/etc/timezone:ro
|
||||||
- /etc/localtime:/etc/localtime:ro
|
# - /etc/localtime:/etc/localtime:ro
|
||||||
ports:
|
ports:
|
||||||
- "2224:22" # SSH: Host port 2224 -> Container port 22
|
- "2224:22" # SSH: Host port 2224 -> Container port 22
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
# HTTP Configuration for HTTPS access
|
- "traefik.docker.network=traefik"
|
||||||
- "traefik.http.routers.gitea.rule=Host(`bee8333.ddns.net`)"
|
# HTTPS Configuration for /gitea subpath
|
||||||
|
- "traefik.http.routers.gitea.rule=Host(`bee8333.ddns.net`) && PathPrefix(`/gitea`)"
|
||||||
- "traefik.http.routers.gitea.entrypoints=websecure"
|
- "traefik.http.routers.gitea.entrypoints=websecure"
|
||||||
- "traefik.http.routers.gitea.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.gitea.tls.certresolver=letsencrypt"
|
||||||
|
- "traefik.http.routers.gitea.priority=10"
|
||||||
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
|
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
|
||||||
|
- "traefik.http.middlewares.gitea-stripprefix.stripprefix.prefixes=/gitea"
|
||||||
- "traefik.http.middlewares.gitea-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
- "traefik.http.middlewares.gitea-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||||
- "traefik.http.routers.gitea.middlewares=gitea-headers@docker"
|
- "traefik.http.routers.gitea.middlewares=gitea-stripprefix@docker,gitea-headers@docker"
|
||||||
# HTTP Configuration for HTTP -> HTTPS redirection
|
# HTTP Configuration for HTTP -> HTTPS redirection
|
||||||
- "traefik.http.routers.gitea-http.rule=Host(`bee8333.ddns.net`)"
|
- "traefik.http.routers.gitea-http.rule=Host(`bee8333.ddns.net`) && PathPrefix(`/gitea`)"
|
||||||
- "traefik.http.routers.gitea-http.entrypoints=web"
|
- "traefik.http.routers.gitea-http.entrypoints=web"
|
||||||
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
|
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
|
||||||
- "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
|
- "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
|
||||||
- "traefik.http.routers.gitea-http.middlewares=https-redirect@docker"
|
- "traefik.http.routers.gitea-http.middlewares=https-redirect@docker"
|
||||||
|
|
||||||
|
headscale:
|
||||||
|
image: headscale/headscale:latest
|
||||||
|
container_name: headscale
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "3478:3478/udp" # STUN for DERP relay
|
||||||
|
volumes:
|
||||||
|
- ./headscale/config:/etc/headscale
|
||||||
|
- ./headscale/data:/var/lib/headscale
|
||||||
|
command: serve
|
||||||
|
networks:
|
||||||
|
- gitea
|
||||||
|
- traefik
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.docker.network=traefik"
|
||||||
|
# HTTPS Configuration for /headscale subpath
|
||||||
|
- "traefik.http.routers.headscale.rule=Host(`bee8333.ddns.net`) && PathPrefix(`/headscale`)"
|
||||||
|
- "traefik.http.routers.headscale.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.headscale.tls.certresolver=letsencrypt"
|
||||||
|
- "traefik.http.services.headscale.loadbalancer.server.port=8080"
|
||||||
|
- "traefik.http.middlewares.headscale-stripprefix.stripprefix.prefixes=/headscale"
|
||||||
|
- "traefik.http.middlewares.headscale-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||||
|
- "traefik.http.routers.headscale.middlewares=headscale-stripprefix@docker,headscale-headers@docker"
|
||||||
|
# HTTP Configuration for HTTP -> HTTPS redirection
|
||||||
|
- "traefik.http.routers.headscale-http.rule=Host(`bee8333.ddns.net`) && PathPrefix(`/headscale`)"
|
||||||
|
- "traefik.http.routers.headscale-http.entrypoints=web"
|
||||||
|
- "traefik.http.routers.headscale-http.middlewares=https-redirect@docker"
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgres:14
|
image: postgres:14
|
||||||
container_name: gitea-db
|
container_name: gitea-db
|
||||||
|
|||||||
83
ensure-docker-running.ps1
Normal file
83
ensure-docker-running.ps1
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# Script to ensure Docker is running before scheduled backup
|
||||||
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
|
$logFile = Join-Path $scriptDir "backups\docker-status.log"
|
||||||
|
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
||||||
|
|
||||||
|
# Ensure log directory exists
|
||||||
|
$backupDir = Join-Path $scriptDir "backups"
|
||||||
|
if (-not (Test-Path $backupDir)) {
|
||||||
|
New-Item -ItemType Directory -Path $backupDir
|
||||||
|
}
|
||||||
|
|
||||||
|
"[$timestamp] Checking Docker status..." | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Check if Docker Desktop is running
|
||||||
|
$dockerProcess = Get-Process "Docker Desktop" -ErrorAction SilentlyContinue
|
||||||
|
if ($null -eq $dockerProcess) {
|
||||||
|
"[$timestamp] Docker Desktop is not running. Attempting to start..." | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Path to Docker Desktop
|
||||||
|
$dockerPath = "C:\Program Files\Docker\Docker\Docker Desktop.exe"
|
||||||
|
if (Test-Path $dockerPath) {
|
||||||
|
Start-Process $dockerPath
|
||||||
|
"[$timestamp] Started Docker Desktop." | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Wait for Docker to start up (give it 60 seconds)
|
||||||
|
$maxWaitTime = 60
|
||||||
|
$waitTime = 0
|
||||||
|
$dockerRunning = $false
|
||||||
|
|
||||||
|
while (-not $dockerRunning -and $waitTime -lt $maxWaitTime) {
|
||||||
|
Start-Sleep -Seconds 5
|
||||||
|
$waitTime += 5
|
||||||
|
|
||||||
|
try {
|
||||||
|
$dockerStatus = docker info 2>&1
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
$dockerRunning = $true
|
||||||
|
"[$timestamp] Docker is now running after waiting $waitTime seconds." | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# Keep waiting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $dockerRunning) {
|
||||||
|
"[$timestamp] Docker did not start successfully after waiting $maxWaitTime seconds." | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Docker Desktop executable not found at expected location: $dockerPath" | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Docker Desktop is already running." | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if containers are running
|
||||||
|
try {
|
||||||
|
$containersRunning = docker ps 2>&1
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
"[$timestamp] Docker containers status: " | Out-File -Append -FilePath $logFile
|
||||||
|
$runningContainers = docker ps --format "{{.Names}}" 2>&1
|
||||||
|
$runningContainers | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Check specifically for gitea containers
|
||||||
|
$giteaRunning = $runningContainers | Select-String -Pattern "gitea" -Quiet
|
||||||
|
if (-not $giteaRunning) {
|
||||||
|
"[$timestamp] Gitea containers are not running. Starting containers..." | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
# Navigate to gitea-docker directory and start containers
|
||||||
|
Set-Location $scriptDir
|
||||||
|
docker-compose up -d 2>&1 | Out-File -Append -FilePath $logFile
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
"[$timestamp] Successfully started Gitea containers." | Out-File -Append -FilePath $logFile
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Failed to start Gitea containers." | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"[$timestamp] Failed to check running containers. Docker might not be ready yet." | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
"[$timestamp] Error checking Docker containers: $_" | Out-File -Append -FilePath $logFile
|
||||||
|
}
|
||||||
BIN
gitea-dump.zip
Normal file
BIN
gitea-dump.zip
Normal file
Binary file not shown.
@@ -1,37 +1,37 @@
|
|||||||
APP_NAME = BeeBrain
|
APP_NAME = BeeBrain
|
||||||
RUN_MODE = prod
|
RUN_MODE = prod
|
||||||
RUN_USER = git
|
RUN_USER = git
|
||||||
|
|
||||||
[server]
|
[server]
|
||||||
DOMAIN = bee8333.ddns.net
|
DOMAIN = bee8333.ddns.net
|
||||||
SSH_DOMAIN = bee8333.ddns.net
|
SSH_DOMAIN = bee8333.ddns.net
|
||||||
HTTP_PORT = 3000
|
HTTP_PORT = 3000
|
||||||
ROOT_URL = https://bee8333.ddns.net/
|
ROOT_URL = https://bee8333.ddns.net/
|
||||||
DISABLE_SSH = false
|
DISABLE_SSH = false
|
||||||
SSH_PORT = 222
|
SSH_PORT = 222
|
||||||
SSH_LISTEN_PORT = 22
|
SSH_LISTEN_PORT = 22
|
||||||
LFS_START_SERVER = true
|
LFS_START_SERVER = true
|
||||||
PROTOCOL = https
|
PROTOCOL = https
|
||||||
CERT_FILE = /data/gitea/cert.pem
|
CERT_FILE = /data/gitea/cert.pem
|
||||||
KEY_FILE = /data/gitea/key.pem
|
KEY_FILE = /data/gitea/key.pem
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
DB_TYPE = postgres
|
DB_TYPE = postgres
|
||||||
HOST = db:5432
|
HOST = db:5432
|
||||||
NAME = gitea
|
NAME = gitea
|
||||||
USER = gitea
|
USER = gitea
|
||||||
PASSWD = gitea
|
PASSWD = gitea
|
||||||
SSL_MODE = disable
|
SSL_MODE = disable
|
||||||
|
|
||||||
[repository]
|
[repository]
|
||||||
ROOT = /data/git/repositories
|
ROOT = /data/git/repositories
|
||||||
|
|
||||||
[security]
|
[security]
|
||||||
INSTALL_LOCK = true
|
INSTALL_LOCK = true
|
||||||
|
|
||||||
[service]
|
[service]
|
||||||
DISABLE_REGISTRATION = false
|
DISABLE_REGISTRATION = false
|
||||||
REQUIRE_SIGNIN_VIEW = true
|
REQUIRE_SIGNIN_VIEW = true
|
||||||
|
|
||||||
[indexer]
|
[indexer]
|
||||||
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve
|
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve
|
||||||
54
headscale/config/config.yaml
Normal file
54
headscale/config/config.yaml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
server_url: https://bee8333.ddns.net/headscale/
|
||||||
|
listen_addr: 0.0.0.0:8080
|
||||||
|
metrics_listen_addr: 127.0.0.1:9090
|
||||||
|
grpc_listen_addr: 0.0.0.0:50443
|
||||||
|
grpc_allow_insecure: false
|
||||||
|
|
||||||
|
tls_cert_path: ""
|
||||||
|
tls_key_path: ""
|
||||||
|
|
||||||
|
private_key_path: /var/lib/headscale/private.key
|
||||||
|
noise:
|
||||||
|
private_key_path: /var/lib/headscale/noise_private.key
|
||||||
|
|
||||||
|
prefixes:
|
||||||
|
v4: 100.64.0.0/10
|
||||||
|
v6: fd7a:115c:a1e0::/48
|
||||||
|
|
||||||
|
derp:
|
||||||
|
server:
|
||||||
|
enabled: true
|
||||||
|
region_id: 900
|
||||||
|
region_code: "homelab"
|
||||||
|
region_name: "Home Lab"
|
||||||
|
stun_listen_addr: "0.0.0.0:3478"
|
||||||
|
private_key_path: /var/lib/headscale/derp_server_private.key
|
||||||
|
urls:
|
||||||
|
- https://controlplane.tailscale.com/derpmap/default
|
||||||
|
|
||||||
|
disable_check_updates: false
|
||||||
|
ephemeral_node_inactivity_timeout: 30m
|
||||||
|
database:
|
||||||
|
type: sqlite3
|
||||||
|
sqlite:
|
||||||
|
path: /var/lib/headscale/db.sqlite
|
||||||
|
|
||||||
|
log:
|
||||||
|
format: text
|
||||||
|
level: info
|
||||||
|
|
||||||
|
policy:
|
||||||
|
path: ""
|
||||||
|
|
||||||
|
dns:
|
||||||
|
override_local_dns: true
|
||||||
|
nameservers:
|
||||||
|
global:
|
||||||
|
- 1.1.1.1
|
||||||
|
- 8.8.8.8
|
||||||
|
search_domains: []
|
||||||
|
magic_dns: true
|
||||||
|
base_domain: headscale.bee8333.local
|
||||||
|
|
||||||
|
unix_socket: /var/run/headscale/headscale.sock
|
||||||
|
unix_socket_permission: "0770"
|
||||||
36
immich-https.conf
Normal file
36
immich-https.conf
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
upstream immich {
|
||||||
|
server immich_server:2283;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name bee8333.ddns.net;
|
||||||
|
|
||||||
|
# Self-signed SSL certificate (will be generated at startup)
|
||||||
|
ssl_certificate /etc/ssl/certs/immich.crt;
|
||||||
|
ssl_certificate_key /etc/ssl/private/immich.key;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
|
||||||
|
client_max_body_size 50000M;
|
||||||
|
|
||||||
|
# Direct proxy to Immich - NO subpath manipulation
|
||||||
|
location / {
|
||||||
|
proxy_pass http://immich;
|
||||||
|
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 https;
|
||||||
|
|
||||||
|
# WebSocket support for real-time features
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
49
immich-nginx.conf
Normal file
49
immich-nginx.conf
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
upstream immich {
|
||||||
|
server immich_server:2283;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name bee8333.ddns.net;
|
||||||
|
|
||||||
|
client_max_body_size 50000M;
|
||||||
|
|
||||||
|
# Main application - all requests go to Immich
|
||||||
|
location / {
|
||||||
|
proxy_pass http://immich;
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Critical headers for subpath handling
|
||||||
|
proxy_set_header X-Forwarded-Prefix /immich;
|
||||||
|
proxy_set_header X-Script-Name /immich;
|
||||||
|
|
||||||
|
# WebSocket support for real-time features
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
# SPA support - handle client-side routing
|
||||||
|
proxy_intercept_errors on;
|
||||||
|
error_page 404 = @fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fallback for SPA routing
|
||||||
|
location @fallback {
|
||||||
|
proxy_pass http://immich;
|
||||||
|
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-Prefix /immich;
|
||||||
|
proxy_set_header X-Script-Name /immich;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
248
ob.md
248
ob.md
@@ -1,125 +1,125 @@
|
|||||||
# Setting Up Git Access with Gitea and Obsidian
|
# Setting Up Git Access with Gitea and Obsidian
|
||||||
|
|
||||||
## Part 1: Authorizing Git Client Access
|
## Part 1: Authorizing Git Client Access
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- Gitea instance accessible through your domain (bee8333.ddns.net) via HTTPS
|
- Gitea instance accessible through your domain (bee8333.ddns.net) via HTTPS
|
||||||
- Administrative privileges for initial setup
|
- Administrative privileges for initial setup
|
||||||
|
|
||||||
### Repository Setup
|
### Repository Setup
|
||||||
- For new repositories using HTTPS:
|
- For new repositories using HTTPS:
|
||||||
```bash
|
```bash
|
||||||
git clone https://bee8333.ddns.net:3000/username/repository.git
|
git clone https://bee8333.ddns.net:3000/username/repository.git
|
||||||
```
|
```
|
||||||
|
|
||||||
- For new repositories using SSH:
|
- For new repositories using SSH:
|
||||||
```bash
|
```bash
|
||||||
git clone ssh://git@bee8333.ddns.net:222/username/repository.git
|
git clone ssh://git@bee8333.ddns.net:222/username/repository.git
|
||||||
```
|
```
|
||||||
|
|
||||||
- For existing repositories (HTTPS):
|
- For existing repositories (HTTPS):
|
||||||
```bash
|
```bash
|
||||||
git remote set-url origin https://bee8333.ddns.net:3000/username/repository.git
|
git remote set-url origin https://bee8333.ddns.net:3000/username/repository.git
|
||||||
```
|
```
|
||||||
|
|
||||||
- For existing repositories (SSH):
|
- For existing repositories (SSH):
|
||||||
```bash
|
```bash
|
||||||
git remote set-url origin ssh://git@bee8333.ddns.net:222/username/repository.git
|
git remote set-url origin ssh://git@bee8333.ddns.net:222/username/repository.git
|
||||||
```
|
```
|
||||||
|
|
||||||
### Authentication
|
### Authentication
|
||||||
When using HTTPS:
|
When using HTTPS:
|
||||||
1. You'll be prompted for your Gitea username and password
|
1. You'll be prompted for your Gitea username and password
|
||||||
2. For better security, create a Personal Access Token in Gitea:
|
2. For better security, create a Personal Access Token in Gitea:
|
||||||
- Go to Settings → Applications → Generate New Token
|
- Go to Settings → Applications → Generate New Token
|
||||||
- Give it a description
|
- Give it a description
|
||||||
- Copy the token immediately (it won't be shown again)
|
- Copy the token immediately (it won't be shown again)
|
||||||
- Use this token as your password when Git asks for credentials
|
- Use this token as your password when Git asks for credentials
|
||||||
|
|
||||||
When using SSH:
|
When using SSH:
|
||||||
1. Generate an SSH key pair if you haven't already:
|
1. Generate an SSH key pair if you haven't already:
|
||||||
```bash
|
```bash
|
||||||
ssh-keygen -t ed25519 -C "your_email@example.com"
|
ssh-keygen -t ed25519 -C "your_email@example.com"
|
||||||
```
|
```
|
||||||
2. Add your public key to Gitea:
|
2. Add your public key to Gitea:
|
||||||
- Go to Settings → SSH / GPG Keys
|
- Go to Settings → SSH / GPG Keys
|
||||||
- Click "Add Key"
|
- Click "Add Key"
|
||||||
- Paste your public key (from ~/.ssh/id_ed25519.pub)
|
- Paste your public key (from ~/.ssh/id_ed25519.pub)
|
||||||
3. SSH will use your key automatically for authentication
|
3. SSH will use your key automatically for authentication
|
||||||
|
|
||||||
### Important Note
|
### Important Note
|
||||||
When using non-standard HTTPS ports (like 3000):
|
When using non-standard HTTPS ports (like 3000):
|
||||||
1. Use an elevated (Administrator) PowerShell/Command Prompt for Git operations
|
1. Use an elevated (Administrator) PowerShell/Command Prompt for Git operations
|
||||||
2. Regular terminals in VS Code/Cursor may not have sufficient privileges
|
2. Regular terminals in VS Code/Cursor may not have sufficient privileges
|
||||||
3. If Git operations fail, try running your terminal as Administrator
|
3. If Git operations fail, try running your terminal as Administrator
|
||||||
|
|
||||||
## Part 2: Obsidian-Git Integration
|
## Part 2: Obsidian-Git Integration
|
||||||
|
|
||||||
### Plugin Installation
|
### Plugin Installation
|
||||||
1. Open Obsidian Settings → Community plugins
|
1. Open Obsidian Settings → Community plugins
|
||||||
2. Search for "Obsidian Git"
|
2. Search for "Obsidian Git"
|
||||||
3. Install and enable the plugin
|
3. Install and enable the plugin
|
||||||
|
|
||||||
### Plugin Configuration
|
### Plugin Configuration
|
||||||
1. Go to Settings → Community plugins → Obsidian Git
|
1. Go to Settings → Community plugins → Obsidian Git
|
||||||
2. Recommended settings:
|
2. Recommended settings:
|
||||||
- ❌ Auto pull interval (disable when using Syncthing)
|
- ❌ Auto pull interval (disable when using Syncthing)
|
||||||
- ✅ Show status bar
|
- ✅ Show status bar
|
||||||
- ✅ Source Control View
|
- ✅ Source Control View
|
||||||
- ✅ Show changes files count in status bar
|
- ✅ Show changes files count in status bar
|
||||||
- Configure default commit message
|
- Configure default commit message
|
||||||
|
|
||||||
### Essential Commands
|
### Essential Commands
|
||||||
Access these via Command Palette (Ctrl/Cmd + P):
|
Access these via Command Palette (Ctrl/Cmd + P):
|
||||||
- `Open source control view` - View changes and branch info
|
- `Open source control view` - View changes and branch info
|
||||||
- `List changed files` - See modifications
|
- `List changed files` - See modifications
|
||||||
- `View diff` - Check file changes
|
- `View diff` - Check file changes
|
||||||
- `Stage/Unstage current file` - Prepare for commit
|
- `Stage/Unstage current file` - Prepare for commit
|
||||||
- `Commit staged` - Save staged changes
|
- `Commit staged` - Save staged changes
|
||||||
- `Create/Switch branch` - Branch management
|
- `Create/Switch branch` - Branch management
|
||||||
|
|
||||||
### Recommended Workflow
|
### Recommended Workflow
|
||||||
1. Make changes in Obsidian
|
1. Make changes in Obsidian
|
||||||
2. Check Source Control View
|
2. Check Source Control View
|
||||||
3. Stage desired files
|
3. Stage desired files
|
||||||
4. Commit with meaningful message
|
4. Commit with meaningful message
|
||||||
5. Push to Gitea
|
5. Push to Gitea
|
||||||
|
|
||||||
### Status Bar Features
|
### Status Bar Features
|
||||||
- Current branch name
|
- Current branch name
|
||||||
- Number of changed files
|
- Number of changed files
|
||||||
- Sync status indicators
|
- Sync status indicators
|
||||||
|
|
||||||
## Important Configuration
|
## Important Configuration
|
||||||
|
|
||||||
### Gitignore Setup
|
### Gitignore Setup
|
||||||
Add these patterns to `.gitignore`:
|
Add these patterns to `.gitignore`:
|
||||||
```
|
```
|
||||||
.trash/
|
.trash/
|
||||||
.stversions/
|
.stversions/
|
||||||
.obsidian/workspace.json
|
.obsidian/workspace.json
|
||||||
.obsidian/workspace-mobile.json
|
.obsidian/workspace-mobile.json
|
||||||
```
|
```
|
||||||
|
|
||||||
### Security Best Practices
|
### Security Best Practices
|
||||||
- Keep SSH private keys secure
|
- Keep SSH private keys secure
|
||||||
- Use strong SSH key passphrases
|
- Use strong SSH key passphrases
|
||||||
- Regularly review and clean up SSH keys in Gitea
|
- Regularly review and clean up SSH keys in Gitea
|
||||||
- Never share private keys
|
- Never share private keys
|
||||||
|
|
||||||
### Syncthing Compatibility
|
### Syncthing Compatibility
|
||||||
- Wait for Syncthing sync before Git operations
|
- Wait for Syncthing sync before Git operations
|
||||||
- Commit/push before closing Obsidian
|
- Commit/push before closing Obsidian
|
||||||
- Ensure `.stversions` is in `.gitignore`
|
- Ensure `.stversions` is in `.gitignore`
|
||||||
|
|
||||||
### Performance Tips
|
### Performance Tips
|
||||||
- Stage files individually
|
- Stage files individually
|
||||||
- Use branches for major changes
|
- Use branches for major changes
|
||||||
- Commit regularly, push selectively
|
- Commit regularly, push selectively
|
||||||
- Monitor Source Control View
|
- Monitor Source Control View
|
||||||
|
|
||||||
## Collaboration Guidelines
|
## Collaboration Guidelines
|
||||||
- Pull before making changes
|
- Pull before making changes
|
||||||
- Use branches for significant changes
|
- Use branches for significant changes
|
||||||
- Check diff view for conflicts
|
- Check diff view for conflicts
|
||||||
- Let Syncthing sync complete before Git operations
|
- Let Syncthing sync complete before Git operations
|
||||||
@@ -1,67 +1,67 @@
|
|||||||
# Gitea Database Restore Script
|
# Gitea Database Restore Script
|
||||||
param (
|
param (
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
[string]$BackupFile
|
[string]$BackupFile
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if backup file exists
|
# Check if backup file exists
|
||||||
if (-not (Test-Path $BackupFile)) {
|
if (-not (Test-Path $BackupFile)) {
|
||||||
Write-Host "Backup file not found: $BackupFile" -ForegroundColor Red
|
Write-Host "Backup file not found: $BackupFile" -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Extract the backup if it's a zip file
|
# Extract the backup if it's a zip file
|
||||||
$tempFile = $null
|
$tempFile = $null
|
||||||
if ($BackupFile.EndsWith(".zip")) {
|
if ($BackupFile.EndsWith(".zip")) {
|
||||||
$tempDir = [System.IO.Path]::GetTempPath()
|
$tempDir = [System.IO.Path]::GetTempPath()
|
||||||
$tempFile = Join-Path $tempDir "gitea-db-restore-temp.sql"
|
$tempFile = Join-Path $tempDir "gitea-db-restore-temp.sql"
|
||||||
|
|
||||||
Write-Host "Extracting backup file..."
|
Write-Host "Extracting backup file..."
|
||||||
Expand-Archive -Path $BackupFile -DestinationPath $tempDir -Force
|
Expand-Archive -Path $BackupFile -DestinationPath $tempDir -Force
|
||||||
$extractedFile = Get-ChildItem -Path $tempDir -Filter "*.sql" | Select-Object -First 1
|
$extractedFile = Get-ChildItem -Path $tempDir -Filter "*.sql" | Select-Object -First 1
|
||||||
|
|
||||||
if ($extractedFile) {
|
if ($extractedFile) {
|
||||||
Copy-Item $extractedFile.FullName -Destination $tempFile
|
Copy-Item $extractedFile.FullName -Destination $tempFile
|
||||||
$BackupFile = $tempFile
|
$BackupFile = $tempFile
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Failed to extract SQL file from backup" -ForegroundColor Red
|
Write-Host "Failed to extract SQL file from backup" -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Confirm before proceeding
|
# Confirm before proceeding
|
||||||
Write-Host "WARNING: This will overwrite the current database with the backup." -ForegroundColor Yellow
|
Write-Host "WARNING: This will overwrite the current database with the backup." -ForegroundColor Yellow
|
||||||
Write-Host "Make sure your Gitea service is stopped before proceeding." -ForegroundColor Yellow
|
Write-Host "Make sure your Gitea service is stopped before proceeding." -ForegroundColor Yellow
|
||||||
$confirmation = Read-Host "Do you want to continue? (y/n)"
|
$confirmation = Read-Host "Do you want to continue? (y/n)"
|
||||||
|
|
||||||
if ($confirmation -ne "y") {
|
if ($confirmation -ne "y") {
|
||||||
Write-Host "Restore cancelled."
|
Write-Host "Restore cancelled."
|
||||||
if ($tempFile -and (Test-Path $tempFile)) {
|
if ($tempFile -and (Test-Path $tempFile)) {
|
||||||
Remove-Item $tempFile
|
Remove-Item $tempFile
|
||||||
}
|
}
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Stop Gitea services
|
# Stop Gitea services
|
||||||
Write-Host "Stopping Gitea services..."
|
Write-Host "Stopping Gitea services..."
|
||||||
docker-compose stop
|
docker-compose stop
|
||||||
|
|
||||||
# Restore the database
|
# Restore the database
|
||||||
Write-Host "Restoring database from backup..."
|
Write-Host "Restoring database from backup..."
|
||||||
Get-Content $BackupFile | docker exec -i gitea-db psql -U gitea -d gitea
|
Get-Content $BackupFile | docker exec -i gitea-db psql -U gitea -d gitea
|
||||||
|
|
||||||
# Check restore status
|
# Check restore status
|
||||||
if ($LASTEXITCODE -eq 0) {
|
if ($LASTEXITCODE -eq 0) {
|
||||||
Write-Host "Database restore completed successfully!" -ForegroundColor Green
|
Write-Host "Database restore completed successfully!" -ForegroundColor Green
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Database restore failed!" -ForegroundColor Red
|
Write-Host "Database restore failed!" -ForegroundColor Red
|
||||||
}
|
}
|
||||||
|
|
||||||
# Clean up temp file if created
|
# Clean up temp file if created
|
||||||
if ($tempFile -and (Test-Path $tempFile)) {
|
if ($tempFile -and (Test-Path $tempFile)) {
|
||||||
Remove-Item $tempFile
|
Remove-Item $tempFile
|
||||||
}
|
}
|
||||||
|
|
||||||
# Restart Gitea services
|
# Restart Gitea services
|
||||||
Write-Host "Starting Gitea services..."
|
Write-Host "Starting Gitea services..."
|
||||||
docker-compose start
|
docker-compose start
|
||||||
@@ -1,88 +1,88 @@
|
|||||||
# Script to restore the Postgres Docker volume from a backup
|
# Script to restore the Postgres Docker volume from a backup
|
||||||
param (
|
param (
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
[string]$BackupFile
|
[string]$BackupFile
|
||||||
)
|
)
|
||||||
|
|
||||||
$volumeName = "gitea-docker_postgres-data"
|
$volumeName = "gitea-docker_postgres-data"
|
||||||
$tempDir = Join-Path $env:TEMP "postgres-volume-restore"
|
$tempDir = Join-Path $env:TEMP "postgres-volume-restore"
|
||||||
|
|
||||||
# Check if backup file exists
|
# Check if backup file exists
|
||||||
if (-not (Test-Path $BackupFile)) {
|
if (-not (Test-Path $BackupFile)) {
|
||||||
Write-Host "Backup file not found: $BackupFile" -ForegroundColor Red
|
Write-Host "Backup file not found: $BackupFile" -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Extract the backup if it's a zip file
|
# Extract the backup if it's a zip file
|
||||||
$tarFile = $BackupFile
|
$tarFile = $BackupFile
|
||||||
if ($BackupFile.EndsWith(".zip")) {
|
if ($BackupFile.EndsWith(".zip")) {
|
||||||
# Create temp directory if it doesn't exist
|
# Create temp directory if it doesn't exist
|
||||||
if (-not (Test-Path $tempDir)) {
|
if (-not (Test-Path $tempDir)) {
|
||||||
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
|
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
|
||||||
} else {
|
} else {
|
||||||
# Clean temp directory
|
# Clean temp directory
|
||||||
Remove-Item -Path "$tempDir\*" -Force -Recurse -ErrorAction SilentlyContinue
|
Remove-Item -Path "$tempDir\*" -Force -Recurse -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Extracting backup file..."
|
Write-Host "Extracting backup file..."
|
||||||
Expand-Archive -Path $BackupFile -DestinationPath $tempDir -Force
|
Expand-Archive -Path $BackupFile -DestinationPath $tempDir -Force
|
||||||
$extractedFile = Get-ChildItem -Path $tempDir -Filter "*.tar" | Select-Object -First 1
|
$extractedFile = Get-ChildItem -Path $tempDir -Filter "*.tar" | Select-Object -First 1
|
||||||
|
|
||||||
if ($extractedFile) {
|
if ($extractedFile) {
|
||||||
$tarFile = $extractedFile.FullName
|
$tarFile = $extractedFile.FullName
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Failed to extract TAR file from backup" -ForegroundColor Red
|
Write-Host "Failed to extract TAR file from backup" -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Confirm before proceeding
|
# Confirm before proceeding
|
||||||
Write-Host "WARNING: This will overwrite the current database volume with the backup." -ForegroundColor Yellow
|
Write-Host "WARNING: This will overwrite the current database volume with the backup." -ForegroundColor Yellow
|
||||||
Write-Host "Make sure your Gitea services are stopped before proceeding." -ForegroundColor Yellow
|
Write-Host "Make sure your Gitea services are stopped before proceeding." -ForegroundColor Yellow
|
||||||
$confirmation = Read-Host "Do you want to continue? (y/n)"
|
$confirmation = Read-Host "Do you want to continue? (y/n)"
|
||||||
|
|
||||||
if ($confirmation -ne "y") {
|
if ($confirmation -ne "y") {
|
||||||
Write-Host "Restore cancelled."
|
Write-Host "Restore cancelled."
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Stop Gitea services
|
# Stop Gitea services
|
||||||
Write-Host "Stopping Gitea services..."
|
Write-Host "Stopping Gitea services..."
|
||||||
docker-compose down
|
docker-compose down
|
||||||
|
|
||||||
# Check if volume exists and remove it
|
# Check if volume exists and remove it
|
||||||
$volumeExists = docker volume ls --format "{{.Name}}" | Select-String -Pattern "^$volumeName$"
|
$volumeExists = docker volume ls --format "{{.Name}}" | Select-String -Pattern "^$volumeName$"
|
||||||
if ($volumeExists) {
|
if ($volumeExists) {
|
||||||
Write-Host "Removing existing volume $volumeName..."
|
Write-Host "Removing existing volume $volumeName..."
|
||||||
docker volume rm $volumeName
|
docker volume rm $volumeName
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-Host "Failed to remove existing volume. It might be in use by another container." -ForegroundColor Red
|
Write-Host "Failed to remove existing volume. It might be in use by another container." -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create a new volume
|
# Create a new volume
|
||||||
Write-Host "Creating new volume $volumeName..."
|
Write-Host "Creating new volume $volumeName..."
|
||||||
docker volume create $volumeName
|
docker volume create $volumeName
|
||||||
|
|
||||||
# Restore from backup
|
# Restore from backup
|
||||||
Write-Host "Restoring volume from backup..."
|
Write-Host "Restoring volume from backup..."
|
||||||
docker run --rm -v ${volumeName}:/volume -v ${tarFile}:/backup.tar alpine sh -c "cd /volume && tar -xf /backup.tar"
|
docker run --rm -v ${volumeName}:/volume -v ${tarFile}:/backup.tar alpine sh -c "cd /volume && tar -xf /backup.tar"
|
||||||
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
if ($LASTEXITCODE -eq 0) {
|
||||||
Write-Host "Volume restore completed successfully!" -ForegroundColor Green
|
Write-Host "Volume restore completed successfully!" -ForegroundColor Green
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Volume restore failed!" -ForegroundColor Red
|
Write-Host "Volume restore failed!" -ForegroundColor Red
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Clean up temp directory if created
|
# Clean up temp directory if created
|
||||||
if ($BackupFile.EndsWith(".zip") -and (Test-Path $tempDir)) {
|
if ($BackupFile.EndsWith(".zip") -and (Test-Path $tempDir)) {
|
||||||
Remove-Item -Path $tempDir -Force -Recurse -ErrorAction SilentlyContinue
|
Remove-Item -Path $tempDir -Force -Recurse -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
# Start Gitea services
|
# Start Gitea services
|
||||||
Write-Host "Starting Gitea services..."
|
Write-Host "Starting Gitea services..."
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
|
|
||||||
Write-Host "Restore process completed. Check if your Gitea instance is working properly." -ForegroundColor Green
|
Write-Host "Restore process completed. Check if your Gitea instance is working properly." -ForegroundColor Green
|
||||||
17
run-backup.ps1
Normal file
17
run-backup.ps1
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# This script is automatically generated - do not edit manually
|
||||||
|
# It runs the Docker check script followed by database and volume backup scripts
|
||||||
|
|
||||||
|
# Get the script directory
|
||||||
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
|
|
||||||
|
# Run the Docker check script first
|
||||||
|
$dockerCheckScript = Join-Path $scriptDir "ensure-docker-running.ps1"
|
||||||
|
& $dockerCheckScript
|
||||||
|
|
||||||
|
# Then run the database backup script
|
||||||
|
$dbBackupScript = Join-Path $scriptDir "backup-gitea-db.ps1"
|
||||||
|
& $dbBackupScript
|
||||||
|
|
||||||
|
# Finally run the volume backup script
|
||||||
|
$volumeBackupScript = Join-Path $scriptDir "backup-volume.ps1"
|
||||||
|
& $volumeBackupScript
|
||||||
@@ -1,41 +1,67 @@
|
|||||||
# Script to create a scheduled task for Gitea database backups
|
# Script to create a scheduled task for Gitea database backups
|
||||||
$scriptPath = Join-Path (Get-Location) "backup-gitea-db.ps1"
|
$workingDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
$taskName = "GiteaDatabaseBackup"
|
$scriptPath = Join-Path $workingDir "backup-gitea-db.ps1"
|
||||||
$taskDescription = "Regular backup of Gitea PostgreSQL database"
|
$dockerCheckScript = Join-Path $workingDir "ensure-docker-running.ps1"
|
||||||
|
$taskName = "GiteaDatabaseBackup"
|
||||||
# Check if the backup script exists
|
$taskDescription = "Regular backup of Gitea PostgreSQL database"
|
||||||
if (-not (Test-Path $scriptPath)) {
|
|
||||||
Write-Host "Backup script not found at: $scriptPath" -ForegroundColor Red
|
# Check if the backup script exists
|
||||||
exit 1
|
if (-not (Test-Path $scriptPath)) {
|
||||||
}
|
Write-Host "Backup script not found at: $scriptPath" -ForegroundColor Red
|
||||||
|
exit 1
|
||||||
# Create a scheduled task to run daily at 3 AM
|
}
|
||||||
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`""
|
|
||||||
$trigger = New-ScheduledTaskTrigger -Daily -At 3AM
|
# Check if the Docker check script exists
|
||||||
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
|
if (-not (Test-Path $dockerCheckScript)) {
|
||||||
|
Write-Host "Docker check script not found at: $dockerCheckScript" -ForegroundColor Red
|
||||||
# Create a principal that runs with highest privileges
|
exit 1
|
||||||
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
|
}
|
||||||
|
|
||||||
# Register the scheduled task
|
# Create a batch script that runs both scripts
|
||||||
$taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
|
$batchScriptPath = Join-Path $workingDir "run-backup.ps1"
|
||||||
|
@"
|
||||||
if ($taskExists) {
|
# This script is automatically generated - do not edit manually
|
||||||
Write-Host "Task '$taskName' already exists. Updating..." -ForegroundColor Yellow
|
# It runs the Docker check script followed by the backup script
|
||||||
# Get the existing task
|
|
||||||
$task = Get-ScheduledTask -TaskName $taskName
|
# Get the script directory
|
||||||
# Update the task properties
|
`$scriptDir = Split-Path -Parent `$MyInvocation.MyCommand.Path
|
||||||
$task.Actions = $action
|
|
||||||
$task.Triggers = $trigger
|
# Run the Docker check script first
|
||||||
$task.Settings = $settings
|
`$dockerCheckScript = Join-Path `$scriptDir "ensure-docker-running.ps1"
|
||||||
$task.Principal = $principal
|
& `$dockerCheckScript
|
||||||
$task.Description = $taskDescription
|
|
||||||
# Save the updated task
|
# Then run the backup script
|
||||||
Set-ScheduledTask -InputObject $task
|
`$backupScript = Join-Path `$scriptDir "backup-gitea-db.ps1"
|
||||||
} else {
|
& `$backupScript
|
||||||
Write-Host "Creating new scheduled task '$taskName'..." -ForegroundColor Green
|
"@ | Out-File -FilePath $batchScriptPath -Encoding utf8
|
||||||
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Description $taskDescription -Principal $principal
|
|
||||||
}
|
# Create a scheduled task to run daily at 3 AM
|
||||||
|
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$batchScriptPath`"" -WorkingDirectory "$workingDir"
|
||||||
Write-Host "Scheduled task setup complete. The database will be backed up daily at 3 AM." -ForegroundColor Green
|
$trigger = New-ScheduledTaskTrigger -Daily -At 3AM
|
||||||
|
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
|
||||||
|
|
||||||
|
# Create a principal that runs with highest privileges
|
||||||
|
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
|
||||||
|
|
||||||
|
# Register the scheduled task
|
||||||
|
$taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
if ($taskExists) {
|
||||||
|
Write-Host "Task '$taskName' already exists. Updating..." -ForegroundColor Yellow
|
||||||
|
# Get the existing task
|
||||||
|
$task = Get-ScheduledTask -TaskName $taskName
|
||||||
|
# Update the task properties
|
||||||
|
$task.Actions = $action
|
||||||
|
$task.Triggers = $trigger
|
||||||
|
$task.Settings = $settings
|
||||||
|
$task.Principal = $principal
|
||||||
|
$task.Description = $taskDescription
|
||||||
|
# Save the updated task
|
||||||
|
Set-ScheduledTask -InputObject $task
|
||||||
|
} else {
|
||||||
|
Write-Host "Creating new scheduled task '$taskName'..." -ForegroundColor Green
|
||||||
|
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Description $taskDescription -Principal $principal
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Scheduled task setup complete. The database will be backed up daily at 3 AM." -ForegroundColor Green
|
||||||
Write-Host "Backup files will be stored in the 'backups' folder in your Gitea Docker directory." -ForegroundColor Green
|
Write-Host "Backup files will be stored in the 'backups' folder in your Gitea Docker directory." -ForegroundColor Green
|
||||||
Reference in New Issue
Block a user