5 Commits
v0.1 ... v0.1.2

Author SHA1 Message Date
pigwin
fb4862c078 v0.1.2 2024-12-30 21:49:22 +00:00
pigwin
f3dbd4505f md documentation so i dont forget imedietly 2024-12-30 21:35:19 +00:00
pigwin
2462c6057e log more 2024-12-30 21:16:45 +00:00
pigwin
cda95aa4f2 v0.1.1 2024-12-30 21:03:41 +00:00
pigwin
b7e448df8d v0.1 2024-12-29 19:55:27 +01:00
4 changed files with 162 additions and 28 deletions

View File

@@ -26,26 +26,32 @@ jobs:
id: timestamp id: timestamp
run: echo "TIMESTAMP=$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV run: echo "TIMESTAMP=$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV
- name: Get the commit tag - name: Get commit version
id: get-tag id: commit-version
run: echo "GIT_TAG=$(git describe --tags --exact-match 2>/dev/null || echo 'no-tag')" >> $GITHUB_ENV run: |
COMMIT_MSG=$(git log -1 --pretty=%B)
echo "Commit message: $COMMIT_MSG" # Debugging output
# Updated regex to handle both vX.Y, vX.Y.Z, and vX.Y-pre-release formats
if [[ "$COMMIT_MSG" =~ ^v[0-9]+\.[0-9]+(\.[0-9]+)?(-[a-zA-Z0-9._-]+)?$ ]]; then
echo "Version match: $COMMIT_MSG"
echo "VERSION=${COMMIT_MSG}" >> $GITHUB_ENV
else
echo "No version match, defaulting to 'dev'"
echo "VERSION=dev" >> $GITHUB_ENV
fi
- name: Build Docker image - name: Build Docker image
run: | run: |
if [ "${{ env.GIT_TAG }}" == "no-tag" ]; then docker build -t ti1:${{ env.VERSION }} .
docker build -t ti1:dev-${{ env.TIMESTAMP }} .
else
docker build -t ti1:latest -t ti1:${{ env.GIT_TAG }} .
fi
- name: Push Docker image - name: Push Docker image
run: | run: |
if [ "${{ env.GIT_TAG }}" == "no-tag" ]; then # Always push to 'dev' tag
docker tag ti1:dev-${{ env.TIMESTAMP }} ${{ secrets.DOCKER_USERNAME }}/ti1:dev-${{ env.TIMESTAMP }} docker tag ti1:${{ env.VERSION }} ${{ secrets.DOCKER_USERNAME }}/ti1:dev
docker push ${{ secrets.DOCKER_USERNAME }}/ti1:dev-${{ env.TIMESTAMP }} docker push ${{ secrets.DOCKER_USERNAME }}/ti1:dev
else
docker tag ti1:latest ${{ secrets.DOCKER_USERNAME }}/ti1:latest # If the version is valid, also push that specific version tag
docker tag ti1:${{ env.GIT_TAG }} ${{ secrets.DOCKER_USERNAME }}/ti1:${{ env.GIT_TAG }} if [[ "${{ env.VERSION }}" != "dev" ]]; then
docker push ${{ secrets.DOCKER_USERNAME }}/ti1:latest docker tag ti1:${{ env.VERSION }} ${{ secrets.DOCKER_USERNAME }}/ti1:${{ env.VERSION }}
docker push ${{ secrets.DOCKER_USERNAME }}/ti1:${{ env.GIT_TAG }} docker push ${{ secrets.DOCKER_USERNAME }}/ti1:${{ env.VERSION }}
fi fi

138
README.md
View File

@@ -4,19 +4,141 @@ The best thing to happen since yesterday at 3 pm
## Usage ## Usage
To use this project, you can pull the Docker image from Docker Hub and run it using the following commands: Start with getting Docker then do the following:
### Pull the Docker Image ### Create the setup files
Create a `docker-compose.yml`
```yaml
services:
db:
image: postgres:17.2
container_name: postgres-db
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Root Password
POSTGRES_DB: ti1
ports:
- "5432:5432"
volumes:
- ./postgres_data:/var/lib/postgresql/data # Store data in the current directory
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- app-network
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres", "-d", "ti1", "-h", "db"]
interval: 10s
retries: 5
restart: always # Ensure the container always restarts
```sh ti1-container:
docker pull pigwin1/ti1:latest image: pigwin1/ti1:v0.1.1
container_name: ti1-container
environment:
DB_HOST: db
DB_PORT: 5432
DB_USER: ti1
DB_PASSWORD: ti1 password
DB_NAME: ti1
DB_SSLMODE: disable
depends_on:
db:
condition: service_healthy # Wait until the db service is healthy
networks:
- app-network
restart: always # Ensure the container always restarts
networks:
app-network:
driver: bridge
volumes:
postgres_data:
driver: local
``` ```
### Run the Docker Container Create `init.sql`
```sh ```sql
docker run -d --name ti1-container -e DB_HOST=<your_db_host> -e DB_PORT=<your_db_port> -e DB_USER=<your_db_user> -e DB_PASSWORD=<your_db_password> -e DB_NAME=<your_db_name> -e DB_SSLMODE=<your_db_sslmode> pigwin1/ti1:latest -- Check if 'post' user exists; create if not
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'post') THEN
CREATE ROLE post WITH LOGIN PASSWORD 'post password';
GRANT ALL PRIVILEGES ON DATABASE ti1 TO post;
ALTER ROLE post WITH SUPERUSER;
END IF;
END
$$;
-- Check if 'ti1' user exists; create if not
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'ti1') THEN
CREATE ROLE ti1 WITH LOGIN PASSWORD 'ti1 password';
GRANT ALL PRIVILEGES ON DATABASE ti1 TO ti1;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ti1;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ti1;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO ti1;
-- Grant the ti1 user the necessary permissions on the public schema
GRANT USAGE, CREATE ON SCHEMA public TO ti1;
-- Grant all permissions (SELECT, INSERT, UPDATE, DELETE, etc.) on all existing tables in the public schema
GRANT ALL ON ALL TABLES IN SCHEMA public TO ti1;
-- Grant all permissions on all existing sequences in the public schema
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO ti1;
-- Grant all permissions on all functions in the public schema
GRANT ALL ON ALL FUNCTIONS IN SCHEMA public TO ti1;
-- Ensure that the ti1 user will have access to new tables, sequences, and functions created in the public schema
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ti1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ti1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO ti1;
-- Optionally, grant full permissions on the entire database to ti1 (if needed)
-- GRANT ALL PRIVILEGES ON DATABASE ti1 TO ti1;
END IF;
END
$$;
```
Remember to change the password values
### Run the Docker Containers
```sh
docker compose up -d
```
### edit the postgress config (optinal)
open the config file
```sh
nano postgres_data/postgresql.conf
```
Change the following values
```conf
listen_addresses = '*'
max_connections = 100
shared_buffers = 16GB
work_mem = 256MB
maintenance_work_mem = 2GB
dynamic_shared_memory_type = posix
max_wal_size = 1GB
min_wal_size = 80MB
```
set these to what makes most sense for you
These values should also be set bet not necessarily changed
```conf
log_timezone = 'Etc/UTC'
datestyle = 'iso, mdy'
timezone = 'Etc/UTC'
lc_messages = 'en_US.utf8'
lc_monetary = 'en_US.utf8'
lc_numeric = 'en_US.utf8'
lc_time = 'en_US.utf8'
default_text_search_config = 'pg_catalog.english'
``` ```
Replace `<your_db_host>`, `<your_db_port>`, `<your_db_user>`, `<your_db_password>`, `<your_db_name>`, and `<your_db_sslmode>` with your actual database configuration values.
### Docker Hub Repository ### Docker Hub Repository
You can find the Docker image on Docker Hub at the following link: You can find the Docker image on Docker Hub at the following link:

View File

@@ -125,10 +125,12 @@ type Data struct {
} `xml:"ServiceDelivery"` } `xml:"ServiceDelivery"`
} }
func FetchData() (*Data, error) { func FetchData(timestamp string) (*Data, error) {
client := &http.Client{} client := &http.Client{}
requestorId := "ti1-" + timestamp
resp, err := client.Get("https://api.entur.io/realtime/v1/rest/et?useOriginalId=true&maxSize=100000") url := "https://api.entur.io/realtime/v1/rest/et?useOriginalId=true&maxSize=100000&requestorId=" + requestorId
resp, err := client.Get(url)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -17,10 +17,14 @@ func main() {
log.Fatalf("Database setup failed: %v", err) log.Fatalf("Database setup failed: %v", err)
} }
// Get the current timestamp
starttimestamp := time.Now().Format("20060102T150405")
log.Printf("Starting timestamp: %s", starttimestamp)
for { for {
start := time.Now() start := time.Now()
data, err := data.FetchData() data, err := data.FetchData(starttimestamp)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -31,7 +35,7 @@ func main() {
elapsed := time.Since(start) elapsed := time.Since(start)
if elapsed < 5*time.Minute { if elapsed < 5*time.Minute {
log.Printf("starting again in %v", 5*time.Minute-elapsed) log.Printf("starting again in %v", 5*time.Minute-elapsed)
time.Sleep(1*time.Minute - elapsed) time.Sleep(5*time.Minute - elapsed)
} }
} }
} }